You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aggregation-platform/src/com/platform/service/OracleStatusService.java

202 lines
6.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.platform.service;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.ReplicationController;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import com.platform.entities.OracleConnectorParams;
import com.platform.kubernetes.SimpleKubeClient;
import com.platform.oracle.OracleConnector;
import com.platform.utils.Configs;
import com.platform.utils.Constant;
/**
* 计时 尝试连接oracle的时间超过10分钟判断失败
*
* @author chen
*
*/
public class OracleStatusService {
private static Map<String, Timer> alliveTask = new Hashtable<String, Timer>();
public final static int EXEC_TIME = 9;// 连接多少次后不成功,取消链接
public final static long INTERVAL_TIME = 60 * 1000;// 每隔多少毫秒执行一次连接任务
public final static long DELAY_TIME = 30 * 1000; // 延迟多少秒后执行
public void connectToOracle(String replicasName) {
SimpleKubeClient sKubeClient = new SimpleKubeClient();
if (alliveTask.containsKey(replicasName)) {
killAlliveTask(replicasName);
}
OracleConnectorParams orp = new OracleConnectorParams();
Timer timer = new Timer();
alliveTask.put(replicasName, timer);
timer.schedule(new connectTask(replicasName, orp, sKubeClient),
DELAY_TIME, INTERVAL_TIME);
}
public void cancelToOracle(String replicasName, String operate) {
if (operate.equals("stop")) {
String cmd = "kubectl label --overwrite rc " + replicasName + " status=0";
List<String> rList = Constant.ganymedSSH
.execCmdWaitAcquiescent(cmd);
StringBuffer sb = new StringBuffer();
for (String str : rList)
sb.append(str).append("\n");
Configs.CONSOLE_LOGGER.info(sb.toString());
// SimpleKubeClient sKubeClient = new SimpleKubeClient();
// sKubeClient.updateOrAddReplicasLabelById(replicasName,
// "status","0");
}
killAlliveTask(replicasName);
}
/**
* 取消并移除指定定时任务
*
*
* @param taskName
*/
public void killAlliveTask(String taskName) {
if (alliveTask.containsKey(taskName)) {
alliveTask.get(taskName).cancel();
alliveTask.remove(taskName);
}
}
public void killAlliveTasks(String... tasksName) {
for (String taskName : tasksName)
killAlliveTask(taskName);
}
/**
* 清空定时任务
*/
public void cleanUpAlliveTask() {
Iterator<Map.Entry<String, Timer>> iterator = alliveTask.entrySet()
.iterator();
while (iterator.hasNext()) {
Map.Entry<String, Timer> entry = iterator.next();
entry.getValue().cancel();
}
alliveTask.clear();
}
/**
* 链接oracle任务类
*
* @author wuming
*
*/
class connectTask extends TimerTask {
private String taskName;
private int count;
private OracleConnectorParams ocp;
private SimpleKubeClient client;
public connectTask(String taskName, OracleConnectorParams ocp,
SimpleKubeClient client) {
this.taskName = taskName;
this.ocp = ocp;
this.count = 0;
this.client = client;
}
public connectTask(OracleConnectorParams ocp, SimpleKubeClient client) {
this.taskName = ocp.getName();
this.ocp = ocp;
this.count = 0;
this.client = client;
}
@Override
public void run() {
if (count == EXEC_TIME && alliveTask.containsKey(taskName)) { // 如果任务已经执行10次则任务oracle启动失败并取消oracle连接
killAlliveTask(taskName);
// client.updateOrAddReplicasLabelById(taskName, "status", "1");
// //更新ReplicationController标签将oracle状态标示未1(0:启动中1失败2成功)
String cmd = "kubectl label --overwrite rc " + taskName + " status=1";
List<String> rList = Constant.ganymedSSH
.execCmdWaitAcquiescent(cmd);
StringBuffer sb = new StringBuffer();
for (String str : rList)
sb.append(str).append("\n");
Configs.CONSOLE_LOGGER.info("更新replicationController标签 "
+ taskName + "\t[标签更新为: 失败]");
} else { // 否则执行连接oracle任务判断oracle是否启动成功
Pod pod = filterPod();
if (pod != null) {
String ip = client.getPodHostIp(pod);
int port = client.getPodContainerport(pod);
if (ip != null && port != 0) {
String url = "jdbc:oracle:thin:@" + ip + ":" + port
+ ":" + ocp.getDatabaseName();
boolean flag = OracleConnector.canConnect(url, // 连接结果返回参数true标示连接成功false标示连接失败
ocp.getUser(), ocp.getPassword());
Configs.CONSOLE_LOGGER.info("url:" + url + ",user:"
+ ocp.getUser() + ",password:"
+ ocp.getPassword());
String message = "失败";
if (flag && alliveTask.containsKey(taskName)) {
String cmd = "kubectl label --overwrite rc " + taskName
+ " status=2";
// client.updateOrAddReplicasLabelById(taskNSyame,
// "status", "2");
List<String> rList = Constant.ganymedSSH
.execCmdWaitAcquiescent(cmd);
StringBuffer sb = new StringBuffer();
for (String str : rList)
sb.append(str).append("\n");
Configs.CONSOLE_LOGGER.info(sb.toString());
message = "成功";
killAlliveTask(taskName); // 连接成功,取消连接
Configs.CONSOLE_LOGGER
.info("更新replicationController标签 "
+ taskName + "\t[标签更新为: 成功]");
}
Configs.CONSOLE_LOGGER.info("连接到数据库服务: " + taskName
+ "\t[连接结果: " + message + "]");
}
}
}
count++;
}
/**
* 获取oracle的连接ip地址和端口号
*
* @return
*/
private Pod filterPod() {
Pod pod = null;
ReplicationController replicationController = client
.getReplicationController(taskName);
if (null != replicationController) {
List<Pod> filterPods = client
.getPodsForApplicaList(replicationController);
if (filterPods != null && filterPods.size() > 0) {
pod = filterPods.get(0);
}
}
return pod;
}
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
public int getCount() {
return count;
}
}
}