This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nms-nmsserver/src/com/nms/server/service/UpgradeService.java

3595 lines
175 KiB
Java
Raw Normal View History

2018-09-27 16:17:06 +08:00
package com.nms.server.service;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.nms.server.bean.EmailInfo;
import com.nms.server.bean.LoopMissionRoundInfo;
import com.nms.server.bean.MissionResult;
import com.nms.server.bean.MissionResult2;
import com.nms.server.bean.MissionStateTable;
import com.nms.server.bean.ServerIpSegment;
2018-09-27 16:17:06 +08:00
import com.nms.server.bean.Task1;
import com.nms.server.bean.Task4;
import com.nms.server.bean.Task6;
import com.nms.server.common.Common;
import com.nms.server.common.Constants;
import com.nms.server.common.EmailTypeConstants;
import com.nms.server.common.MissionConstants;
import com.nms.server.dao.CommonDao;
import com.nms.server.thread.mission.NMSClientTask4Cancel;
import com.nms.server.util.BoneCPPool;
import com.nms.server.util.DateUtil;
import com.nms.server.util.MD5Util;
import com.nms.server.util.socket.SocketUtils;
import com.socket.utils.FileComment;
public class UpgradeService extends CommonService{
private final Logger logger = Logger.getLogger(UpgradeService.class);
private final SimpleDateFormat format = new SimpleDateFormat(Constants.COMMON_DATE_FORMAT); //Java Date 类型数据格式化格式
// private CommonDao dao = null;
public UpgradeService(CommonDao dao){
super(dao);
// this.dao = dao;
}
/**
* 获取新任务信息加载到 任务执行操作中
* @time Mar 23, 2012-3:28:41 PM
* @param missionId 为空时不指定missionId查询
* @return
*/
public ArrayList<MissionStateTable> getNewMessionList(Long missionId){
//-- 查询可执行的任务
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_id,");
searchSQL.append("mst.mission_type,");
searchSQL.append("mst.mission_state,");
searchSQL.append("mst.system_id,");
searchSQL.append("mst.group_id,");
searchSQL.append("to_char(mst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(mst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time,");
searchSQL.append("mst.is_loop,");
searchSQL.append("mst.loop_delay ");
searchSQL.append("from mission_state_table mst ");
searchSQL.append("where 1=1 ");
//2012-03-20 取消任务时间过滤,将对所有任务进行处理
// searchSQL.append("and (mst.end_time>sysdate or mst.end_time is null) ");// 周期任务(未过时) or 非周期任务
if (missionId!=null && missionId.longValue() !=0l) {
searchSQL.append("and mst.mission_id = '"+missionId.longValue()+"' ");
}
searchSQL.append("and mst.mission_state in (1,5) "); //以创建任务 准备撤销任务 均作为新任务周期性载入
2018-09-27 16:17:06 +08:00
searchSQL.append("order by mst.create_time,mst.mission_id asc ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_type");
fields.add("mission_state");
fields.add("system_id");
fields.add("group_id");
fields.add("start_time");
fields.add("end_time");
fields.add("is_loop");
fields.add("loop_delay");
ArrayList<Map<String, String>> rs = null;
ArrayList<MissionStateTable> mstList = new ArrayList<MissionStateTable>();
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!=null && rs.size()>0){
Long serverId = Common.getServerTable().getId();
boolean missionSingle = Constants.MISSION_SINGLE.equals("1") ? true : false;
logger.info("开始加载新任务...过滤当前dc范围内的任务" + (missionSingle ? "" : ""));
//获取当前dc范围
List<ServerIpSegment> ipSegList = Common.getServerTable().getIpSegList();
2018-09-27 16:17:06 +08:00
for(Map<String, String> maps : rs){
//是否加载任务
boolean flag = false;
//第一步判断是否过滤dc范围外节点
if (missionSingle) {
logger.info("当前dc的server_id:" + serverId);
//第二步获取每个任务下发的所有节点判断是否在dc范围内若一个在范围内的都没有就把任务状态改为失败
//----查询任务下发的节点组ids/节点ids
String messionType = maps.get("mission_type");
StringBuffer mnSql = new StringBuffer();
mnSql.append("SELECT mpt.node_ips_id, mpt.node_groups_id ");
mnSql.append("FROM mission_state_table mst ");
mnSql.append("LEFT JOIN mission_parameter_table" + messionType + " mpt ON mpt.mission_id=mst.mission_id ");
mnSql.append("where mst.mission_id=" + maps.get("mission_id"));
ArrayList<String> mnFields = new ArrayList<String>();
mnFields.add("node_ips_id");
mnFields.add("node_groups_id");
ArrayList<Map<String, String>> mns = dao.dbSelect(mnSql.toString(), mnFields);
if (mns != null && mns.size() > 0) {
for (Map<String, String> mn : mns) {
//----根据节点组ids/节点ids查出seq_id
StringBuffer nodeSQL = new StringBuffer();
nodeSQL.append("select distinct nt.seq_id,nt.node_type ");
nodeSQL.append("from node_table nt ");
nodeSQL.append("where 1 = 1 ");
nodeSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
nodeSQL.append(" and nt.node_state = 0 ");
ArrayList<String> nodeFields = new ArrayList<String>();
nodeFields.add("seq_id");
nodeFields.add("node_type");
if(StringUtils.isNotBlank(mn.get("node_ips_id"))){
nodeSQL.append(" and nt.NODE_ID in(" + mn.get("node_ips_id") + ") ");
}else{
if(StringUtils.isNotBlank(mn.get("node_groups_id"))){
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in (" + mn.get("node_groups_id") + ") ", "group_id", "parent_group_id");
nodeSQL.append(" and nt.node_group_id in( " + startWithConnectBy + ")");
}
}
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
//----拼写uuid串用于校验管理范围外IP
StringBuffer uuidStr = new StringBuffer("0");
if (nodeMapList != null && nodeMapList.size() > 0) {
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
uuidStr.append("," + map.get("seq_id"));
}
}
}
logger.info("mission_id:" + maps.get("mission_id") + ",seq_id范围:" + uuidStr.toString());
StringBuffer omNodeSql = new StringBuffer("select distinct nt.seq_id from node_table nt where 1=1 ");
if(ipSegList!=null && ipSegList.size() > 0){
for(ServerIpSegment map : ipSegList){
omNodeSql.append(" and (ipn < '" + map.getStartIpn() + "' or ipn > '" + map.getEndIpn() + "')");
}
}
omNodeSql.append("and nt.seq_id in (" + uuidStr + ")");
ArrayList<String> omNodeFields = new ArrayList<String>();
omNodeFields.add("seq_id");
ArrayList<Map<String, String>> omNodeMapList = dao.dbSelect(omNodeSql.toString(), omNodeFields);
if (omNodeMapList != null && nodeMapList != null) {
if (omNodeMapList.size() < nodeMapList.size()) {
flag = true;
break;
}
}
}
}
} else {
flag = true;
}
//任务范围含有dc范围内节点则加载任务否则直接将任务状态改为未能执行
if (flag) {
logger.info("任务节点在dc范围内开始加载...");
MissionStateTable mission = new MissionStateTable();
// mission.setMissionName(maps.get("mission_name"));
mission.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
mission.setMissionType(StringUtils.isEmpty(maps.get("mission_type"))?null:Long.parseLong(maps.get("mission_type")) );
mission.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
mission.setSystemId(StringUtils.isEmpty(maps.get("system_id"))?null:Long.parseLong(maps.get("system_id")));
mission.setGroupId(StringUtils.isEmpty(maps.get("group_id"))?null:Long.parseLong(maps.get("group_id")));
mission.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
mission.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
mission.setLoopFlag(StringUtils.isEmpty(maps.get("is_loop"))?null:Long.parseLong(maps.get("is_loop")));
mission.setLoopDelay(StringUtils.isEmpty(maps.get("loop_delay"))?null:Long.parseLong(maps.get("loop_delay")));
mstList.add(mission);
} else {
String cancelSql = "update mission_state_table set mission_state=-1 where mission_id=" + maps.get("mission_id");
dao.dbUpdate(cancelSql);
logger.info("任务节点不在dc范围内已取消");
}
2018-09-27 16:17:06 +08:00
}
}
return mstList;
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mstList;
}
/**
* 获取正在执行状态的任务
* 用于任务下发线程初始化操作
* @time Mar 23, 2012-3:28:05 PM
* @param ids
* @return
*/
public ArrayList<MissionStateTable> getStartMessionList(String ids){
//-- 查询可执行的任务
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_id,");
searchSQL.append("mst.mission_type,");
searchSQL.append("mst.mission_state,");
searchSQL.append("mst.system_id,");
searchSQL.append("mst.group_id,");
searchSQL.append("to_char(mst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(mst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time,");
searchSQL.append("mst.is_loop,");
searchSQL.append("mst.loop_delay ");
searchSQL.append("from mission_state_table mst ");
searchSQL.append("where 1=1 ");
// searchSQL.append("and (mst.end_time>sysdate or mst.end_time is null) ");
searchSQL.append("and mst.mission_state in(2,6) ");
if(StringUtils.isNotEmpty(ids)){
searchSQL.append("and mst.mission_id in ("+ids+") ");
}
searchSQL.append("order by mst.create_time,mst.mission_id asc ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_type");
fields.add("mission_state");
fields.add("system_id");
fields.add("group_id");
fields.add("start_time");
fields.add("end_time");
fields.add("is_loop");
fields.add("loop_delay");
ArrayList<Map<String, String>> rs = null;
ArrayList<MissionStateTable> mstList = new ArrayList<MissionStateTable>();
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionStateTable mission = new MissionStateTable();
mission.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
mission.setMissionType(StringUtils.isEmpty(maps.get("mission_type"))?null:Long.parseLong(maps.get("mission_type")) );
mission.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
mission.setSystemId(StringUtils.isEmpty(maps.get("system_id"))?null:Long.parseLong(maps.get("system_id")));
mission.setGroupId(StringUtils.isEmpty(maps.get("group_id"))?null:Long.parseLong(maps.get("group_id")));
mission.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
mission.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
mission.setLoopFlag(StringUtils.isEmpty(maps.get("is_loop"))?null:Long.parseLong(maps.get("is_loop")));
mission.setLoopDelay(StringUtils.isEmpty(maps.get("loop_delay"))?null:Long.parseLong(maps.get("loop_delay")));
mstList.add(mission);
}
}
return mstList;
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mstList;
}
public JSONArray getMissionForAgentStart(Long uuid){
try{
if(uuid==null || uuid.longValue() == 0l){
return null;
}
StringBuffer groupsIdsSQL = new StringBuffer();
//当节点组不为空时查询该节点组的叶子节点组及其父系节点组ID
if(uuid != null ){
//--正向查询SQL 查询相关叶子节点组
StringBuffer groupsIdsSQLN = new StringBuffer();
groupsIdsSQLN.append("select nt.node_group_id from NODE_TABLE nt where 1=1 ");
groupsIdsSQLN.append("and nt.seq_id = "+uuid+" and nt.node_state=0 ");
//--逆向查询SQL 查询包括叶子节点组在内的父节点组
// StringBuffer groupsIdsSQLW = new StringBuffer();
// groupsIdsSQLW.append("select distinct ngt.group_id from NODEGROUP_TABLE ngt ");
// groupsIdsSQLW.append("start with ngt.group_id in ( ");
// groupsIdsSQLW.append(groupsIdsSQLN);
// groupsIdsSQLW.append(") connect by prior ngt.parent_group_id = ngt.group_id ");
// groupsIdsSQL.append(groupsIdsSQLW);
//@2018年4月26日15:56:55 适配mysql 数据库
String groupIds = dao.startWithConnectByReverse("NODEGROUP_TABLE", null, "group_id in ( " + groupsIdsSQLN.toString() +" ) ", "group_id", "parent_group_id");
groupsIdsSQL.append(groupIds);
}
String missionSql4 = "select distinct t.mission_id from v_mission_node_group_4 t where t.node_group_id in ("+groupsIdsSQL+")";
String missionSql6 = "select distinct t.mission_id from v_mission_node_group_6 t where t.node_group_id in ("+groupsIdsSQL+")";
JSONArray infoArray = new JSONArray();
ArrayList<String> fields = new ArrayList<String>();
StringBuffer searchSql = new StringBuffer();
ArrayList<Map<String, String>> mapsList = new ArrayList<Map<String,String>>();
//-- Task4 For once Mission
mapsList.clear();
fields.clear();
fields.add("mission_id");
fields.add("mission_type");
fields.add("command_type");
fields.add("command_ename");
fields.add("command_para");
fields.add("start_time");
fields.add("end_time");
fields.add("result");
fields.add("version");
searchSql.delete(0, searchSql.length());
searchSql.append("select t.mission_id,t.mission_type,to_char(t.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,to_char(t.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time, ");
searchSql.append("mpt4.command_type, mpt4.command_ename, mpt4.command_para, mrt4.result,mpt4.version ");
searchSql.append("from mission_state_table t ");
searchSql.append("left join mission_parameter_table4 mpt4 on t.mission_id = mpt4.mission_id ");
searchSql.append("left join mission_result_table4 mrt4 on mrt4.mission_id = mpt4.mission_id ");
// searchSql.append("left join node_table nt on nt.node_group_id = mpt4.node_group_id and nt.system_id = t.system_id ");
searchSql.append("where (t.end_time>sysdate or t.end_time is null) ");
searchSql.append("and t.mission_state =2 ");
searchSql.append("and t.is_loop =0 "); //非周期任务
// searchSql.append("and mpt4.node_group_id in( "+groupsIdsSQL+") ");
searchSql.append("and mpt4.mission_id in( "+missionSql4+") ");
/*
* 2018年10月12日18:10:49
* nc 重启获取 未下发的任务
*/
// searchSql.append("and mrt4.result >=40 ");
searchSql.append("and mrt4.result = 3 ");//3任务下发中
2018-09-27 16:17:06 +08:00
searchSql.append("and mrt4.seq_id ="+uuid+" ");
searchSql.append("order by t.create_time asc ");
mapsList = dao.dbSelect(searchSql.toString(), fields);
String split = "|";
if(mapsList!=null && mapsList.size()>0){
for(Map<String, String> map : mapsList){
Task4 task4 = new Task4();
JSONObject object = new JSONObject();
task4.setTaskId(StringUtils.isNotEmpty(map.get("mission_id"))?Long.parseLong(map.get("mission_id")):null);
task4.setTaskType(StringUtils.isNotEmpty(map.get("mission_type"))?Long.parseLong(map.get("mission_type")):null);
task4.setCommandName(map.get("command_ename"));
if(StringUtils.isNotEmpty(map.get("command_para"))){
StringBuffer newStrs = new StringBuffer();
String[] strs = map.get("command_para").split("\\|");
for(String str : strs){
if(DateUtil.isDate(str,Constants.COMMON_DATE_FORMAT)){
newStrs.append(split+format.parse(str).getTime());
}else{
newStrs.append(split+str);
}
}
newStrs = newStrs.length()>0?newStrs.delete(0, split.length()):newStrs;
task4.setCommandParam(newStrs.toString());
}
task4.setStartTime(StringUtils.isEmpty(map.get("start_time"))?null:format.parse(map.get("start_time")).getTime());
task4.setEndTime(StringUtils.isEmpty(map.get("end_time"))?null:format.parse(map.get("end_time")).getTime());
task4.setCommandType(StringUtils.isNotEmpty(map.get("command_type"))?Long.parseLong(map.get("command_type")):null);
task4.setState(StringUtils.isNotEmpty(map.get("result"))?Long.parseLong(map.get("result")):null);
task4.setVersion(StringUtils.isNotEmpty(map.get("version"))?Long.parseLong(map.get("version")):null);
object.put("typeInfo", task4.getTaskType());
object.put("taskInfo", task4);
infoArray.add(object);
}
}
//-- Task4 For LoopMission
mapsList.clear();
fields.clear();
fields.add("mission_id");
fields.add("mission_type");
fields.add("command_type");
fields.add("command_ename");
fields.add("command_para");
fields.add("start_time");
fields.add("end_time");
fields.add("result");
fields.add("version");
fields.add("is_loop");
fields.add("loop_delay");
fields.add("mission_state");
searchSql.delete(0, searchSql.length());
searchSql.append("select t.mission_id,t.mission_type,to_char(t.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,to_char(t.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time, ");
searchSql.append("mpt4.command_type, mpt4.command_ename, mpt4.command_para, mrt4.result,mpt4.version,t.is_loop,t.loop_delay,t.mission_state ");
searchSql.append("from mission_state_table t ");
searchSql.append("left join mission_parameter_table4 mpt4 on t.mission_id = mpt4.mission_id ");
searchSql.append("left join loopmission_state_table lmst on lmst.mission_id = t.mission_id ");
searchSql.append("left join mission_result_table4 mrt4 on mrt4.mission_id = lmst.cur_mission_id ");
// searchSql.append("left join node_table nt on nt.node_group_id = mpt4.node_group_id and nt.system_id = t.system_id ");
searchSql.append("where 1=1 ");
searchSql.append("and t.mission_state =2 ");
searchSql.append("and lmst.cur_mission_id in ( select max(lmst.cur_mission_id) from loopmission_state_table lmst where lmst.mission_state in (1,2) group by lmst.mission_id)");
searchSql.append("and t.is_loop =1 ");
// searchSql.append("and mpt4.node_group_id in( "+groupsIdsSQL+") ");
searchSql.append("and mpt4.mission_id in( "+missionSql4+") ");
// searchSql.append("and nt.seq_id = "+uuid.longValue()+" ");
/*
* 2018年10月12日18:10:49
* nc 重启获取 未下发的任务
*/
// searchSql.append("and mrt4.result >=40 ");
searchSql.append("and mrt4.result = 3 ");//3任务下发中
2018-09-27 16:17:06 +08:00
searchSql.append("and mrt4.seq_id ="+uuid+" ");
searchSql.append("order by t.create_time asc ");
mapsList = dao.dbSelect(searchSql.toString(), fields);
split = "|";
if(mapsList!=null && mapsList.size()>0){
for(Map<String, String> map : mapsList){
Task4 task4 = new Task4();
JSONObject object = new JSONObject();
task4.setTaskId(StringUtils.isNotEmpty(map.get("mission_id"))?Long.parseLong(map.get("mission_id")):null);
task4.setTaskType(StringUtils.isNotEmpty(map.get("mission_type"))?Long.parseLong(map.get("mission_type")):null);
task4.setCommandName(map.get("command_ename"));
if(StringUtils.isNotEmpty(map.get("command_para"))){
StringBuffer newStrs = new StringBuffer();
String[] strs = map.get("command_para").split("\\|");
for(String str : strs){
if(DateUtil.isDate(str,Constants.COMMON_DATE_FORMAT)){
newStrs.append(split+format.parse(str).getTime());
}else{
newStrs.append(split+str);
}
}
newStrs = newStrs.length()>0?newStrs.delete(0, split.length()):newStrs;
task4.setCommandParam(newStrs.toString());
}
task4.setStartTime(StringUtils.isEmpty(map.get("start_time"))?null:format.parse(map.get("start_time")).getTime());
task4.setEndTime(StringUtils.isEmpty(map.get("end_time"))?null:format.parse(map.get("end_time")).getTime());
task4.setCommandType(StringUtils.isNotEmpty(map.get("command_type"))?Long.parseLong(map.get("command_type")):null);
task4.setState(StringUtils.isNotEmpty(map.get("result"))?Long.parseLong(map.get("result")):null);
task4.setVersion(StringUtils.isNotEmpty(map.get("version"))?Long.parseLong(map.get("version")):null);
task4.setIsLoop(StringUtils.isNotEmpty(map.get("is_loop"))?Long.parseLong(map.get("is_loop")):null);
task4.setLoopDelay(StringUtils.isNotEmpty(map.get("loop_delay"))?Long.parseLong(map.get("loop_delay")):null);
task4.setMissionState(StringUtils.isNotEmpty(map.get("mission_state"))?Long.parseLong(map.get("mission_state")):null);
object.put("typeInfo", task4.getTaskType());
object.put("taskInfo", task4);
infoArray.add(object);
}
}
//-- Task6
mapsList.clear();
fields.clear();
fields.add("mission_id");
fields.add("mission_type");
fields.add("command_type");
fields.add("command_ename");
fields.add("command_para");
fields.add("source_path");
fields.add("target_path");
fields.add("check_value");
fields.add("start_time");
fields.add("result");
fields.add("version");
fields.add("old_task_id");
searchSql.delete(0, searchSql.length());
searchSql.append("select t.mission_id,t.mission_type, ");
searchSql.append("mpt6.old_task_id, ");
searchSql.append("mpt6.command_type, mpt6.command_ename, mpt6.command_para,mpt6.source_path,mpt6.target_path,mpt6.check_value,to_char(mpt6.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time, mrt6.result,mpt6.version ");
searchSql.append("from mission_state_table t ");
searchSql.append("left join mission_parameter_table6 mpt6 on t.mission_id = mpt6.mission_id ");
searchSql.append("left join mission_result_table6 mrt6 on mrt6.mission_id = mpt6.mission_id ");
// searchSql.append("left join node_table nt on nt.node_group_id = mpt4.node_group_id and nt.system_id = t.system_id ");
searchSql.append("where (t.end_time>sysdate or t.end_time is null) ");
searchSql.append("and t.mission_state =2 ");
// searchSql.append("and mpt6.node_group_id in( "+groupsIdsSQL+") ");
searchSql.append("and mpt6.mission_id in( "+missionSql6+") ");
// searchSql.append("and nt.seq_id = "+uuid.longValue()+" ");
/*
* 2018年10月12日18:10:49
* nc 重启获取 未下发的任务
*/
// searchSql.append("and mrt6.result >=40 ");
searchSql.append("and mrt6.result = 3 ");//3任务下发中
2018-09-27 16:17:06 +08:00
searchSql.append("and mrt6.seq_id ="+uuid+" ");
searchSql.append("order by t.create_time asc ");
mapsList = dao.dbSelect(searchSql.toString(), fields);
if(mapsList!=null && mapsList.size()>0){
for(Map<String, String> map : mapsList){
Task6 task6 = new Task6();
JSONObject object = new JSONObject();
task6.setTaskId(StringUtils.isNotEmpty(map.get("mission_id"))?Long.parseLong(map.get("mission_id")):null);
task6.setTaskType(StringUtils.isNotEmpty(map.get("mission_type"))?Long.parseLong(map.get("mission_type")):null);
task6.setCommandName(map.get("command_ename"));
task6.setCommandType(StringUtils.isNotEmpty(map.get("command_type"))?Long.parseLong(map.get("command_type")):null);
task6.setCommandParam(map.get("command_para"));
task6.setFileName( SocketUtils.removeTimeTagFileName(map.get("source_path")));
task6.setDestPath(map.get("target_path"));
task6.setMd5Value(map.get("check_value"));
task6.setUpgradeTime(StringUtils.isEmpty(map.get("start_time"))?null:format.parse(map.get("start_time")).getTime());
task6.setOldTaskId(StringUtils.isNotEmpty(map.get("old_task_id"))?Long.parseLong(map.get("old_task_id")):null);
task6.setState(StringUtils.isNotEmpty(map.get("result"))?Long.parseLong(map.get("result")):null);
task6.setVersion(StringUtils.isNotEmpty(map.get("version"))?Long.parseLong(map.get("version")):null);
object.put("typeInfo", task6.getTaskType());
object.put("taskInfo", task6);
infoArray.add(object);
}
}
return infoArray;
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return null;
}
/**
* 根据任务ID 获取任务信息用于 MissionInfo1
* @time Oct 25, 2011-10:19:00 AM
* @param missionId 可为空为空时全校验非空时 校验指定Id 返回
*/
public MissionStateTable getMessionById(Long missionId){
//-- 查询可执行的任务
StringBuffer searchSQL = new StringBuffer();
if(missionId==null || missionId.longValue() == 0l){
return null;
}
searchSQL.append("select mst.mission_id,");
searchSQL.append("mst.mission_type,");
searchSQL.append("mst.mission_state,");
searchSQL.append("mst.system_id,");
searchSQL.append("mst.group_id,");
searchSQL.append("to_char(mst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(mst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time,");
searchSQL.append("mst.is_loop,");
searchSQL.append("mst.loop_delay ");
searchSQL.append("from mission_state_table mst ");
searchSQL.append("where 1=1 ");
// searchSQL.append("and (mst.end_time>sysdate or mst.end_time is null) ");
// searchSQL.append("and mst.mission_state in (1,2,3,4) ");
searchSQL.append("and mst.mission_id = '"+missionId+"' ");
searchSQL.append("order by mst.create_time asc ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_type");
fields.add("mission_state");
fields.add("system_id");
fields.add("group_id");
fields.add("start_time");
fields.add("end_time");
fields.add("is_loop");
fields.add("loop_delay");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
MissionStateTable mission = new MissionStateTable();
if(rs!=null && rs.size()>0){
Map<String, String> maps = rs.get(0);
mission.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
mission.setMissionType(StringUtils.isEmpty(maps.get("mission_type"))?null:Long.parseLong(maps.get("mission_type")) );
mission.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
mission.setSystemId(StringUtils.isEmpty(maps.get("system_id"))?null:Long.parseLong(maps.get("system_id")));
mission.setGroupId(StringUtils.isEmpty(maps.get("group_id"))?null:Long.parseLong(maps.get("group_id")));
mission.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
mission.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
mission.setLoopFlag(StringUtils.isEmpty(maps.get("is_loop"))?null:Long.parseLong(maps.get("is_loop")));
mission.setLoopDelay(StringUtils.isEmpty(maps.get("loop_delay"))?null:Long.parseLong(maps.get("loop_delay")));
}
return mission;
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return null;
}
/**
* 校验并初始化周期任务轮次信息 <br>
* <p>设计说明<br>
* 1校验 缓存中是否存在 该周期任务信息不存在 则添加<br>
* 2校验 缓存中是否存在 该周期任务的轮次信息 不存在 则添加<br>
* 3校验 缓存中 轮次信息是否 符合要求<br>
* a周期判定[startTime,endTime)<br>
* b保证周期任务的轮次信息的连续性和非重复性(起始时间 结束时间 无遗漏 无交集) <br>
* c过期的轮次信息创建 其状态为 4(未能执行)<br>
* d预置周期轮次起始时间大于当前系统时间数量 <br>
* Constants.COMMON_MISSION_LOOP_PRESET_NUMBER <br>
* e新预置轮次信息的状态为 0<br>
* @time Feb 13, 2012-10:40:41 AM
* @param missionId
* @param startTime
* @param endTime
* @param missionCycle
*/
public void checkAndInitMissionCycle (MissionStateTable mission) throws Exception{
/**参数有效性校验*/
if (mission==null || mission.getMissionId() == null
|| mission.getStartTime() == null
|| mission.getEndTime() == null
|| mission.getLoopFlag() == null ) {
return;
}
/**设计实现*/
//- 校验 缓存中是否存在周期任务
if(Common.getLoopMissionInfoMap().get(mission.getMissionId())==null){
this.updateLoopMissionInfo(Common.getLoopMissionInfoMap(), mission.getMissionId()); //将周期任务保存到缓存中
mission = Common.getLoopMissionInfoMap().get(mission.getMissionId());
}
/**参数有效性再次校验出现过经过再次获取Mission仍然mission为null的情况*/
if (mission==null || mission.getMissionId() == null
|| mission.getStartTime() == null
|| mission.getEndTime() == null
|| mission.getLoopFlag() == null ) {
return;
}
//- 校验 缓存中是否存在周期任务的轮次信息
this.updateLoopMissionRoundInfo(Common.getLoopMissionRoundInfoList(), mission.getMissionId()); //更新指定周期任务ID的轮次信息
List<LoopMissionRoundInfo> roundInfoList = Common.getLoopMissionRoundInfoList().get(mission.getMissionId());
// if(roundInfoList==null || roundInfoList.size()==0){
// roundInfoList = Common.getLoopMissionRoundInfoList().get(mission.getMissionId());
// }
//- 校验 轮次信息是否符合要求
SimpleDateFormat format = new SimpleDateFormat(Constants.COMMON_DATE_FORMAT);
long timeStart = mission.getStartTime().getTime(); // 任务的周期起始时间点(毫秒)
long timeEnd = mission.getEndTime().getTime(); // 任务的周期结束时间点(毫秒)
long timeDelay = mission.getLoopDelay()*60*1000; // 任务的周期值(毫秒)
int preset = Constants.MISSION_LOOP_PRESET_NUMBER; //preset预置数
//- 新创建任务 时间起始点为当前系统时间
// if(mission.getMissionState().longValue()==1l){
// if(timeStart<System.currentTimeMillis()){
// timeStart = System.currentTimeMillis();
// }
// }
logger.debug("new Date() 和 system.currentTimeMillis()"+(new Date().getTime())+" VS "+System.currentTimeMillis());
/*
* 轮次的时间段前闭后开区间
* 预置周期为 轮次时间 > 当前系统时间
* 调整后的timeStart 为roundInfoList最后一个对象的结束时间
* */
//-- 第一步 获取已存在的轮次信息 调整周期的起始时间、结束时间和预置数
if(roundInfoList!=null && roundInfoList.size()>0){ //继续校验,并检查
LoopMissionRoundInfo roundInfo = null;
for (Iterator<LoopMissionRoundInfo> roundInfoIte = roundInfoList.iterator(); roundInfoIte.hasNext();) {
roundInfo = roundInfoIte.next();
if(roundInfo.getStartTime().getTime() > System.currentTimeMillis()){ //预置轮次信息数量判断
preset--;
}
timeStart = timeStart>roundInfo.getEndTime().getTime()?timeStart:roundInfo.getEndTime().getTime();
}
}
//-- 第二步 补齐新轮次信息
List<String[]> cycleList = new LinkedList<String[]>(); //新轮次信息集合
a: while(preset > 0){
long timePoint = timeStart+timeDelay; //周期游标
int cycleState = 0;
if(timePoint > timeEnd){ //周期游标 末端调整
break;
}
/**
周期任务的周期判定前闭后开区间包含起始时间点不包含结束时间点
当前周期与之后的周期状态均为0预置过期周期状态为4未能执行
* */
if(timeStart > System.currentTimeMillis()){ //预置周期
cycleState = 0;
preset--;
}else if(timePoint < System.currentTimeMillis()){ // 过期周期
cycleState = 4;
}else{ //当前周期[上一周期的timePoint,下一周期的timeStart)
cycleState = 0;
}
cycleList.add(new String[]{mission.getMissionId()+"",cycleState+"", format.format(timeStart),format.format(timePoint)});
timeStart = timePoint;
if(timeEnd == timePoint){
break a;
}
}
//-- 第三步 保存 并 更新 轮次信息
try {
dao.setAutoCommit(false);
if(cycleList.size()>0){
String sql = "insert into loopmission_state_table (mission_id,mission_state,start_time,end_time) values (?,?,to_date(?,'"+Constants.DB_DATE_FORMAT+"'),to_date(?,'"+Constants.DB_DATE_FORMAT+"')) ";
dao.dbUpdateByBatch(sql, cycleList);
}
//-- 更新缓存中的周期任务的 轮次信息
if(cycleList.size()>0){
this.updateLoopMissionRoundInfo(Common.getLoopMissionRoundInfoList(), mission.getMissionId());
}
//if(mission.getMissionState()== MissionConstants.MISSION_STATE_CREATE){
//-- 修改任务状态为 mission_state = 2已开始执行
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = ? , mst.AUTO_DESC=? where mst.mission_id= ?",MissionConstants.MISSION_STATE_RUNNING_FAIL,MissionConstants.ERROR_TASK_NO_USED_NODE,mission.getMissionId().longValue());
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 2 where mst.mission_id="+mission.getMissionId().longValue());
//}
dao.commit();
} catch (Exception e) {
dao.rollback();
logger.error("",e);
}finally{
dao.clearConn();
}
}
/**
* 针对任务已创建状态的任务为其初始化任务结果集
* 查询任务状态校验是否执行初始化
* 查询初始化结果的节点保存入库
* @time Oct 25, 2011-11:00:08 AM
* @param missionId 任务Id
* @param systemId 系统Id
* @param nodeGroupId 节点组IDs 多个逗号隔开不能超过1000
* @param nodeIpsId 节点IDs 多个节点逗号隔开不能超过1000
* @param missionType 任务类型
*/
public void initMissionResults(Long missionId,String nodeGroupId,String nodeIpsId, int missionType) throws Exception{
if(missionId==null || missionId.longValue()==0 || missionType==0){
return;
}
try {
dao.setAutoCommit(false);
ArrayList<String> fields = new ArrayList<String>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_state from mission_state_table mst where mst.mission_id = "+missionId.longValue()+" and mst.mission_state<>3");
fields.add("mission_state");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!= null && rs.size()>0){
if(rs.get(0)!=null && rs.get(0).get("mission_state")!=null && "2".equals(rs.get(0).get("mission_state").trim())){
return;
}
}
} catch (Exception e) {
logger.error("",e);
}
searchSQL.delete(0,searchSQL.length());
searchSQL.append("select distinct nt.seq_id ");
searchSQL.append("from node_table nt ");
searchSQL.append("where 1=1 ");
searchSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
searchSQL.append(" and nt.node_state = 0 ");
if(StringUtils.isNotBlank(nodeIpsId)){
searchSQL.append(" and nt.NODE_ID in("+nodeIpsId+") ");
}else{
if(StringUtils.isNotBlank(nodeGroupId)){
// searchSQL.append(" and nt.node_group_id in( select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 start with nt.group_id in ("+nodeGroupId+") connect by prior nt.group_id = nt.parent_group_id )");
//@2018年4月26日15:57:27 适配mysql 数据库
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in ("+nodeGroupId+") ", "group_id", "parent_group_id");
searchSQL.append(" and nt.node_group_id in( "+startWithConnectBy+")");
}
}
// searchSQL.append(getIpnSelect());
fields.clear();
fields.add("seq_id");
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 循环插入结果信息
if(rs!=null && rs.size()>0){
String sql = " insert into mission_result_table"+missionType+" (mission_id,seq_id,result) values (?,?,?)";
LinkedList<String []> params = new LinkedList<String[]>();
for(Map<String, String> maps : rs){
params.add(new String[]{missionId.longValue()+"",maps.get("seq_id")+"","3"});
}
//-- 修改任务状态为 mission_state = 2已开始执行
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 2 where mst.mission_id="+missionId.longValue());
dao.dbUpdateByBatch(sql, params);
}
dao.commit();
} catch (Exception e) {
try {
dao.rollback();
} catch (Exception e1) {
logger.error("",e1);
}
logger.error("",e);
}finally{
dao.clearConn();
}
}
/**
* 初始化任务信息校验任务下发节点有效非服务器和管理范围外Node 结果判定失败
* 查询任务下发节点并做校验和初始化操作
* 1校验无有效下发节点任务未能执行
* 2校验非服务器节点初始化该节点失败的任务结果
* 3校验管理范围外节点初始化该节点失败的任务结果
* 4插入任务结果并更新任务状态
* @time Oct 25, 2011-11:00:08 AM
* @param missionId 任务Id
* @param systemId 系统Id
* @param nodeGroupId 节点组IDs 多个逗号隔开不能超过1000
* @param nodeIpsId 节点IDs 多个节点逗号隔开不能超过1000
* @param missionType 任务类型
*/
public void initMissionResults2(Long missionId,String nodeGroupId,String nodeIpsId, int missionType) throws Exception{
/* 参数校验 */
if(missionId==null || missionId.longValue()==0 || missionType==0){
return;
}
/* 任务初始化业务 */
try {
dao.setAutoCommit(false);
ArrayList<String> msFields = new ArrayList<String>();
StringBuffer msSQL = new StringBuffer();
//即时判断任务状态是否为已创建状态
msFields.add("mission_state");
msSQL.append("select mst.mission_state from mission_state_table mst where mst.mission_id = "+missionId.longValue()+" and mst.mission_state = "+MissionConstants.MISSION_STATE_CREATE);
ArrayList<Map<String, String>> missionSateMap = dao.dbSelect(msSQL.toString(), msFields);
if(missionSateMap== null || missionSateMap.size() == 0){
return;
}
ArrayList<String> nodeFields = new ArrayList<String>();
StringBuffer nodeSQL = new StringBuffer();
//查询任务下发节点
nodeFields.add("seq_id");
nodeFields.add("node_type");
nodeSQL.append("select distinct nt.seq_id,nt.node_type ");
nodeSQL.append("from node_table nt ");
nodeSQL.append("where 1 = 1 ");
nodeSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
nodeSQL.append(" and nt.node_state = 0 ");
if(StringUtils.isNotBlank(nodeIpsId)){
nodeSQL.append(" and nt.NODE_ID in("+nodeIpsId+") ");
}else{
if(StringUtils.isNotBlank(nodeGroupId)){
// nodeSQL.append(" and nt.node_group_id in( select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 start with nt.group_id in ("+nodeGroupId+") connect by prior nt.group_id = nt.parent_group_id )");
//@2018年4月26日15:57:27 适配mysql 数据库
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in ("+nodeGroupId+") ", "group_id", "parent_group_id");
nodeSQL.append(" and nt.node_group_id in( "+startWithConnectBy+")");
}
}
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
// 任务下发节点
if(nodeMapList != null && nodeMapList.size()>0){
//拼写uuid串用于校验管理范围外IP
StringBuffer uuidStr = new StringBuffer("0");
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
uuidStr.append(","+map.get("seq_id"));
}
}
//查询任务下发节点sql-管理范围外节点
//是否限制为当前dc范围
boolean missionSingle = Constants.MISSION_SINGLE.equals("1") ? true : false;
StringBuffer msSql = new StringBuffer("");
if (missionSingle) {
Long serverId = Common.getServerTable().getId();
msSql.append("and sis.server_id=");
msSql.append(serverId);
msSql.append(" ");
}
2018-09-27 16:17:06 +08:00
ArrayList<String> ipnSegmentFields = new ArrayList<String>();
StringBuffer ipnSegmentSQL = new StringBuffer("select sis.start_ipn,sis.end_ipn from server_ip_segment sis left join server_table st on st.id = sis.server_id where st.server_state='0' and nvl(sis.segment_state,0) <>-1 ");
ipnSegmentSQL.append(msSql);
2018-09-27 16:17:06 +08:00
ipnSegmentFields.add("start_ipn");
ipnSegmentFields.add("end_ipn");
ArrayList<Map<String, String>> omNodeMapList = dao.dbSelect(ipnSegmentSQL.toString(), ipnSegmentFields);
StringBuffer omNodeSql = new StringBuffer("select distinct nt.seq_id from node_table nt where 1=1 ");
if(omNodeMapList!=null && omNodeMapList.size()>0){
for(Map<String, String> map : omNodeMapList){
omNodeSql.append(" and (ipn < '"+map.get("start_ipn")+"' or ipn > '"+map.get("end_ipn")+"')");
}
}
omNodeSql.append("and nt.seq_id in ("+uuidStr+")");
ArrayList<String> omNodeFields = new ArrayList<String>();
omNodeFields.add("seq_id");
omNodeMapList = dao.dbSelect(omNodeSql.toString(), omNodeFields);
//循环插入结果信息
String sql = " insert into mission_result_table"+missionType+" (mission_id,seq_id,result,result_desc) values (?,?,?,?)";
LinkedList<String []> params = new LinkedList<String[]>();
node:for(Map<String, String> nodeMap : nodeMapList){
if("0".equals(nodeMap.get("node_type"))){ //服务器节点
if(omNodeMapList!= null && omNodeMapList.size()>0){
omNode:for(Map<String, String> map : omNodeMapList){
if(nodeMap.get("seq_id").equals(map.get("seq_id"))){//管理范围外节点失败结果
//params.add(new String[]{missionId.longValue()+"",nodeMap.get("seq_id")+"","1",MissionConstants.ERROR_RESULT_UN_MANAGEMENT_NODE});
2018-09-27 16:17:06 +08:00
continue node;
}
}
}
//可下发服务器节点
params.add(new String[]{missionId.longValue()+"",nodeMap.get("seq_id")+"","3",null});
}else{ //非服务器
params.add(new String[]{missionId.longValue()+"",nodeMap.get("seq_id")+"","1",MissionConstants.ERROR_RESULT_NOT_SERVER});
}
}
//-- 修改任务状态为 mission_state = 2已开始执行
dao.dbUpdate("update mission_state_table mst set mst.mission_state =? , mst.AUTO_DESC=? where mst.mission_id=?",MissionConstants.MISSION_STATE_RUNNING_OK,format.format(System.currentTimeMillis())+" "+MissionConstants.NOTICE_TASK_RUNNING,missionId.longValue());
dao.dbUpdateByBatch(sql, params);
}else{
//无节点任务
dao.dbUpdate("update mission_state_table mst set mst.mission_state = ? , mst.AUTO_DESC=? where mst.mission_id= ?",MissionConstants.MISSION_STATE_RUNNING_FAIL,format.format(System.currentTimeMillis())+" "+MissionConstants.ERROR_TASK_NO_USED_NODE,missionId.longValue());
}
dao.commit();
} catch (Exception e) {
dao.rollback();
throw e;
}finally{
dao.clearConn();
}
}
/**
* 初始化任务信息校验任务下发节点有效非服务器和管理范围外Node 结果判定失败
* 查询任务下发节点并做校验和初始化操作
* 1校验无有效下发节点任务未能执行
* 2校验非服务器节点初始化该节点失败的任务结果
* 3校验管理范围外节点初始化该节点失败的任务结果
* 4插入任务结果并更新任务状态
* @time Oct 25, 2011-11:00:08 AM
* @param missionId 任务Id
* @param systemId 系统Id
* @param nodeGroupId 节点组IDs 多个逗号隔开不能超过1000
* @param nodeIpsId 节点IDs 多个节点逗号隔开不能超过1000
* @param missionType 任务类型
*/
public void initLoopMissionResults2(Long curMissionId,String nodeGroupId,String nodeIpsId,int resultValue) throws Exception{
/* 参数校验 */
if(curMissionId==null || curMissionId.longValue()==0 ){
return;
}
/* 任务初始化业务 */
try {
dao.setAutoCommit(false);
ArrayList<String> msFields = new ArrayList<String>();
StringBuffer msSQL = new StringBuffer();
//即时判断任务状态是否为已创建状态
msFields.add("mission_state");
msSQL.append("select mst.mission_state from loopmission_state_table mst where mst.cur_mission_id = "+curMissionId.longValue()+" and (mst.mission_state <> "+MissionConstants.MISSION_STATE_FINISHING+" or mst.mission_state <>"+MissionConstants.MISSION_STATE_CANCEL_FINISHING+")");
ArrayList<Map<String, String>> missionSateMap = dao.dbSelect(msSQL.toString(), msFields);
if(missionSateMap== null || missionSateMap.size() == 0){
return;
}
ArrayList<String> nodeFields = new ArrayList<String>();
StringBuffer nodeSQL = new StringBuffer();
//查询任务下发节点
nodeFields.add("seq_id");
nodeFields.add("node_type");
nodeSQL.append("select distinct nt.seq_id,nt.node_type ");
nodeSQL.append("from node_table nt ");
nodeSQL.append("where 1 = 1 ");
nodeSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
nodeSQL.append(" and nt.node_state = 0 ");
logger.info("curMissionId="+curMissionId+"nodeIps="+nodeIpsId);
if(StringUtils.isNotBlank(nodeIpsId)){
nodeSQL.append(" and nt.NODE_ID in("+nodeIpsId+") ");
}else{
if(StringUtils.isNotBlank(nodeGroupId)){
// nodeSQL.append(" and nt.node_group_id in( select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 start with nt.group_id in ("+nodeGroupId+") connect by prior nt.group_id = nt.parent_group_id )");
//@2018年4月26日15:57:27 适配mysql 数据库
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in ("+nodeGroupId+") ", "group_id", "parent_group_id");
nodeSQL.append(" and nt.node_group_id in( "+startWithConnectBy+")");
}
}
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
// 任务下发节点
if(nodeMapList != null && nodeMapList.size()>0){
//拼写uuid串用于校验管理范围外IP
StringBuffer uuidStr = new StringBuffer("0");
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
uuidStr.append(","+map.get("seq_id"));
}
}
//查询任务下发节点sql-管理范围外节点
boolean missionSingle = Constants.MISSION_SINGLE.equals("1") ? true : false;
StringBuffer msSql = new StringBuffer("");
if (missionSingle) {
Long serverId = Common.getServerTable().getId();
msSql.append("and sis.server_id=");
msSql.append(serverId);
msSql.append(" ");
}
2018-09-27 16:17:06 +08:00
ArrayList<String> ipnSegmentFields = new ArrayList<String>();
StringBuffer ipnSegmentSQL = new StringBuffer("select sis.start_ipn,sis.end_ipn from server_ip_segment sis left join server_table st on st.id = sis.server_id where st.server_state='0' and nvl(sis.segment_state,0) <>-1 ");
ipnSegmentSQL.append(msSql);
2018-09-27 16:17:06 +08:00
ipnSegmentFields.add("start_ipn");
ipnSegmentFields.add("end_ipn");
ArrayList<Map<String, String>> omNodeMapList = dao.dbSelect(ipnSegmentSQL.toString(), ipnSegmentFields);
StringBuffer omNodeSql = new StringBuffer("select distinct nt.seq_id from node_table nt where 1=1 ");
if(omNodeMapList!=null && omNodeMapList.size()>0){
for(Map<String, String> map : omNodeMapList){
omNodeSql.append(" and (ipn < '"+map.get("start_ipn")+"' or ipn > '"+map.get("end_ipn")+"')");
}
}
omNodeSql.append("and nt.seq_id in ("+uuidStr+")");
ArrayList<String> omNodeFields = new ArrayList<String>();
omNodeFields.add("seq_id");
omNodeMapList = dao.dbSelect(omNodeSql.toString(), omNodeFields);
//循环插入结果信息
String sql = " insert into mission_result_table4 (mission_id,seq_id,result,result_desc) values (?,?,?,?)";
LinkedList<String []> params = new LinkedList<String[]>();
//查询当前任务的执行节点中上一周期下发失败的节点-2013-9-27 hyx
//过滤失败的思路有问题,应该过滤下发成功的,未知的默认下发失败,再次下发
String assignSuccessSeqIds = "";
if(resultValue==40) {
assignSuccessSeqIds = getAssignSuccessSeqIdsByMiss(curMissionId);
System.out.println("curMissId="+curMissionId+",OKSeqIds="+assignSuccessSeqIds);
logger.info("curMissId="+curMissionId+",OKSeqIds="+assignSuccessSeqIds);
}
boolean hasAssignFailNode = false;//不一定是真下发失败,当未知时,默认下发失败
// String assignFailSeqIds = "";
// if(resultValue==40) {
// assignFailSeqIds = getAssignFailSeqIdsByMiss(curMissionId);//当前任务当前周期的当前节点之前的状态
// System.out.println("curMissId="+curMissionId+",failSeqIds="+assignFailSeqIds);
// logger.info("curMissId="+curMissionId+",failSeqIds="+assignFailSeqIds);
// }
//由于其他地方导致的缓存中的轮次信息的state和数据库中的不一致对于已经有结果的还要初始化所以此处验证一下如果已经有结果了则不做插入操作
ArrayList<String> hasRltFields = new ArrayList<String>();
hasRltFields.add("result");
hasRltFields.add("result_detail");
ArrayList<Map<String, String>> hasRltList = dao.dbSelect("select mrt4.result,mrt4.result_detail from mission_result_table4 mrt4 where mrt4.mission_id="+curMissionId,hasRltFields);
if(hasRltList!=null && hasRltList.size()==0) {//此处只能防止之前插入过此次不允许重复插入不能防止此次插入重复的记录curMissId+seqId也不需要因为表中设置了联合主键
node:for(Map<String, String> nodeMap : nodeMapList){
String seqIdTmp = nodeMap.get("seq_id")+"";
if("0".equals(nodeMap.get("node_type"))){ //服务器节点
if(omNodeMapList!= null && omNodeMapList.size()>0){
omNode:for(Map<String, String> map : omNodeMapList){
if(seqIdTmp.equals(map.get("seq_id"))){//管理范围外节点失败结果
//params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,"1",MissionConstants.ERROR_RESULT_UN_MANAGEMENT_NODE});
2018-09-27 16:17:06 +08:00
continue node;
}
}
}
//可下发服务器节点
if(resultValue==40) {//周期任务再次初始化任务结果时对于下发失败的要初始化为下发中状态3
//对于当前任务的执行节点中下发失败的节点并将任务结果初始化为3然后进行下发
System.out.println("所有的的seq"+seqIdTmp);
logger.info("所有的的seq"+seqIdTmp);
if(!assignSuccessSeqIds.contains(","+seqIdTmp+",")) {
System.out.println("下发失败的seq"+seqIdTmp);
logger.info("下发失败的seq"+seqIdTmp);
hasAssignFailNode = true;
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,"3",null});
}else {
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,resultValue+"",null});
}
}else {
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,resultValue+"",null});
}
}else{ //非服务器
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,"1",MissionConstants.ERROR_RESULT_NOT_SERVER});
}
}
}
//当之前周期有下发失败的节点时,本周期继续进行下发:,2,其实是将需要下发的任务id加入到对应的list
if(hasAssignFailNode) {
MissionStateTable mission = getMissionInfoByCurMissionId(curMissionId);
String[] missIds = new String[1];
if(mission!=null && mission.getMissionId()!=null) {
missIds[0] = mission.getMissionId()+"";
Common.addAssignFailMissionIds(mission.getMissionId()+"");
}
}
//-- 修改周期任务状态为 mission_state 开始执行2 或6
if(resultValue==3){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state =? where mst.cur_mission_id=?",MissionConstants.MISSION_STATE_RUNNING_OK,curMissionId.longValue());
}else if(resultValue==5){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state =? where mst.cur_mission_id=?",MissionConstants.MISSION_STATE_CANCEL_RUNNING_OK,curMissionId.longValue());
}
dao.dbUpdateByBatch(sql, params);
}else{
//无节点任务 将周期置为无效
dao.dbUpdate("update mission_state_table mst set mst.AUTO_DESC=? where mst.mission_id in (select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id=? )"
, format.format(new Date())+" " +MissionConstants.ERROR_TASK_RUND_NO_USED_NODE
,curMissionId.longValue());
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = ? where mst.cur_mission_id= ?",MissionConstants.MISSION_STATE_RUNNING_FAIL,curMissionId.longValue());
}
dao.commit();
} catch (Exception e) {
dao.rollback();
throw e;
}finally{
dao.clearConn();
}
}
/**
* 初始化所有节点都不通的周期任务的结果过期的插入下发失败的结果
* 1.查询未过期的周期插入结果3
* 2.查询过期的周期且未插入结果的插入1,41
*/
public void initLoopMissionForAssignFail(Long curMissionId,String nodeGroupId,String nodeIpsId,int resultVal,Integer resultDetail) throws Exception{
/* 参数校验 */
if(curMissionId==null || curMissionId.longValue()==0 ){
return;
}
String rltDetailStr = resultDetail==null?"":resultDetail+"";
/* 任务初始化业务 */
try {
dao.setAutoCommit(false);
ArrayList<String> msFields = new ArrayList<String>();
StringBuffer msSQL = new StringBuffer();
//即时判断任务状态是否为已创建状态
msFields.add("mission_state");
msSQL.append("select mst.mission_state from loopmission_state_table mst where mst.cur_mission_id = "+curMissionId.longValue()+" and (mst.mission_state <> "+MissionConstants.MISSION_STATE_FINISHING+" or mst.mission_state <>"+MissionConstants.MISSION_STATE_CANCEL_FINISHING+")");
ArrayList<Map<String, String>> missionSateMap = dao.dbSelect(msSQL.toString(), msFields);
if(missionSateMap== null || missionSateMap.size() == 0){
return;
}
//查询需要插入结果的节点
ArrayList<String> nodeFields = new ArrayList<String>();
StringBuffer nodeSQL = new StringBuffer();
//查询任务下发节点
nodeFields.add("seq_id");
nodeFields.add("node_type");
nodeSQL.append("select distinct nt.seq_id,nt.node_type ");
nodeSQL.append("from node_table nt ");
nodeSQL.append("where 1 = 1 ");
nodeSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
nodeSQL.append(" and nt.node_state = 0 ");
if(StringUtils.isNotBlank(nodeIpsId)){
nodeSQL.append(" and nt.NODE_ID in("+nodeIpsId+") ");
}else{
if(StringUtils.isNotBlank(nodeGroupId)){
// nodeSQL.append(" and nt.node_group_id in( select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 start with nt.group_id in ("+nodeGroupId+") connect by prior nt.group_id = nt.parent_group_id )");
//@2018年4月26日15:57:27 适配mysql 数据库
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in ("+nodeGroupId+") ", "group_id", "parent_group_id");
nodeSQL.append(" and nt.node_group_id in( "+startWithConnectBy+")");
}
}
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
// 任务下发节点
if(nodeMapList != null && nodeMapList.size()>0){
//拼写uuid串用于校验管理范围外IP
StringBuffer uuidStr = new StringBuffer("0");
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
uuidStr.append(","+map.get("seq_id"));
}
}
//查询任务下发节点sql-管理范围外节点
ArrayList<String> ipnSegmentFields = new ArrayList<String>();
StringBuffer ipnSegmentSQL = new StringBuffer("select sis.start_ipn,sis.end_ipn from server_ip_segment sis left join server_table st on st.id = sis.server_id where st.server_state='0' and nvl(sis.segment_state,0) <>-1");
ipnSegmentFields.add("start_ipn");
ipnSegmentFields.add("end_ipn");
ArrayList<Map<String, String>> omNodeMapList = dao.dbSelect(ipnSegmentSQL.toString(), ipnSegmentFields);
StringBuffer omNodeSql = new StringBuffer("select distinct nt.seq_id from node_table nt where 1=1 ");
if(omNodeMapList!=null && omNodeMapList.size()>0){
for(Map<String, String> map : omNodeMapList){
omNodeSql.append(" and (ipn < '"+map.get("start_ipn")+"' or ipn > '"+map.get("end_ipn")+"')");
}
}
omNodeSql.append("and nt.seq_id in ("+uuidStr+")");
ArrayList<String> omNodeFields = new ArrayList<String>();
omNodeFields.add("seq_id");
omNodeMapList = dao.dbSelect(omNodeSql.toString(), omNodeFields);
//循环插入结果信息
String sql = " insert into mission_result_table4 (mission_id,seq_id,result,result_detail,result_desc) values (?,?,?,?,?)";
LinkedList<String []> params = new LinkedList<String[]>();
//由于其他地方导致的缓存中的轮次信息的state和数据库中的不一致对于已经有结果的还要初始化所以此处验证一下如果已经有结果了则不做插入操作
ArrayList<String> hasRltFields = new ArrayList<String>();
hasRltFields.add("result");
hasRltFields.add("result_detail");
ArrayList<Map<String, String>> hasRltList = dao.dbSelect("select mrt4.result,mrt4.result_detail from mission_result_table4 mrt4 where mrt4.mission_id="+curMissionId,hasRltFields);
if(hasRltList!=null && hasRltList.size()==0) {
node:for(Map<String, String> nodeMap : nodeMapList){
String seqIdTmp = nodeMap.get("seq_id")+"";
if("0".equals(nodeMap.get("node_type"))){ //服务器节点
if(omNodeMapList!= null && omNodeMapList.size()>0){
omNode:for(Map<String, String> map : omNodeMapList){
if(seqIdTmp.equals(map.get("seq_id"))){//管理范围外节点失败结果
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,resultVal+"",rltDetailStr,MissionConstants.ERROR_RESULT_UN_MANAGEMENT_NODE});
continue node;
}
}
}
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,resultVal+"",rltDetailStr,null});
}else{ //非服务器
params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,resultVal+"",rltDetailStr,MissionConstants.ERROR_RESULT_NOT_SERVER});
}
}
}
//-- 修改周期任务状态为 mission_state 开始执行2 或6
if(resultVal==3){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state =? where mst.cur_mission_id=?",MissionConstants.MISSION_STATE_RUNNING_OK,curMissionId.longValue());
}else if(resultVal==5){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state =? where mst.cur_mission_id=?",MissionConstants.MISSION_STATE_CANCEL_RUNNING_OK,curMissionId.longValue());
}
dao.dbUpdateByBatch(sql, params);
}
// else{//此处不会执行到,既然之前周期确定为节点都不通,表明有执行节点
// //无节点任务 将周期置为无效
// dao.dbUpdate("update mission_state_table mst set mst.AUTO_DESC=? where mst.mission_id in (select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id=? )"
// , format.format(new Date())+" " +MissionConstants.ERROR_TASK_RUND_NO_USED_NODE
// ,curMissionId.longValue());
// dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = ? where mst.cur_mission_id= ?",MissionConstants.MISSION_STATE_RUNNING_FAIL,curMissionId.longValue());
// }
//
dao.commit();
} catch (Exception e) {
dao.rollback();
throw e;
}finally{
dao.clearConn();
}
}
//查询当前任务的执行节点中上一周期下发失败的节点
private String getAssignFailSeqIdsByMiss(Long curMissionId) {
StringBuffer assignFailSeqIds = new StringBuffer(",");
try
{
if(curMissionId!=null) {
ArrayList<String> nodeFields = new ArrayList<String>();
StringBuffer nodeSQL = new StringBuffer();
//查询任务下发节点---此sql有问题只查完成的如果之前没有完成的周期那就没有下发失败的节点其实是不知道是否下发成功应该默认下发失败才对NC会过滤的
nodeFields.add("seq_id");
nodeSQL.append(" select mrt4.seq_id from mission_result_table4 mrt4 ");//3超找此周期中下发失败的result=1 and resultDetail=41
nodeSQL.append(" where mrt4.mission_id =( ");
nodeSQL.append(" select max(lst.cur_mission_id) ");//2(有可能查到的为null只有一个周期的或者之前都是未能执行的此为第一个周期)查找主任务中当前周期之前的且执行完成的一个周期的任务id会不会有的周期任务的结果还没过来导致查找的不对条件为小于当前周期的最大的周期且不为4未能执行的
nodeSQL.append(" from loopmission_state_table lst ");
nodeSQL.append(" where lst.mission_id = ( ");
nodeSQL.append(" select lstTmp.mission_id ");//1超找当前周期对应的主任务id
nodeSQL.append(" from loopmission_state_table lstTmp ");
nodeSQL.append(" where lstTmp.cur_mission_id="+curMissionId+")");
//下面sql语句不能加state=2因为为2时可能结果为3 or 40 此时不知道是否下发成功应该默认下发失败再次下发才对重复下发NC会过滤不会重复执行所以只能要state=3完成的我们才能准确判断
nodeSQL.append(" and (lst.mission_state =3 ) and lst.cur_mission_id<"+curMissionId);//lst.mission_state =3未能执行的在结果表不会有结果所以第一个条件=4可以不加不行那就看之前是否有执行完成的
nodeSQL.append(" ) and mrt4.result=1 and mrt4.result_detail=41");
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
if(nodeMapList != null && nodeMapList.size()>0){
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
assignFailSeqIds.append(map.get("seq_id")+",");
}
}
}
}
} catch (Exception e)
{
logger.error("The node that failed to query the current task during the previous cycle is curMissionId="+curMissionId+" abnormal", e);
}
return assignFailSeqIds.toString();
}
//查询当前任务的执行节点中上一周期下发失败的节点
private String getAssignSuccessSeqIdsByMiss(Long curMissionId) {
StringBuffer assignFailSeqIds = new StringBuffer(",");
try
{
if(curMissionId!=null) {
ArrayList<String> nodeFields = new ArrayList<String>();
StringBuffer nodeSQL = new StringBuffer();
//查询任务下发节点
nodeFields.add("seq_id");
nodeSQL.append(" select distinct mrt4.seq_id from mission_result_table4 mrt4 ");
nodeSQL.append(" where mrt4.mission_id in( ");
nodeSQL.append(" select lst.cur_mission_id ");//查找当前周期之前所有周期的任务id
nodeSQL.append(" from loopmission_state_table lst ");
nodeSQL.append(" where lst.mission_id = ( ");
nodeSQL.append(" select lstTmp.mission_id ");
nodeSQL.append(" from loopmission_state_table lstTmp ");
nodeSQL.append(" where lstTmp.cur_mission_id="+curMissionId+")");
nodeSQL.append(" and lst.cur_mission_id<"+curMissionId);
nodeSQL.append(" ) and mrt4.result in (0,40,50,60,70,80) ");//查一定 下发成功 的节点,对于result=1result_detail=41的也可能是下发失败周期任务超时时将3修改为1不过这种情况影响不大
// nodeSQL.append(" ) and ( mrt4.result in (0,40,50,60,70,80) or ");//查一定 下发成功 的节点
// nodeSQL.append(" (mrt4.result=1 and (mrt4.result_detail is null or mrt4.result_detail !=41))");
// nodeSQL.append(" )");
ArrayList<Map<String, String>> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields);
if(nodeMapList != null && nodeMapList.size()>0){
for(Map<String, String> map : nodeMapList){
if(StringUtils.isNotEmpty(map.get("seq_id"))){
assignFailSeqIds.append(map.get("seq_id")+",");
}
}
}
}
} catch (Exception e)
{
logger.error("The node that succeeds in the last cycle of the execution node for the current task is querying,curMissionId="+curMissionId+" abnormal", e);
}
return assignFailSeqIds.toString();
}
/**
* 统计周期任务中执行节点全都不通的情况:
* 1.最近的一个周期1-41 或者 3多次下发也没关系NC会自动过滤不会多次执行
* 2.更新loop表的state2 or 4
*
*/
public List<String> checkLoopMissAssignFail() {
List<String> assignFailMissIds = new ArrayList<String>();
try
{
ArrayList<String> missFields = new ArrayList<String>();
StringBuffer missSQL = new StringBuffer();
//查询任务下发节点
missFields.add("mission_id");
missFields.add("cur_mission_id");
missFields.add("nodeNum");
missFields.add("assignFailNum");
missFields.add("node_groups_id");
missFields.add("node_ips_id");
Date sysdateD = new Date();
String sysdate = format.format(sysdateD);//为了统一时间都去DC的时间
//查找所有节点都不通的周期任务相关的信息
missSQL.append(" select tmp.mission_id,tmp.maxCurMissId cur_mission_id,tmp.nodeNum,tmp.assignFailNum,mpt4.node_groups_id,mpt4.node_ips_id ");
missSQL.append(" from ( ");
missSQL.append(" select tmp1.mission_id,tmp1.maxCurMissId,count(*) nodeNum, ");
missSQL.append(" sum(case when mrt4.result=1 and mrt4.result_detail=41 then 1 else 0 end) assignFailNum ");
missSQL.append(" from ");
missSQL.append(" ( ");
missSQL.append(" select mst.mission_id,max(lst.cur_mission_id) maxCurMissId ");
missSQL.append(" from mission_state_table mst ");
missSQL.append(" left join loopmission_state_table lst on lst.mission_id=mst.mission_id ");
missSQL.append(" left join mission_result_table4 mrt4 on mrt4.mission_id=lst.cur_mission_id ");
missSQL.append(" where mst.mission_type=4 and mst.is_loop=1 and mst.end_time>to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') ");//对于过期的loop表的state为未能执行
missSQL.append(" and mst.mission_state=2 ");//总任务状态为执行中
missSQL.append(" and lst.mission_state in (3,2) ");//中间有未能执行的也没关系只要执行完成的最新的一个周期是都不通就认为都不通。如果加上2的状态则下发中的周期就不会认为是网络都不通的情况这样就不会再去下发了所以还是要加2的状态的
missSQL.append(" group by mst.mission_id ");
missSQL.append(" )tmp1 ");
missSQL.append(" left join mission_result_table4 mrt4 on mrt4.mission_id=tmp1.maxCurMissId ");
missSQL.append(" group by tmp1.mission_id,tmp1.maxCurMissId ");
missSQL.append(" )tmp");
missSQL.append(" left join mission_parameter_table4 mpt4 on mpt4.mission_id = tmp.mission_id ");
missSQL.append(" left join loopmission_state_table lst2 on lst2.cur_mission_id=tmp.maxCurMissId ");
missSQL.append(" where tmp.nodeNum=assignFailNum and tmp.mission_id is not null and tmp.maxCurMissId is not null ");
ArrayList<Map<String, String>> missMapList = dao.dbSelect(missSQL.toString(), missFields);
//有记录就说明存在全部通的周期任务
if(missMapList != null && missMapList.size()>0){
String initRltCurMissIdSql = " select case when lst.end_time>to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') and lst.start_time<=to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') then lst.cur_mission_id end toAssign ," +//下发失败后,再次下发时,要在周期时间内,不在周期时间内,不进行下发
" case when lst.end_time<=to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') then lst.cur_mission_id end assignFail " +
" from loopmission_state_table lst " +
" left join mission_state_table mst on mst.mission_id=lst.mission_id " +
" left join mission_result_table4 mrt4 on lst.cur_mission_id=mrt4.mission_id " +
" where lst.mission_id=? and lst.cur_mission_id>? and mrt4.result is null and mst.mission_state in (2,6)"+//总任务状态为已完成的就不初始化结果了
" and (lst.end_time<=to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') or (lst.start_time<=to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') and lst.end_time>to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') ))" +//下发失败后,再次下发时,要在周期时间内,不在周期时间内,不进行下发
" order by toAssign asc";
ArrayList<String> curMissFields = new ArrayList<String>();
curMissFields.add("toAssign");
curMissFields.add("assignFail");
for(Map<String, String> map : missMapList){
if(StringUtils.isNotEmpty(map.get("mission_id"))){
assignFailMissIds.add(map.get("mission_id"));
//初始化任务结果:下发中
Long missId = Long.parseLong(map.get("mission_id"));
Long curMissId = Long.parseLong(map.get("cur_mission_id"));
MissionStateTable mission = this.getMessionById(missId);
String nodeGroupIds = map.get("node_groups_id");
String nodeIds = map.get("node_ips_id");
//如果已经有结果了,就不要再进行插入结果,过了时间的周期直接默认插入下发失败的结果:因为是全不通,所以要所有节点都插入下发中的结果
ArrayList<Map<String, String>> missCurMissMapList = dao.dbSelect(initRltCurMissIdSql, curMissFields, missId,curMissId);
boolean assignOneFlag = true;
if(missCurMissMapList!=null && missCurMissMapList.size()>0) {
for(Map<String, String> mapTmp : missCurMissMapList){
LoopMissionRoundInfo roundInfo = null;
if(StringUtils.isNotBlank(mapTmp.get("toAssign")) && assignOneFlag) {//初始化下发结果:只初始化最近的未过期的一个周期,可能周期未执行完毕
//未过期的,下发
Long toAssignCurMissId = Long.parseLong(mapTmp.get("toAssign"));
//-- 轮次校验和初始化
checkAndInitMissionCycle(mission);
//-- 获取当前周期轮次
List<LoopMissionRoundInfo> roundInfoList = Common.getLoopMissionRoundInfoList().get(missId);
if(roundInfoList !=null && roundInfoList.size()>0){
//-- 获取当前周期轮次
for (Iterator<LoopMissionRoundInfo> roundIte = roundInfoList.iterator(); roundIte.hasNext();) {
roundInfo = roundIte.next();
if(roundInfo.getEndTime().compareTo(sysdateD)==1 ){//大于
break;
}
}
logger.info("当前轮次的id"+roundInfo.getCurMissionId()+",主id"+missId);
}
//-- 预置状态的轮次,初始化当前轮次的结果数据
if(roundInfo!=null && roundInfo.getMissionState()!=null && roundInfo.getMissionState().longValue()==0l || roundInfo.getMissionState().longValue()==1l){ //0 预置状态,未初始化当前轮次的任务结果信息
initLoopMissionForAssignFail(toAssignCurMissId,nodeGroupIds,nodeIds,3,null);//初始化无需下发的结果信息 3开始执行 40已下发,修改loop表的状态为执行中2
roundInfo.setMissionState(2l); //更新缓存中的任务轮次信息状态
}
assignOneFlag = false;//只将符合条件无结果周期结束时间未过的最小的一个周期的执行结果修改为下发中3
continue;
}
if(StringUtils.isNotBlank(mapTmp.get("assignFail"))) {//过期的都初始化为4
Long assignFailCurMissId = Long.parseLong(mapTmp.get("assignFail"));
//-- 轮次校验和初始化
checkAndInitMissionCycle(mission);
//-- 获取当前周期轮次
List<LoopMissionRoundInfo> roundInfoList = Common.getLoopMissionRoundInfoList().get(missId);
if(roundInfoList !=null && roundInfoList.size()>0){
//-- 获取当前周期轮次
for (Iterator<LoopMissionRoundInfo> roundIte = roundInfoList.iterator(); roundIte.hasNext();) {
roundInfo = roundIte.next();
if(roundInfo.getEndTime().compareTo(sysdateD)==1 ){//大于
break;
}
}
}
//过期的,插入结果
if(roundInfo!=null) {
updateLoopMissionState(assignFailCurMissId, 4);//修改loop表的状态为未能执行4不需要插入结果了就
roundInfo.setMissionState(4l);
}
continue;
}
}
}
}
}
}
} catch (Exception e)
{
logger.error("In the statistical periodic task, the execution nodes are all blocked", e);
}
return assignFailMissIds;
}
/**
* 针对任务已创建状态的任务为其初始化结果集
* 最大精确到组的任务结果记录插入
* @time Oct 25, 2011-11:00:08 AM
* @param curMissionId 任务Id
* @param systemId 系统Id
*/
public void initLoopMissionResults(Long curMissionId,String groupsId,String nodeIpsId,int resultValue) throws Exception{
if(curMissionId==null || curMissionId.longValue()==0){
return;
}
ArrayList<String> fields = new ArrayList<String>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_state from loopmission_state_table mst where mst.cur_mission_id = "+curMissionId.longValue()+" and mst.mission_state<>3");
fields.add("mission_state");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!= null && rs.size()>0){
if(rs.get(0)!=null && StringUtils.isNotEmpty(rs.get(0).get("mission_state")) && ("2".equals(rs.get(0).get("mission_state").trim()) || "6".equals(rs.get(0).get("mission_state").trim()))){
return;
}
}
} catch (Exception e) {
logger.error("",e);
}
searchSQL.delete(0,searchSQL.length());
searchSQL.append("select distinct nt.seq_id ");
searchSQL.append("from node_table nt ");
searchSQL.append("where 1=1 ");
searchSQL.append(" and nvl(nt.seq_id,-1)<> -1 ");
searchSQL.append(" and nt.node_state = 0 ");
if(StringUtils.isNotBlank(nodeIpsId)){
searchSQL.append(" and nt.NODE_ID in("+nodeIpsId+") ");
}else{
if(StringUtils.isNotBlank(groupsId)){
// searchSQL.append(" and nt.node_group_id in( select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 start with nt.group_id in ("+groupsId+") connect by prior nt.group_id = nt.parent_group_id )");
//@2018年4月26日15:57:27 适配mysql 数据库
String startWithConnectBy = dao.startWithConnectBy("select nt.group_id from NODEGROUP_TABLE nt where nt.leaf_group = 1 ", " nt.group_id in ("+groupsId+") ", "group_id", "parent_group_id");
searchSQL.append(" and nt.node_group_id in( "+startWithConnectBy+")");
}
}
// searchSQL.append(getIpnSelect());
fields.clear();
fields.add("seq_id");
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 循环插入结果信息
dao.setAutoCommit(false);
if(rs!=null && rs.size()>0){
String sql = " insert into mission_result_table4 (mission_id,seq_id,result) values (?,?,?)";
LinkedList<String []> params = new LinkedList<String[]>();
for(Map<String, String> maps : rs){
params.add(new String[]{curMissionId.longValue()+"",maps.get("seq_id")+"",resultValue+""});
}
//-- 修改任务状态为 mission_state = 1 以创建 BUG loop state =5 的情况
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 1 where mst.cur_mission_id="+curMissionId.longValue());
dao.dbUpdateByBatch(sql, params);
}
dao.commit();
} catch (Exception e) {
try {
dao.rollback();
} catch (Exception e1) {
logger.error("",e1);
}
logger.error("",e);
}finally{
dao.clearConn();
}
}
public Task1 getTask1ById(Long missionId){
if(missionId == null || missionId.longValue() == 0){
return null;
}
Task1 task1 = new Task1();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mpt1.node_groups_id,mpt1.command_para,mpt1.NODE_IPS_ID ");
searchSQL.append("from mission_parameter_table1 mpt1 ");
searchSQL.append("where mpt1.mission_Id='"+missionId.longValue()+"' ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("node_groups_id");
fields.add("NODE_IPS_ID");
fields.add("command_para");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
Map<String, String> maps = rs.get(0);
task1.setTaskParam(StringUtils.isEmpty(maps.get("command_para"))?null: maps.get("command_para"));
task1.setNodeGroupsId(StringUtils.isEmpty(maps.get("node_groups_id"))?null: maps.get("node_groups_id"));
task1.setNodeIpsId(StringUtils.isEmpty(maps.get("NODE_IPS_ID"))?null: maps.get("NODE_IPS_ID"));
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return task1;
}
public String getHostIpByMissionId(Long mId){
String hostIp = null;
StringBuffer searchSQL = new StringBuffer();
ArrayList<String> fields = new ArrayList<String>();
fields.add("system_ip");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect("select st.system_ip from system_table st,mission_state_table mst where mst.system_id = st.system_id and mst.mission_id='"+mId.longValue()+"'", fields);
if(rs!=null && rs.size()>0){
Map<String, String> map = (Map<String, String>) rs.get(0);
hostIp = StringUtils.isEmpty(map.get("system_ip"))?null:StringUtils.trim(map.get("system_ip"));
}
} catch (Exception e) {
logger.error("MissionId is"+mId+" ServerIp acquisition failure",e);
}
if(StringUtils.isEmpty(hostIp)){
logger.error("missionId is"+mId+" ServerIp is empty");
}
return hostIp;
}
public String getHostIpBySystemId(Long systemId){
String hostIp = null;
StringBuffer searchSQL = new StringBuffer();
ArrayList<String> fields = new ArrayList<String>();
fields.add("system_ip");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect("select st.system_ip from system_table st where st.system_id='"+systemId.longValue()+"'", fields);
if(rs!=null && rs.size()>0){
Map<String, String> map = (Map<String, String>) rs.get(0);
hostIp = StringUtils.isEmpty(map.get("system_ip"))?null:StringUtils.trim(map.get("system_ip"));
}
} catch (Exception e) {
logger.error("SystemId 为:"+systemId+" ServerIp acquisition failure",e);
}
if(StringUtils.isEmpty(hostIp)){
logger.error("SystemId 为:"+systemId+" ServerIp is empty");
}
return hostIp;
}
public List<FileComment> getMissionFileInformations(Long missionId){
List<FileComment> pushFileList = new LinkedList<FileComment>();
StringBuffer searchSQL = new StringBuffer();
ArrayList<String> fields = new ArrayList<String>();
fields.add("file_name");
fields.add("md5_value");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect("select mfi.file_name,mfi.md5_value from mission_file_information mfi where mfi.mission_id='"+missionId.longValue()+"' order by mfi.id asc", fields);
if(rs!=null && rs.size()>0){
for (Iterator iterator = rs.iterator(); iterator.hasNext();) {
Map<String, String> map = (Map<String, String>) iterator.next();
// String[] strings = new String[]{map.get("file_name"),map.get("md5_value")};
pushFileList.add(new FileComment(map.get("file_name"),0,0,map.get("md5_value")));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return pushFileList;
}
public List<FileComment> getMissionFileInformations2(Long missionId){
List<FileComment> pushFileList = new LinkedList<FileComment>();
StringBuffer searchSQL = new StringBuffer();
ArrayList<String> fields = new ArrayList<String>();
fields.add("file_name");
fields.add("md5_value");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect("select mfi.file_name,mfi.md5_value from mission_file_information mfi where mfi.mission_id='"+missionId.longValue()+"' order by mfi.id asc", fields);
if(rs!=null && rs.size()>0){
for (Iterator iterator = rs.iterator(); iterator.hasNext();) {
Map<String, String> map = (Map<String, String>) iterator.next();
// String[] strings = new String[]{map.get("file_name"),map.get("md5_value")};
pushFileList.add(new FileComment(map.get("file_name"),0,0,map.get("md5_value")));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return pushFileList;
}
public boolean checkFileIntegrity(String fileSrc,String md5Val){
File file = new File(fileSrc);
try {
//不存在 Return false
if(!file.exists()){
return false;
}
//比较MD5值
String md5Val0 = MD5Util.getFileMD5String(file);
if(!md5Val0.equals(md5Val)){
file.delete();
return false;
}else
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public Task4 getTask4ById(Long missionId){
if(missionId == null || missionId.longValue() == 0){
return null;
}
Task4 task4 = new Task4();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mpt4.command_Type, ");
searchSQL.append("mpt4.command_ename, ");
searchSQL.append("mpt4.command_para, ");
searchSQL.append("mpt4.node_groups_id, ");
searchSQL.append("mpt4.NODE_IPS_ID, ");
searchSQL.append("mpt4.max_return, ");
searchSQL.append("mpt4.version ");
searchSQL.append("from mission_parameter_table4 mpt4 ");
searchSQL.append("where mpt4.mission_Id='"+missionId.longValue()+"' ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("command_Type");
fields.add("command_ename");
fields.add("command_para");
fields.add("node_groups_id");
fields.add("NODE_IPS_ID");
fields.add("version");
ArrayList<Map<String, String>> rs = null;
// MissionResult result = new MissionResult();
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
String split = ";";
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
Map<String, String> maps = rs.get(0);
task4.setCommandName(maps.get("command_ename"));
task4.setCommandType(StringUtils.isEmpty(maps.get("command_Type"))?null:Long.parseLong(maps.get("command_Type")));
task4.setVersion(StringUtils.isEmpty(maps.get("version"))?null:Long.parseLong(maps.get("version")));
task4.setNodeGroupsId(StringUtils.isEmpty(maps.get("node_groups_id"))?null:maps.get("node_groups_id"));
task4.setNodeIpsId(StringUtils.isEmpty(maps.get("NODE_IPS_ID"))?null:maps.get("NODE_IPS_ID"));
if(StringUtils.isNotEmpty(maps.get("command_para"))){
StringBuffer newStrs = new StringBuffer();
String[] strs = maps.get("command_para").split(";");
for(String str : strs){
if(DateUtil.isDate(str,Constants.COMMON_DATE_FORMAT)){
newStrs.append(split+format.parse(str).getTime());
}else{
newStrs.append(split+str);
}
}
newStrs = newStrs.length()>0?newStrs.delete(0, split.length()):newStrs;
task4.setCommandParam(newStrs.toString());
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return task4;
}
public Task6 getTask6ById(Long missionId){
if(missionId == null || missionId.longValue() == 0){
return null;
}
Task6 task6 = new Task6();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mpt6.command_Type, ");
searchSQL.append("mpt6.command_ename, ");
searchSQL.append("mpt6.command_para, ");
searchSQL.append("mpt6.node_groups_id, ");
searchSQL.append("mpt6.NODE_IPS_ID, ");
searchSQL.append("mpt6.source_path, ");
searchSQL.append("mpt6.target_path, ");
searchSQL.append("mpt6.check_value, ");
searchSQL.append("mpt6.old_task_id, ");
searchSQL.append("to_char(mpt6.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time, ");
searchSQL.append("mpt6.version ");
searchSQL.append("from mission_parameter_table6 mpt6 ");
searchSQL.append("where mpt6.mission_Id='"+missionId.longValue()+"' ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("command_Type");
fields.add("command_ename");
fields.add("command_para");
fields.add("source_path");
fields.add("target_path");
fields.add("check_value");
fields.add("start_time");
fields.add("node_groups_id");
fields.add("NODE_IPS_ID");
fields.add("old_task_id");
fields.add("version");
ArrayList<Map<String, String>> rs = null;
// MissionResult result = new MissionResult();
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
// String split = ";";
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
Map<String, String> maps = rs.get(0);
task6.setCommandName(maps.get("command_ename"));
task6.setCommandType(StringUtils.isEmpty(maps.get("command_Type"))?null:Long.parseLong(maps.get("command_Type")));
task6.setCommandParam(maps.get("command_para"));
task6.setVersion(StringUtils.isEmpty(maps.get("version"))?null:Long.parseLong(maps.get("version")));
task6.setNodeGroupsId(StringUtils.isEmpty(maps.get("node_groups_id"))?null:maps.get("node_groups_id"));
task6.setNodeIpsId(StringUtils.isEmpty(maps.get("NODE_IPS_ID"))?null:maps.get("NODE_IPS_ID"));
task6.setOldTaskId(StringUtils.isEmpty(maps.get("old_task_id"))?null:Long.parseLong(maps.get("old_task_id")));
task6.setFileName(maps.get("source_path"));
task6.setDestPath(maps.get("target_path"));
task6.setMd5Value(maps.get("check_value"));
task6.setUpgradeTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")).getTime());
// if(StringUtils.isNotEmpty(maps.get("command_para"))){
// StringBuffer newStrs = new StringBuffer();
// String[] strs = maps.get("command_para").split(";");
// for(String str : strs){
// if(DateUtil.isDate(str,Constants.COMMON_DATE_FORMAT)){
// newStrs.append(split+format.parse(str).getTime());
// }else{
// newStrs.append(split+str);
// }
// }
// newStrs = newStrs.length()>0?newStrs.delete(0, split.length()):newStrs;
// }
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return task6;
}
/**
* @time Oct 25, 2011-11:00:08 AM
* 文件推送任务 执行结果查询
* 文件推送结果 result 的值有
* 3 任务信息下发中
* 40 任务信息下发成功信息有NMSAgent端提供
* 41 任务信息下发失败信息有DataController端提供
* @param missionId 任务Id
* @param missionState 任务的状态
*
*/
public ArrayList<MissionResult> getMissionResultsForTask(long missionId,int missionType){
if(missionType==0 || missionId == 0l){
return null;
}
ArrayList<MissionResult> mrList = new ArrayList<MissionResult>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mrt.mission_id, ");
searchSQL.append("nt.node_ip, ");
searchSQL.append("mrt.seq_id, ");
searchSQL.append("nvl(mrt.result,3) result ");
searchSQL.append("from mission_result_table"+missionType+" mrt ");
searchSQL.append("left join (select distinct node_ip,ipn,seq_id from node_table n ) nt on nt.seq_id=mrt.seq_id ");
searchSQL.append("where mrt.mission_id = "+missionId+" ");
searchSQL.append("and nvl(mrt.result,3) =3 ");
searchSQL.append(getIpnSelect());
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("node_ip");
fields.add("result");
fields.add("seq_id");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionResult result = new MissionResult();
result.setMissionId(Long.parseLong(maps.get("mission_id")));
result.setNodeIp(maps.get("node_ip"));
result.setUuid(maps.get("seq_id")==null ? null:Long.parseLong(maps.get("seq_id")));
result.setResult(maps.get("result")==null ? null:Long.parseLong(maps.get("result")));
mrList.add(result);
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mrList;
}
/**
* @time Oct 25, 2011-11:00:08 AM
* 文件推送任务 执行结果查询
* 文件推送结果 result 的值有
* 3 任务信息下发中
* 40 任务信息下发成功信息有NMSAgent端提供
* 41 任务信息下发失败信息有DataController端提供
* @param missionId 任务Id
* @param missionState 任务的状态
*
*/
public ArrayList<MissionResult> getMissionResultsForLoopTask(long missionId,int missionType,Integer resultVal){
if(missionType==0 || missionId == 0l){
return null;
}
ArrayList<MissionResult> mrList = new ArrayList<MissionResult>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mrt.mission_id, ");
searchSQL.append("nt.node_ip, ");
searchSQL.append("mrt.seq_id, ");
searchSQL.append("nvl(mrt.result,3) result ");
searchSQL.append("from mission_result_table"+missionType+" mrt ");
searchSQL.append("left join loopmission_state_table lmst on lmst.cur_mission_id = mrt.mission_id ");
searchSQL.append("left join (select distinct node_ip,ipn,seq_id from node_table n) nt on nt.seq_id=mrt.seq_id ");
searchSQL.append("where lmst.mission_id = "+missionId+" ");
if(resultVal != null){
searchSQL.append("and nvl(mrt.result,3) ="+resultVal.intValue());
}
searchSQL.append(getIpnSelect());
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("node_ip");
fields.add("result");
fields.add("seq_id");
ArrayList<Map<String, String>> rs = null;
try {
logger.debug(searchSQL.toString());
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionResult result = new MissionResult();
result.setMissionId(Long.parseLong(maps.get("mission_id")));
result.setNodeIp(maps.get("node_ip"));
result.setUuid(maps.get("seq_id")==null ? null:Long.parseLong(maps.get("seq_id")));
result.setResult(maps.get("result")==null ? null:Long.parseLong(maps.get("result")));
mrList.add(result);
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mrList;
}
//获取
public ArrayList<MissionResult> getMissionResultsForLoopTaskByCurMissId(long curMissionId,Integer resultVal){
int missionType = 4;
if(curMissionId == 0l || resultVal==null){
return null;
}
ArrayList<MissionResult> mrList = new ArrayList<MissionResult>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mrt.mission_id, ");
searchSQL.append("nt.node_ip, ");
searchSQL.append("mrt.seq_id, ");
searchSQL.append("mrt.result result ");
searchSQL.append("from mission_result_table"+missionType+" mrt ");
// searchSQL.append("left join loopmission_state_table lmst on lmst.cur_mission_id = mrt.mission_id ");
searchSQL.append("left join (select distinct node_ip,ipn,seq_id from node_table n) nt on nt.seq_id=mrt.seq_id ");
searchSQL.append("where mrt.mission_id = "+curMissionId+" ");
if(resultVal != null){
searchSQL.append("and mrt.result ="+resultVal.intValue());
}
searchSQL.append(getIpnSelect());
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("node_ip");
fields.add("result");
fields.add("seq_id");
ArrayList<Map<String, String>> rs = null;
try {
logger.debug(searchSQL.toString());
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionResult result = new MissionResult();
result.setMissionId(Long.parseLong(maps.get("mission_id")));
result.setNodeIp(maps.get("node_ip"));
result.setUuid(maps.get("seq_id")==null ? null:Long.parseLong(maps.get("seq_id")));
result.setResult(maps.get("result")==null ? null:Long.parseLong(maps.get("result")));
mrList.add(result);
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mrList;
}
/**
* 批量更新任务结果方法业务流程
* 1检查数据完整性任务ID任务类型SeqID任务结果 均不能为空
* 2数据规整
* 周期任务结果处理流程判定 loopFlag 为1或-1
* 2.1获取 获取任务轮次信息
* 2.2规整数据
* 非周期任务结果处理流程
*
* @time Nov 16, 2011-2:00:46 PM
* @param mr2List
*/
public void updateMissionResult2ByBatch(int missiontype,List<MissionResult2> mr2List) throws Exception {
List<String[]> params = new ArrayList<String[]>();
//-try{}finally{} 用于清理数据库连接
try {
//-任务结果List 非空判断
if(mr2List!= null && mr2List.size()>0){
//- 声明 本次业务操作的各对象变量
EmailService emailService = new EmailService(dao); //邮件功能
String sql = getUpdateSQL(missiontype); //获取更新sql
int count = 0; //计数器
StringBuffer cancelMissionStore = new StringBuffer(","); //撤销任务ID暂存
List<MissionStateTable> loopMissionIdofInsertRltList = new ArrayList<MissionStateTable>();//记录有结果录入的周期任务的总id并进行轮次检查和更新因为如果没轮次了再检测可能任务的总状态就被统计为已完成了之后的结果也就不会被统计上了
//- 遍历任务结果集
Iterator<MissionResult2> mrIte = mr2List.iterator();
while (mrIte.hasNext()) {
/* 任务结果: 完整性校验、数据规整、保存 等操作 */
MissionResult2 mr = (MissionResult2) mrIte.next();
//- 完整性校验:
if(mr == null){ //无效跳过
continue;
}
if(mr.getMissionId() ==null
|| mr.getMissionType() == null
|| mr.getUuid() ==null
// || mr.getResult() == null //结果为空时触发器会采用之前的结果回传文件的结果信息result为null所以之前的回传文件都为空
){ //无效跳过
continue;
}
//- 数据规整:周期任务判断及处理
//- 任务类型4 周期任务结果处理 标识判断loopFlag: 1周期任务标识 -1:Agent无法判断任务类型先尝试按周期任务处理
Long resultsMissionId = mr.getMissionId();
if(mr.getMissionType().longValue() == 4l
&& mr.getLoopFlag()!= null
&& (mr.getLoopFlag().longValue()==1l || mr.getLoopFlag().longValue()==-1l)){
//-- 获取任务
MissionStateTable mission = Common.getLoopMissionInfoMap().get(mr.getMissionId());//总任务id
loopMissionIdofInsertRltList.add(mission);
if(mission==null){
mission = getMessionById(mr.getMissionId());
Common.getLoopMissionInfoMap().put(mr.getMissionId(),mission);
}
LoopMissionRoundInfo roundInfo = this.getRoundInfoFromCommonList(mr);
if(roundInfo == null){
//-- 检查并预置轮次信息(执行撤销时不再运行)
if(mission.getMissionState()!=6l && mission.getMissionState()!=7l){
checkAndInitMissionCycle(mission); //检查预置轮次数
}else{
this.updateLoopMissionRoundInfo(Common.getLoopMissionRoundInfoList(), mission.getMissionId()); //更新指定周期任务ID的轮次信息
}
//-- 再次获取 缓存中的信息 否则 查询数据库(比较旧的轮次信息情况)
roundInfo = this.getRoundInfoFromCommonList(mr);
if(roundInfo ==null){
roundInfo = this.getRoundInfoFromDB(mr);
//-- 该任务的轮次信息不存在 通过loopFlag 判断是否继续执行保存
/* loopFlag 为1 周期任务结果,则抛弃,为-1 未知情况,继续非周期任务信息结果的处理 */
if(roundInfo == null){
if(mr.getLoopFlag().longValue()==1l ){ //无效的 周期任务数据 抛弃
logger.warn("Unable to find cycle information of the cycle task result information 【"+(JSONObject.fromObject(mr).toString())+"");
continue;
}else{ //Agent无法判断任务类型 可能为一次性执行的任务
// logger.info("对应的 roundInfo is null"+(JSONObject.fromObject(mr).toString()));
}
}else{
List<LoopMissionRoundInfo> rList = Common.getLoopMissionRoundInfoList().get(mr.getMissionId());
if(rList == null){
rList = new LinkedList<LoopMissionRoundInfo>();
Common.getLoopMissionRoundInfoList().put(mr.getMissionId(),rList);
}
rList.add(0, roundInfo);
}
}
}
//-- 当前轮次校验
if(roundInfo!=null && roundInfo.getMissionState().longValue() == 0l){ //结果未被初始化,周期内仅执行一次
// MissionStateTable mission = Common.getLoopMissionInfoMap().get(mr.getMissionId());
initLoopMissionResults2(roundInfo.getCurMissionId(), mission.getNodeGroupsId(),mission.getNodeIpsId(),40);//初始化无需下发的结果信息 3开始执行 40已下发
updateLoopMissionState(roundInfo.getCurMissionId(), 2);
roundInfo.setMissionState(2l);
// checkAndInitMissionCycle(mission); //检查预置轮次数
}else
if(roundInfo!=null && roundInfo.getMissionState().longValue() == 1l){ //结果已经初始化,周期内仅执行一次
// MissionStateTable mission = Common.getLoopMissionInfoMap().get(mr.getMissionId());
updateLoopMissionState(roundInfo.getCurMissionId(), 2);
roundInfo.setMissionState(2l);
// checkAndInitMissionCycle(mission); //检查预置轮次数
}
/**无法获取轮次信息的数据跳过
* */
if(roundInfo!=null){ //轮次周期 状态为“已创建”,这变更状态并初始化下一轮次
resultsMissionId = roundInfo.getCurMissionId().longValue();
}
logger.debug("MissionResult2 missionId 变更 :>"+(mr.getMissionId()+" ---> "+roundInfo.getCurMissionId().longValue()));
if(mission.getMissionState().longValue()==6){
//-- 检查是否已发出通知
if(roundInfo!=null){
if(cancelMissionStore.indexOf(","+mr.getUuid()+":"+mr.getMissionId()+",")==-1){
cancelMissionStore.append(mr.getUuid()+":"+mr.getMissionId()+",");
if(mr.getResult()==null || (mr.getResult().longValue() != 6l && mr.getResult().longValue() != 7l )){
MissionResult result = new MissionResult();
result.setUuid(mr.getUuid());
Common.sendMissionInfo(mission,new NMSClientTask4Cancel(Common.getNodeIpByUUID(mr.getUuid()),Constants.SSL_CLIENT_PORT,mission.getMissionId()),mr.getUuid(), 1,roundInfo.getStartTime().getTime(),roundInfo.getEndTime().getTime());
}
}
}
}
}
//-- 任务结果保存
String [] strs = null;
if(mr.getMissionType()!= null && mr.getMissionType().longValue()==4l){
strs = new String[6];
strs[0] = mr.getResult()==null?null:mr.getResult()+"";
strs[1] = (StringUtils.isEmpty(mr.getDescription()) || "null".equalsIgnoreCase(mr.getDescription()))?"":(mr.getDescription()+"\n");
strs[2] = mr.getFileInfo();
strs[3] = mr.getResultDetail()==null?null:mr.getResultDetail()+"";
strs[4] = resultsMissionId.longValue()+"";
strs[5] = mr.getUuid()+"";
if(StringUtils.isNotEmpty(strs[2])){
logger.debug("准备入库(含回传文件) "+Arrays.toString(strs));
}
}else{
strs = new String[4];
strs[0] = mr.getResult()==null?"":mr.getResult()+"";
strs[1] = (StringUtils.isEmpty(mr.getDescription()) || "null".equalsIgnoreCase(mr.getDescription()))?"":(mr.getDescription()+"\n");
strs[2] = mr.getMissionId()+"";
strs[3] = mr.getUuid()+"";
}
logger.debug("准备入库 "+Arrays.toString(strs));
params.add(strs);
count++;
//2013-6-24 hyx 注释以下代码某个节点的执行结果失败不发送邮件,任务最终完成后发一封邮件即可(包括统计信息,失败和成功节点数)
//-- 任务失败结果告警
/*
int result = mr.getResult()==null?-1:mr.getResult().intValue();
if(result == 1){ //需要告警
emailService.sendEmailForMissionBySeqId(mr.getMissionId(),missiontype, mr.getUuid(), createEmailInfoForFailResult(mr));
}
*/
if(count == Constants.DB_EXECUTE_BATCH){
dao.dbUpdateByBatch(sql, params);
count = 0;
params.clear();
}
}
if(loopMissionIdofInsertRltList!=null && loopMissionIdofInsertRltList.size()>0) {//说明有周期任务的结果入库,就需要检测周期任务的轮次
for(MissionStateTable missTmp:loopMissionIdofInsertRltList) {
//-- 检查并预置轮次信息(执行撤销时不再运行)
if(missTmp!=null) {
if(missTmp.getMissionState()!=null
&& missTmp.getMissionState()!=6l && missTmp.getMissionState()!=7l){
checkAndInitMissionCycle(missTmp); //检查预置轮次数
}else{
this.updateLoopMissionRoundInfo(Common.getLoopMissionRoundInfoList(), missTmp.getMissionId());//更新指定周期任务ID的轮次信息(从数据库到缓存)
}
}
}
}
if (count > 0) {
dao.dbUpdateByBatch(sql, params);
count = 0;
params.clear();
}
}
logger.info("任务结果批量入库保存完成");
// } catch (Exception e) {
// logger.error("批量更新异常 \n"+"",e);
}finally{
dao.clearConn();
}
}
public static void main(String []args){
CommonDao dao;
try {
BoneCPPool.initPool();
dao = new CommonDao();
UpgradeService service = new UpgradeService(dao);
service.updateLoopMissionInfo(Common.getLoopMissionInfoMap(), null);
Map<Long , MissionStateTable> loopMissionInfoMap = new HashMap<Long, MissionStateTable>();
loopMissionInfoMap = Common.getLoopMissionInfoMap();
System.out.println(Common.getLoopMissionInfoMap().size());
// service.updateLoopMissionComplete();
// service.getMissionForAgentStart(89l);
// service.checkTimeoutLoopMisssionAndAddResult();//测试:超时周期任务的检查
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//// service.checkAndUpdateMissionComplete() ;
//// service.checkAndUpdateLoopMissionComplete();
//// service.updateCommonMissionComplete();//任务状态成功31、部分成功32、全部失败30
//
// List<MissionResult2> mr2List = new ArrayList<MissionResult2>();
// mr2List.add(new MissionResult2(1274523l));
// mr2List.add(new MissionResult2(1274523l));
// mr2List.add(new MissionResult2(1274538l));
// mr2List.add(new MissionResult2(1274582l));
// mr2List.add(new MissionResult2(1274538l));
//
// service.updateCommonMissionStateDesc(1, mr2List);
// service.updateCommonMissionStateDesc(1, null);
// service.updateCommonMissionStateDesc(4, null);
// service.updateCommonMissionStateDesc(6, null);
// service.updateLoopMissionStateDesc(mr2List);
// service.getMissionForAgentStart(66l);
// service.updateLoopMissionInfo(Common.getLoopMissionInfoMap(), null);
// service.updateLoopMissionRoundInfo(Common.getLoopMissionRoundInfoList(), null);
// service.checkAndInitMissionCycle(Common.getLoopMissionInfoMap().get(1187604l));
}
public LoopMissionRoundInfo getRoundInfoFromCommonListByID(Long missionId,Long curMissionId){
List<LoopMissionRoundInfo> roundList = Common.getLoopMissionRoundInfoList().get(missionId);
if(roundList!= null && roundList.size()>0){
for (Iterator roundIte = roundList.iterator(); roundIte.hasNext();) {
LoopMissionRoundInfo roundInfo = (LoopMissionRoundInfo) roundIte.next();
if(curMissionId!=null && curMissionId.longValue() == roundInfo.getCurMissionId().longValue()){
return roundInfo;
}
}
}
return null;
}
public LoopMissionRoundInfo getRoundInfoFromCommonList(MissionResult2 mr){
List<LoopMissionRoundInfo> roundList = Common.getLoopMissionRoundInfoList().get(mr.getMissionId());
if(roundList!= null && roundList.size()>0){
// pl("mr.getMissionId()"+mr.getMissionId());
// pl("mr.getMissionType()"+mr.getMissionType());
// pl("mr.getLoopFlag()"+mr.getLoopFlag());
// pl("mr.getResult()"+mr.getResult());
// pl("mr.getUuid()"+mr.getUuid());
// pl("mr.getStartTime()"+mr.getStartTime());
// pl("mr.getEndTime()"+mr.getEndTime());
// pl("mr.getDescription()"+mr.getDescription());
// pl("mr.getFileInfo()"+mr.getFileInfo());
// pl("mr.getText()"+mr.getText());
if(mr.getResult()!= null &&(mr.getResult()==6 || mr.getResult()==7)){
return roundList.get(roundList.size()-1);
}else{
for (Iterator roundIte = roundList.iterator(); roundIte.hasNext();) {
LoopMissionRoundInfo roundInfo = (LoopMissionRoundInfo) roundIte.next();
if(mr.getStartTime()!=null && roundInfo.getStartTime().getTime()<= mr.getStartTime() && roundInfo.getEndTime().getTime()> mr.getStartTime()){
return roundInfo;
}
}
}
}
return null;
}
public LoopMissionRoundInfo getRoundInfoFromDBByID(Long curMissionId){
LoopMissionRoundInfo roundInfo = null;
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select lmst.cur_mission_id, ");
searchSQL.append("lmst.mission_id, ");
searchSQL.append("lmst.mission_state, ");
searchSQL.append("to_char(lmst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(lmst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time ");
searchSQL.append("from loopmission_state_table lmst ");
searchSQL.append("where 1=1 ");
searchSQL.append("and lmst.cur_mission_id = ? ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("cur_mission_id");
fields.add("mission_id");
fields.add("mission_state");
fields.add("start_time");
fields.add("end_time");
String [] params = new String[]{curMissionId.longValue()+""};
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields, params);
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
roundInfo = new LoopMissionRoundInfo();
roundInfo.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
roundInfo.setCurMissionId(StringUtils.isEmpty(maps.get("cur_mission_id"))?null:Long.parseLong(maps.get("cur_mission_id")));
roundInfo.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
roundInfo.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
roundInfo.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return roundInfo;
}
public LoopMissionRoundInfo getRoundInfoFromDB(MissionResult2 mr){
LoopMissionRoundInfo roundInfo = null;
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select lmst.cur_mission_id, ");
searchSQL.append("lmst.mission_id, ");
searchSQL.append("lmst.mission_state, ");
searchSQL.append("to_char(lmst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(lmst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time ");
searchSQL.append("from loopmission_state_table lmst ");
searchSQL.append("where lmst.mission_id=? ");
searchSQL.append("and lmst.start_time<=to_date(?,'"+Constants.DB_DATE_FORMAT+"') ");
// searchSQL.append("and lmst.end_time>=to_date(?,'"+Constants.DB_DATE_FORMAT+"') ");
/**
* 去掉sql语句中的等号的原因
* NC根据整个任务的开始和结束时间执行时有可能会比DC多一个周期最后一个周期不满设定的间隔时间因为DC将最后一个不满间隔的周期抛弃了而NC却执行了
* 所以此时如果NC的最后一个周期结果被收集过来首先判断缓存中是否有此轮次NC.startTime>=轮次.startTime && NC.startTime<轮次.endTime,
* 结果没有就会通过此sql从数据库中查找但是此时的 NC.startTime和轮次.endTime比较时就加了等号且比较的是日期格式的只比到了秒如果比较的是long格式NC.startTime肯定会大于最后一个周期的endTime可能不会出现等于的情况
* 所以NC最后一个周期的结果就入到了上一个周期里
*/
searchSQL.append("and lmst.end_time>to_date(?,'"+Constants.DB_DATE_FORMAT+"') ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("cur_mission_id");
fields.add("mission_id");
fields.add("mission_state");
fields.add("start_time");
fields.add("end_time");
// pl(mr.getMissionId());
// pl(mr.getUuid());
// pl(mr.getResult());
// pl(mr.getLoopFlag());
// pl(mr.getStartTime());
// pl(mr.getEndTime());
// pl(mr.getFileInfo());
// pl(mr.getDescription());
try {
logger.info("getRoundInfoFromDB方法mr.getStartTime()="+mr.getStartTime());
String startTime = new SimpleDateFormat(Constants.COMMON_DATE_FORMAT).format(mr.getStartTime());
String [] params = new String[]{mr.getMissionId()+"",startTime,startTime};
ArrayList<Map<String, String>> rs = null;
rs = dao.dbSelect(searchSQL.toString(), fields, params);
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
roundInfo = new LoopMissionRoundInfo();
roundInfo.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
roundInfo.setCurMissionId(StringUtils.isEmpty(maps.get("cur_mission_id"))?null:Long.parseLong(maps.get("cur_mission_id")));
roundInfo.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
roundInfo.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
roundInfo.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
}
}
} catch (Exception e) {
logger.error("Get the result corresponding to wheel information abnormal task type from DB"+mr==null?"":mr.getMissionType(),e);
}finally{
dao.clearConn();
}
return roundInfo;
}
/**
* 根据MissionID 更新指定的 周期任务信息
* @time Feb 10, 2012-2:23:35 PM
* @param missionInfoMap
* @param missionId
* @return
*/
public Map<Long, MissionStateTable> updateLoopMissionInfo(Map<Long, MissionStateTable> missionInfoMap,Long missionId) {
//-- 查询可执行的任务
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_id,");
searchSQL.append("mst.mission_type,");
searchSQL.append("mst.mission_state,");
searchSQL.append("mst.system_id,");
searchSQL.append("mst.group_id,");
searchSQL.append("mpt4.node_groups_id,");
searchSQL.append("mpt4.node_ips_id,");//2015-11-23 hyx 增加任务的节点信息由于之前只查询了节点组的信息所以在结果入库的时候以缓存中的周期任务信息的节点组和节点作为参数调用initLoopMissionResults2方法导致将节点组内所有的节点都进行了初始化如果新建任务的时候只选择了某些节点此处就出现问题了而其他地方如任务新建的时候调用initLoopMissionResults2的时候是直接已参数表的节点和节点为参数所以不会出现问题
searchSQL.append("to_char(mst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(mst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time,");
searchSQL.append("mst.is_loop,");
searchSQL.append("mst.loop_delay ");
searchSQL.append("from mission_state_table mst ");
searchSQL.append("left join mission_parameter_table4 mpt4 on mst.mission_id = mpt4.mission_id ");
searchSQL.append("where mst.end_time>sysdate ");
searchSQL.append("and mst.mission_state in (1,2,5,6) ");
searchSQL.append("and mst.is_loop = 1 ");
if(missionId!= null && missionId.longValue()!=0){
searchSQL.append("and mst.mission_id = '"+missionId.longValue()+"' ");
}
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_type");
fields.add("mission_state");
fields.add("system_id");
fields.add("group_id");
fields.add("node_groups_id");
fields.add("node_ips_id");
fields.add("start_time");
fields.add("end_time");
fields.add("is_loop");
fields.add("loop_delay");
ArrayList<Map<String, String>> rs = null;
ArrayList<MissionStateTable> mstList = new ArrayList<MissionStateTable>();
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionStateTable mission = new MissionStateTable();
mission.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
mission.setMissionType(StringUtils.isEmpty(maps.get("mission_type"))?null:Long.parseLong(maps.get("mission_type")) );
mission.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
mission.setSystemId(StringUtils.isEmpty(maps.get("system_id"))?null:Long.parseLong(maps.get("system_id")));
mission.setGroupId(StringUtils.isEmpty(maps.get("group_id"))?null:Long.parseLong(maps.get("group_id")));
mission.setNodeGroupsId(StringUtils.isEmpty(maps.get("node_groups_id"))?null:maps.get("node_groups_id"));
mission.setNodeIpsId(StringUtils.isEmpty(maps.get("node_ips_id"))?null:maps.get("node_ips_id"));
mission.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
mission.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
mission.setLoopFlag(StringUtils.isEmpty(maps.get("is_loop"))?null:Long.parseLong(maps.get("is_loop")));
mission.setLoopDelay(StringUtils.isEmpty(maps.get("loop_delay"))?null:Long.parseLong(maps.get("loop_delay")));
missionInfoMap.put(mission.getMissionId(), mission);
}
}
return missionInfoMap;
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return missionInfoMap;
}
//根据curMissionId查找主任务信息
public MissionStateTable getMissionInfoByCurMissionId(Long curMissionId) {
MissionStateTable mission = null;
if(curMissionId!=null) {
//-- 查询可执行的任务
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select mst.mission_id,");
searchSQL.append("mst.mission_type,");
searchSQL.append("mst.mission_state,");
searchSQL.append("mst.system_id,");
searchSQL.append("mst.group_id,");
searchSQL.append("mpt4.node_groups_id,");
searchSQL.append("to_char(mst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(mst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time,");
searchSQL.append("mst.is_loop,");
searchSQL.append("mst.loop_delay ");
searchSQL.append("from mission_state_table mst ");
searchSQL.append("left join mission_parameter_table4 mpt4 on mst.mission_id = mpt4.mission_id ");
searchSQL.append("left join loopmission_state_table lst on lst.mission_id = mst.mission_id ");
searchSQL.append("where mst.end_time>sysdate ");
searchSQL.append("and mst.mission_state in (1,2,5,6) ");
searchSQL.append("and mst.is_loop = 1 ");
searchSQL.append("and lst.cur_mission_id = "+curMissionId.longValue());
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_type");
fields.add("mission_state");
fields.add("system_id");
fields.add("group_id");
fields.add("node_groups_id");
fields.add("start_time");
fields.add("end_time");
fields.add("is_loop");
fields.add("loop_delay");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields);
if(rs!=null && rs.size()>0){
mission = new MissionStateTable();
Map<String, String> maps = rs.get(0);
mission.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
mission.setMissionType(StringUtils.isEmpty(maps.get("mission_type"))?null:Long.parseLong(maps.get("mission_type")) );
mission.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
mission.setSystemId(StringUtils.isEmpty(maps.get("system_id"))?null:Long.parseLong(maps.get("system_id")));
mission.setGroupId(StringUtils.isEmpty(maps.get("group_id"))?null:Long.parseLong(maps.get("group_id")));
mission.setNodeGroupsId(StringUtils.isEmpty(maps.get("node_groups_id"))?null:maps.get("node_groups_id"));
mission.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
mission.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
mission.setLoopFlag(StringUtils.isEmpty(maps.get("is_loop"))?null:Long.parseLong(maps.get("is_loop")));
mission.setLoopDelay(StringUtils.isEmpty(maps.get("loop_delay"))?null:Long.parseLong(maps.get("loop_delay")));
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
return mission;
}
/**
* 根据MissionID 更新指定的周期任务的轮次List 集合Map<Long, List<LoopMissionRoundInfo>> loopMissionRoundMap
* @time Feb 10, 2012-2:23:58 PM
* @param missionInfoMap
* @param missionId
* @return
*/
public void updateLoopMissionRoundInfo(Map<Long, List<LoopMissionRoundInfo>> loopMissionRoundMap,Long missionId) {
List<Long> mIdsList = new LinkedList<Long>();
if(missionId != null ){
//将missionId 加入周期任务队列已查询 周期数据
mIdsList.add(missionId);
}else{
//missionId为空时 进行非指定查询
String midsSql = "select mst.mission_id from mission_state_table mst where mst.is_loop = 1 and mst.mission_state in(1,2,5,6) and mst.end_time > to_date('"+format.format(new Date())+"','yyyy-MM-dd HH24:mi:ss') ";
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
try {
//将missionId们存入周期任务队列
ArrayList<Map<String, String>> rs = dao.dbSelect(midsSql, fields);
if(rs != null){
for (Iterator midsIte = rs.iterator(); midsIte.hasNext();) {
Map<String, String> midMap = (Map<String, String>) midsIte.next();
mIdsList.add(StringUtils.isEmpty(midMap.get("mission_id"))?0:Long.parseLong(midMap.get("mission_id")));
}
}
} catch (Exception e) {
logger.error("",e);
}
}
//终止无效操作
if(mIdsList.size()== 0){
return;
}
//循环查询周期数据
for (Iterator midsIte = mIdsList.iterator(); midsIte.hasNext();) {
Long mid = (Long) midsIte.next();
//-- 跳过无效操作
if(mid.longValue() == 0){
continue;
}
//-- 查询可执行的任务 将数据存入缓存集合
StringBuffer searchSQL = new StringBuffer();
if(Constants.IS_MYSQL){
searchSQL.append("select * from( ");
searchSQL.append("select lmst.cur_mission_id, ");
searchSQL.append("lmst.mission_id, ");
searchSQL.append("lmst.mission_state, ");
searchSQL.append("to_char(lmst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(lmst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time ");
searchSQL.append("from loopmission_state_table lmst ");
searchSQL.append("left join mission_state_table mst on mst.mission_id = lmst.mission_id ");
searchSQL.append("where 1=1 ");
// searchSQL.append("and rownum <=20 ");
searchSQL.append("and mst.mission_id = ?");
searchSQL.append("order by lmst.cur_mission_id desc");
searchSQL.append(" limit 20");
searchSQL.append(") ttt order by cur_mission_id asc");
}else{
searchSQL.append("select * from( ");
searchSQL.append("select lmst.cur_mission_id, ");
searchSQL.append("lmst.mission_id, ");
searchSQL.append("lmst.mission_state, ");
searchSQL.append("to_char(lmst.start_time,'"+Constants.DB_DATE_FORMAT+"') start_time,");
searchSQL.append("to_char(lmst.end_time,'"+Constants.DB_DATE_FORMAT+"') end_time ");
searchSQL.append("from loopmission_state_table lmst ");
searchSQL.append("left join mission_state_table mst on mst.mission_id = lmst.mission_id ");
searchSQL.append("where 1=1 ");
searchSQL.append("and rownum <=20 ");
searchSQL.append("and mst.mission_id = ?");
searchSQL.append("order by lmst.cur_mission_id desc");
searchSQL.append(") ttt order by cur_mission_id asc");
}
ArrayList<String> fields = new ArrayList<String>();
fields.add("cur_mission_id");
fields.add("mission_id");
fields.add("mission_state");
fields.add("start_time");
fields.add("end_time");
ArrayList<Map<String, String>> rs = null;
try {
rs = dao.dbSelect(searchSQL.toString(), fields,new String[]{mid.longValue()+""});
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
LoopMissionRoundInfo roundInfo = new LoopMissionRoundInfo();
roundInfo.setMissionId(StringUtils.isEmpty(maps.get("mission_id"))?null:Long.parseLong(maps.get("mission_id")));
roundInfo.setCurMissionId(StringUtils.isEmpty(maps.get("cur_mission_id"))?null:Long.parseLong(maps.get("cur_mission_id")));
roundInfo.setMissionState(StringUtils.isEmpty(maps.get("mission_state"))?null:Long.parseLong(maps.get("mission_state")));
roundInfo.setStartTime(StringUtils.isEmpty(maps.get("start_time"))?null:format.parse(maps.get("start_time")));
roundInfo.setEndTime(StringUtils.isEmpty(maps.get("end_time"))?null:format.parse(maps.get("end_time")));
if(loopMissionRoundMap.get(roundInfo.getMissionId()) == null){
List<LoopMissionRoundInfo> list = new LinkedList<LoopMissionRoundInfo>();
loopMissionRoundMap.put(roundInfo.getMissionId(), list);
}
loopMissionRoundMap.get(roundInfo.getMissionId()).add(roundInfo);
if(loopMissionRoundMap.get(roundInfo.getMissionId()).size() > 20){
loopMissionRoundMap.get(roundInfo.getMissionId()).remove(0);
}
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
}
public String createEmailContextForMission(Long missionId) {
StringBuffer context = new StringBuffer();
//通过missionID 获取任务信息 名称 创建日期等
String selectSql = "select mst.mission_name,to_char(mst.create_time,'"+Constants.DB_DATE_FORMAT+"') create_time,mst.mission_state from mission_state_table mst where mst.mission_id = '"+missionId+"' ";
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_name");
fields.add("create_time");
fields.add("mission_state");
try {
ArrayList<Map<String, String>> mapsList = this.dao.dbSelect(selectSql, fields);
if(mapsList !=null && mapsList.size()>0){
Map<String, String> maps = mapsList.get(0);
// String state = "已创建";
// String state = "Created";
String state = "i18n_server.UpgradeService.created_n81i";
if("2".equals(maps.get("mission_state"))){
// state = "正在执行";
// state = "Executing";
state = "i18n_server.UpgradeService.exec_n81i";
}else if("3".equals(maps.get("mission_state"))){
// state = "已完成";
// state = "Completed";
state = "i18n_server.UpgradeService.finish_n81i";
}
// context.append("任务名称:"+maps.get("mission_name")+"\n");
// context.append("Task Name"+maps.get("mission_name")+"\n");
context.append("i18n_server.UpgradeService.missionName_n81i"+maps.get("mission_name")+"\n");
// context.append("创建时间:"+maps.get("create_time")+"\n");
// context.append("Created Time"+maps.get("create_time")+"\n");
context.append("i18n_server.UpgradeService.createTime_n81i"+maps.get("create_time")+"\n");
// context.append("任务状态:"+state);
// context.append("Task Status"+state);
context.append("i18n_server.UpgradeService.missionState_n81i"+state);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
dao.clearConn();
}
return context.toString();
}
private EmailInfo createEmailInfoForFailResult(MissionResult2 mr){
StringBuffer context = new StringBuffer();
String ip = Common.getNodeIpByUUID(mr.getUuid());
EmailInfo emailInfo = new EmailInfo();
emailInfo.setActionIp(ip);
emailInfo.setActionType(EmailTypeConstants.TYPE_TASK_NODE_RESULT_ERROR);
emailInfo.setSendFlag(EmailTypeConstants.FLAG_SEND_ALLREADY);
emailInfo.setContent(mr.getDescription());
emailInfo.setActionDate(format.format(new Date(mr.getStartTime()==null?System.currentTimeMillis():mr.getStartTime())));
emailInfo.setSendLevel(EmailTypeConstants.URGENT_LATER);
//通过missionID 获取任务信息 名称 创建日期等
String selectSql = "select mst.mission_name,to_char(mst.create_time,'"+Constants.DB_DATE_FORMAT+"') create_time from mission_state_table mst where mst.mission_id = '"+mr.getMissionId()+"' ";
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_name");
// fields.add("create_time");
try {
ArrayList<Map<String, String>> mapsList = this.dao.dbSelect(selectSql, fields);
if(mapsList !=null && mapsList.size()>0){
Map<String, String> maps = mapsList.get(0);
emailInfo.setActionDesc(maps.get("mission_name"));
}
} catch (Exception e) {
logger.error("", e);
}finally{
dao.clearConn();
}
return emailInfo;
}
/*private String createEmailContextForFailResult(MissionResult2 mr){
StringBuffer context = new StringBuffer();
String ip = Common.getNodeIpByUUID(mr.getUuid());
//通过missionID 获取任务信息 名称 创建日期等
String selectSql = "select mst.mission_name,to_char(mst.create_time,'"+Constants.DB_DATE_FORMAT+"') create_time from mission_state_table mst where mst.mission_id = '"+mr.getMissionId()+"' ";
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_name");
fields.add("create_time");
try {
ArrayList<Map<String, String>> mapsList = this.dao.dbSelect(selectSql, fields);
if(mapsList !=null && mapsList.size()>0){
Map<String, String> maps = mapsList.get(0);
maps.get("");
context.append("任务名称:"+maps.get("mission_name")+"\n");
context.append("创建时间:"+maps.get("create_time")+"\n");
context.append("结果描述:"+ip+" "+mr.getDescription());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
dao.clearConn();
}
return context.toString();
}*/
/**
* 变更任务状态
* @time Jan 11, 2012-1:39:27 PM
* @param missionId
* @param missionState
*/
public void updateMissionState(Long missionId,int missionState,String autoDesc) throws Exception{
if(missionId==null || missionId.longValue()==0){
return ;
}
String [] params = null;
StringBuffer sql = new StringBuffer("update mission_state_table mst set ");
sql.append(" mst.mission_state = ? ");
pl(autoDesc);
if(StringUtils.isEmpty(autoDesc)){
params =new String[]{missionState+"",missionId.longValue()+""};
}else{
sql.append(" , mst.AUTO_DESC = ? ");
params =new String[]{missionState+"",autoDesc,missionId.longValue()+""};
}
sql.append(" where mst.mission_id =? ");
try {
dao.dbUpdate(sql.toString(), params);
} catch (Exception e) {
throw e;
}finally{
dao.clearConn();
}
}
/**
* 删除预置周期信息
* @time Jan 11, 2012-1:39:27 PM
* @param missionId
* @param missionState
*/
public void deleteLoopMissionPreset(Long missionId,Long curMissionId) {
if(missionId==null || missionId.longValue()==0){
return ;
}
String sql = "delete from loopmission_state_table where mission_state=0 and mission_id ="+missionId.longValue()+" and start_time>=sysdate";
if(curMissionId!=null){
sql = "delete from loopmission_state_table where mission_id ="+missionId.longValue()+" and cur_mission_id>"+curMissionId.longValue();
}
try {
dao.dbUpdate(sql);
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
/**
* 变更周期任务结果的状态
* @time Jan 11, 2012-1:39:27 PM
* @param missionId
* @param missionState
*/
public void updateMissionResultsResult(long roundMissionId,int missionType,int result) {
if(roundMissionId==0 || missionType==0){
return ;
}
String sql = "update mission_result_table"+missionType+" mst set mst.result="+result+" where mst.mission_id ="+roundMissionId;
try {
dao.dbUpdate(sql);
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
/**
* 变更任务状态
* @time Jan 11, 2012-1:39:27 PM
* @param missionId
* @param missionState
*/
public void updateLoopMissionState(Long missionId,int missionState) {
if(missionId==null || missionId.longValue()==0){
return ;
}
String sql = "update loopmission_state_table mst set mst.mission_state ='"+missionState+"' where mst.cur_mission_id ="+missionId.longValue();
try {
dao.dbUpdate(sql);
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
public String getUpdateSQL(int missionType) {
// "+(mr2.getResult()==null?1:mr2.getResult())+"
// String desc = StringUtils.isEmpty(mr2.getDescription())?"":mr2.getDescription();
// "+mr2.getMissionId().longValue()+"
// "+mr2.getUuid().longValue()+"
// StringBuffer sql = new StringBuffer(" mrt set mrt.result =? ,mrt.result_desc = substr(mrt.result_desc||?,decode(sign(vsize(mrt.result_desc||?)-1024),-1,0,0,0,1,vsize(mrt.result_desc||?)+1-1024),1024) ");
StringBuffer sql = new StringBuffer("update mission_result_table"+missionType+" mrt set mrt.result =? ,mrt.result_desc = ?");
switch (missionType) {
case 1:
// sql.insert(0, "update mission_result_table1");
break;
case 2:
// sql.insert(0, "update mission_result_table2");
break;
case 3:
// sql.insert(0, "update mission_result_table3");
break;
case 4:
sql.append(",mrt.file_info = ? ,mrt.result_detail=?");
break;
case 5:
// sql.insert(0, "update mission_result_table5");
break;
case 6:
// sql.insert(0, "update mission_result_table6");
break;
default:
break;
}
sql.append(" where mrt.mission_id =? and mrt.seq_id =? ");
return sql.toString();
}
// public void updateMissionResult2ByBatch(List<MissionResult2> mr2List) {
// List<String> updateSqlList = new ArrayList<String>();
// try {
// if(mr2List!= null && mr2List.size()>0){
// Iterator<MissionResult2> mrIte = mr2List.iterator();
// int count = 0;
// while (mrIte.hasNext()) {
// MissionResult2 mr = (MissionResult2) mrIte.next();
// String sql = getUpdateSql(mr);
// System.out.println("sql> "+sql);
// updateSqlList.add(sql);
// count++;
// if(count == Constants.DB_EXECUTE_BATCH){
// dao.dbUpdateByBatch(updateSqlList);
// count = 0;
// updateSqlList.clear();
// }
// }
// if (count > 0) {
// dao.dbUpdateByBatch(updateSqlList);
// count = 0;
// updateSqlList.clear();
// }
// }
// } catch (Exception e) {
// logger.error("批量更新异常 \n"+"",e);
// }finally{
// dao.clearConn();
// }
// }
/**
* 非定时任务 检查任务完成状态操作方法
* @time Nov 17, 2011-4:47:55 PM
*/
/*public void checkAndUpdateMissionComplete() {//此处total是共执行的还是所有应执行的节点数再加个字段描述是在DC端就入库还是web端再统计
StringBuffer selectSql = new StringBuffer();
selectSql.append("select t.mission_id from (");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table1 mrt group by mrt.mission_id) union all ");
// selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table2 mrt group by mrt.mission_id) union all ");
// selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table3 mrt group by mrt.mission_id) union all ");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table4 mrt group by mrt.mission_id) union all ");
// selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table5 mrt group by mrt.mission_id) union all ");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table6 mrt group by mrt.mission_id)");
selectSql.append(") t ");
selectSql.append("left join mission_state_table mst on mst.mission_id = t.mission_id ");
selectSql.append("where t.ok + t.fail = t.total ");
selectSql.append("and nvl(t.mission_id,-1) <> -1 ");
selectSql.append("and mst.is_loop = 0 ");
selectSql.append("and mst.mission_state <3 ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
try {
// StringBuffer missionIds = new StringBuffer();
List<Map<String, String>> mapList = dao.dbSelect(selectSql.toString(), fields);
if(mapList != null && mapList.size()>0){//
for(Map<String, String> map : mapList){
// missionIds.append(","+map.get("mission_id"));
if(StringUtils.isNotEmpty(map.get("mission_id"))){
// createEmailContextForMission(Long.parseLong(map.get("mission_id")));
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3 where mst.mission_id = ?",map.get("mission_id"));
}
}
// missionIds = missionIds.deleteCharAt(0);
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}*/
/**
* 非周期任务录入任务结果后若任务已完成则更新任务状态为成功部分成功全部失败中的一个原来只有一个完成状态做此修改便于更清晰的描述任务完成的状态
* 完成3t.ok + t.fail = t.total
* 成功31t.ok + t.fail = t.total and t.ok = t.total
* 部分成功32t.ok + t.fail = t.total and t.ok>0 and t.fail>0
* 全部失败30t.ok + t.fail = t.total and t.fail = t.total
* @time 2013-1-28 9:30:55 AM
* @author hyx
*/
public void updateCommonMissionComplete() {//此处total是共执行的还是所有应执行的节点数再加个字段描述是在DC端就入库还是web端再统计
StringBuffer selectSql = new StringBuffer();
selectSql.append("select t.mission_id,t.ok,t.fail,t.total from (");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table1 mrt group by mrt.mission_id) union all ");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table4 mrt group by mrt.mission_id) union all ");
selectSql.append("(select mrt.mission_id,sum(decode(mrt.result,0,1,0) ) ok,sum(decode(mrt.result,1,1,-1,1,0) ) fail,count(mrt.seq_id) total from mission_result_table6 mrt group by mrt.mission_id)");
selectSql.append(") t ");
selectSql.append("left join mission_state_table mst on mst.mission_id = t.mission_id ");
selectSql.append("where t.ok + t.fail = t.total ");
selectSql.append("and nvl(t.mission_id,-1) <> -1 ");//不取任务id为null的
selectSql.append("and mst.is_loop = 0 ");//非周期任务
selectSql.append("and mst.mission_state in(1,2) ");//如果之前已经更新为完成(=3的任务不再更新只更新一次非周期任务的状态1创建,2执行中,4未能执行未能执行的不能更新为完成
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("ok");
fields.add("fail");
fields.add("total");
try {
List<Map<String, String>> mapList = dao.dbSelect(selectSql.toString(), fields);
if(mapList != null && mapList.size()>0){//
EmailService emailService = new EmailService(dao);
for(Map<String, String> map : mapList){
if(StringUtils.isNotEmpty(map.get("mission_id"))){
Long ok = StringUtils.isEmpty(map.get("ok"))?null:Long.parseLong(map.get("ok"));
Long fail = StringUtils.isEmpty(map.get("fail"))?null:Long.parseLong(map.get("fail"));
Long total = StringUtils.isEmpty(map.get("total"))?null:Long.parseLong(map.get("total"));
//完成的任务才需要更新状态但是对于新录入的任务我会更改其mission_state_table里的mission_state_desc
if(ok!=null && ok.equals(total) ) {//成功
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 30 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" 任务执行完成:共"+total+"个执行节点,成功"+ok+"个,失败"+fail+"个",map.get("mission_id"));
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 30 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" i18n_sserver.UpgradeService.sql.complate_n81i "+total+" i18n_sserver.UpgradeService.sql.executeNode_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail,map.get("mission_id"));
}else if(fail!=null && fail.equals(total)) {//全部失败
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 31 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" 任务执行完成:共"+total+"个执行节点,成功"+ok+"个,失败"+fail+"个",map.get("mission_id"));
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 31 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" i18n_sserver.UpgradeService.sql.complate_n81i "+total+" i18n_sserver.UpgradeService.sql.executeNode_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail,map.get("mission_id"));
}else if(fail!=null && fail.longValue()>0 && ok!=null && ok.longValue()>0) {//部分成功
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 32 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" 任务执行完成:共"+total+"个执行节点,成功"+ok+"个,失败"+fail+"个",map.get("mission_id"));
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 32 ,AUTO_DESC=? where mst.mission_id = ?",format.format(System.currentTimeMillis())+" i18n_sserver.UpgradeService.sql.complate_n81i "+total+" i18n_sserver.UpgradeService.sql.executeNode_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail,map.get("mission_id"));
}
// 发送邮件
// emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "任务执行通知", "任务执行结束:共"+total+"个执行节点,成功"+ok+"个,失败"+fail+"个");
// emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "Task execution notification", "End of task execution:A total of"+total+"execution nodes,successful"+ok+"failed"+fail);
emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "i18n_server.UpgradeService.missionExec_n81i", "i18n_server.UpgradeService.missionEnd_n81i:i18n_server.UpgradeService.sql.total_n81i "+total+" i18n_server.UpgradeService.sql.executeNode2_n81i,i18n_server.UpgradeService.sql.success_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail);
}
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
//更新mission_state_table表里的mission_state_desc字段只对新录入结果的任务更新没录入任务结果的任务不需要更新
public void updateCommonMissionStateDesc(int missiontype,List<MissionResult2> mr2List) {
if(mr2List!=null && mr2List.size()>0) {
//获得更新结果的任务id的字符串
String missionIds = getMissionIdLinkStr(mr2List);
if(!"".equals(missionIds)) {
updateCommonMissionStateDesc(missiontype,missionIds);
}
}
}
/**
* 更新mission_state_table表里的mission_state_desc字段只对新录入结果的任务更新没录入任务结果的任务不需要更新
* 根据任务id更新任务的状态-非周期任务
*
*/
public void updateCommonMissionStateDesc(int missiontype,String missionIds) {
if(StringUtils.isNotBlank(missionIds)) {
StringBuffer selectSql = new StringBuffer();
selectSql.append(" select t.mission_id,t.ok,t.fail,t.total ");
selectSql.append(" from (");
selectSql.append(" select mrt.mission_id,");
selectSql.append(" sum(decode(mrt.result,0,1,0) ) ok, ");
selectSql.append(" sum(decode(mrt.result,1,1,-1,1,0) ) fail, ");
selectSql.append(" count(mrt.seq_id) total ");
selectSql.append(" from mission_result_table"+missiontype+" mrt ");
selectSql.append(" group by mrt.mission_id ");
selectSql.append(" ) t ");
selectSql.append(" left join mission_state_table mst on mst.mission_id = t.mission_id ");
selectSql.append(" where mst.is_loop = 0");//非周期任务:0,周期任务1
selectSql.append(" and t.mission_id is not null ");//不取任务id为null的其实不需要因为非周期任务的任务id理论上不会为null
selectSql.append(" and mst.mission_id in("+missionIds+") ");//只更新 新录入了结果的任务的任务状态描述
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("ok");
fields.add("fail");
fields.add("total");
try {
List<Map<String, String>> mapList = dao.dbSelect(selectSql.toString(), fields);
if(mapList != null && mapList.size()>0){//
List<String> sqls = new ArrayList<String>();
for(Map<String, String> map : mapList){
if(StringUtils.isNotEmpty(map.get("mission_id"))){
Long ok = StringUtils.isEmpty(map.get("ok"))?null:Long.parseLong(map.get("ok"));
Long fail = StringUtils.isEmpty(map.get("fail"))?null:Long.parseLong(map.get("fail"));
Long total = StringUtils.isEmpty(map.get("total"))?null:Long.parseLong(map.get("total"));
//完成的任务才需要更新状态但是对于新录入的任务我会更改其mission_state_table里的mission_state_desc
// sqls.add("update mission_state_table mst set mst.mission_state_desc = '共"+total+"个执行节点,</br>"+(total-ok-fail)+"个未执行,</br>"+(ok+fail)+"个已执行【成功"+ok+"个,失败"+fail+"个】' where mst.mission_id = "+map.get("mission_id"));
sqls.add("update mission_state_table mst set mst.mission_state_desc = 'i18n_server.UpgradeService.sql.total_n81i "+total+" i18n_server.UpgradeService.sql.executeNode2_n81i</br>"+(total-ok-fail)+" i18n_server.UpgradeService.sql.unexecute_n81i</br>"+(ok+fail)+" i18n_server.UpgradeService.sql.execute_n81i【i18n_server.UpgradeService.sql.success_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail+"】' where mst.mission_id = "+map.get("mission_id"));
}
}
dao.dbUpdateByBatch(sqls);
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
}
private String getMissionIdLinkStr(List<MissionResult2> mr2List) {
String missionIds = "";
for(MissionResult2 missRlt2:mr2List) {
String misId = missRlt2.getMissionId()==null ? "" : missRlt2.getMissionId().toString();
if(!"".equals(misId)&&!(","+missionIds).contains(","+misId+",")) {
missionIds = missionIds + misId + ",";
}
}
if(missionIds.endsWith(",")) {
missionIds = missionIds.substring(0,missionIds.length()-1);
}
return missionIds;
}
//更新loopmission_state_table表里的mission_state_desc字段只对新录入结果的任务更新没录入任务结果的任务不需要更新
public void updateLoopMissionStateDesc(List<MissionResult2> mr2List) {
if(mr2List!=null && mr2List.size()>0) {
//获得更新结果的任务id的字符串
String missionIds = getMissionIdLinkStr(mr2List);
if(!"".equals(missionIds)) {
updateLoopMissionStateDesc(missionIds);
}
}
}
//根据任务id更新任务的状态描述-周期任务
public void updateLoopMissionStateDesc(String missionIds) {
if(StringUtils.isNotBlank(missionIds)) {
// StringBuffer selectSql = new StringBuffer();
// selectSql.append(" select sumT.missionId ,sumT.ok, sumT.fail, sumT.total ");
// selectSql.append(" from (");
// selectSql.append(" select row_number() over(partition by lmst.mission_id order by lmst.cur_mission_id desc) cn, ");
// selectSql.append(" lmst.cur_mission_id ,");
// selectSql.append(" lmst.mission_id missionId,mst.mission_state, ");
// selectSql.append(" t.ok, t.fail, t.total ");
// selectSql.append(" from ( ");
// selectSql.append(" select mrt.mission_id, ");
// selectSql.append(" sum(decode(mrt.result, 0, 1, 0)) ok, ");//只统计正常执行的周期任务执行情况,对于撤销的不管
// selectSql.append(" sum(decode(mrt.result, 1, 1, -1, 1, 0)) fail, ");//只统计正常执行的周期任务执行情况,对于撤销的不管
// selectSql.append(" count(mrt.seq_id) total ");
// selectSql.append(" from mission_result_table4 mrt ");
// selectSql.append(" group by mrt.mission_id ");
// selectSql.append(" ) t ");
// selectSql.append(" left join loopmission_state_table lmst on lmst.cur_mission_id = t.mission_id ");
// selectSql.append(" left join mission_state_table mst on mst.mission_id = lmst.mission_id ");
// selectSql.append(" where lmst.cur_mission_id is not null and mst.is_loop=1 and mst.mission_state =2 ");//mission_state=2表示只修改正常执行的对于撤销的不予修改
// selectSql.append(" and mst.mission_id in("+missionIds+") ");//只修改有结果录入的
// selectSql.append(" ) sumT ");//只修改有结果录入的
// selectSql.append(" where sumT.cn=1 ");//只修改有结果录入的
String selectSql = "select lmst.mission_id missionId, t.ok, t.fail, t.total\n" +
" from (select mrt.mission_id,\n" +
" nvl(sum(decode(mrt.result, 0, 1, 0)), 0) ok,\n" +
" nvl(sum(decode(mrt.result, 1, 1, -1, 1, 0)), 0) fail,\n" +
" count(mrt.seq_id) total\n" +
" from mission_result_table4 mrt\n" +
" group by mrt.mission_id) t\n" +
" left join (select max(lst.cur_mission_id) cur_mission_id, lst.mission_id\n" +
" from mission_result_table4 mrt4\n" +
" left join loopmission_state_table lst on mrt4.mission_id = lst.cur_mission_id\n" +
" group by lst.mission_id) lmst\n" +
" on lmst.cur_mission_id = t.mission_id\n" +
" left join mission_state_table mst\n" +
" on mst.mission_id = lmst.mission_id\n" +
" where lmst.cur_mission_id is not null and mst.is_loop=1 " +
" and mst.mission_state =2 and mst.mission_id in ("+missionIds+")";//mission_state=2表示只修改正常执行的对于撤销的不予修改
ArrayList<String> fields = new ArrayList<String>();
fields.add("missionId");
fields.add("ok");
fields.add("fail");
fields.add("total");
try {
List<Map<String, String>> mapList = dao.dbSelect(selectSql.toString(), fields);
if(mapList != null && mapList.size()>0){//
List<String> sqls = new ArrayList<String>();
for(Map<String, String> map : mapList){
if(StringUtils.isNotEmpty(map.get("missionId"))){
Long ok = StringUtils.isEmpty(map.get("ok"))?null:Long.parseLong(map.get("ok"));
Long fail = StringUtils.isEmpty(map.get("fail"))?null:Long.parseLong(map.get("fail"));
Long total = StringUtils.isEmpty(map.get("total"))?null:Long.parseLong(map.get("total"));
//完成的任务才需要更新状态但是对于新录入的任务我会更改其mission_state_table里的mission_state_desc
// sqls.add("update mission_state_table mst set mst.mission_state_desc = '最新周期共"+total+"个执行节点,</br>"+(total-ok-fail)+"个未执行,</br>"+(ok+fail)+"个已执行【成功"+ok+"个,失败"+fail+"个】' where mst.mission_id = "+map.get("missionId"));
sqls.add("update mission_state_table mst set mst.mission_state_desc = 'i18n_server.UpgradeService.sql.cycle_n81i "+total+" i18n_server.UpgradeService.sql.executeNode2_n81i</br>"+(total-ok-fail)+" i18n_server.UpgradeService.sql.unexecute_n81i</br>"+(ok+fail)+" i18n_server.UpgradeService.sql.execute_n81i【i18n_server.UpgradeService.sql.success_n81i "+ok+" i18n_sserver.UpgradeService.sql.failed_n81i "+fail+" 】' where mst.mission_id = "+map.get("missionId"));
}
}
dao.dbUpdateByBatch(sqls);
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
}
/**
* 周期任务
* 更新loopmission_state_table表
* 1.查询正常执行的单次周期任务的完成2->3+撤销任务的撤销完成(6->7)
* 2.更新表loopmission_state_table中的状态2->36->7
* 更新mission_state_table表
* 1.查询正常执行的任务周期全部完成为任务完成2->3
* 2.查询撤销任务周的撤销完成为整个任务撤销完成6->7
* 任务完成判定标准20130322撤销任务为撤销周期完成即整个任务完成
* 正常周期任务为所有正常均完成则整个任务完成
* @time Nov 17, 2011-4:47:55 PM
* @author hyx
*/
public void updateLoopMissionComplete() {
//-- 周期任务 的检查SQL
//完成的(正常执行的+撤销的为了获得完成的任务id无论是正常执行完成的还是撤销完成的
StringBuffer loopSQL = new StringBuffer();
loopSQL.append(" select lmst.cur_mission_id mission_id ,lmst.mission_state");
loopSQL.append(" from (");
loopSQL.append(" select mrt.mission_id,");//01-1和6,7不会同时出现的
loopSQL.append(" sum(case when mrt.result = 0 then 1 else 0 end) ok,");//正常执行成功的
loopSQL.append(" sum(case when mrt.result in (1,-1) then 1 else 0 end) fail,");//正常执行失败的
loopSQL.append(" sum(case when mrt.result = 7 then 1 else 0 end) cxOk,");//撤销成功的
loopSQL.append(" sum(case when mrt.result = 6 then 1 else 0 end) cxFail,");//撤销失败的
loopSQL.append(" count(mrt.seq_id) total ");//总数
loopSQL.append(" from mission_result_table4 mrt ");
loopSQL.append(" group by mrt.mission_id ");
loopSQL.append(" ) t ");
loopSQL.append(" left join loopmission_state_table lmst on lmst.cur_mission_id = t.mission_id ");
loopSQL.append(" where lmst.cur_mission_id is not null ");
loopSQL.append(" and (t.ok + t.fail = t.total or t.cxOk+t.cxFail=t.total )");
loopSQL.append(" and lmst.mission_state not in (3,7) ");//3:周期任务的单次任务完成7周期任务的单次任务完成撤销
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_state");
try {
List<Map<String, String>> mapList = dao.dbSelect(loopSQL.toString(), fields);
//- 变更周期任务信息状态 loopmission_state_table
if(mapList != null && mapList.size()>0){
StringBuffer missionIds = new StringBuffer("0"); //正常周期任务结果入库完成轮次IDS
StringBuffer cancelMissionIds = new StringBuffer("0");//撤销周期任务结果入库完成轮次IDS
for(Map<String, String> map : mapList){
if(StringUtils.isNotEmpty(map.get("mission_state")) && map.get("mission_state").equals("6")){ //撤销周期
cancelMissionIds.append(","+map.get("mission_id"));
}else{ //非撤销周期
missionIds.append(","+map.get("mission_id"));
}
}
//存在撤销周期的轮次任务
if(cancelMissionIds.length()>1){
//将该周期轮次状态置为撤销完成,将该任务状态置为撤销完成
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 7 where mst.mission_state = 6 and mst.cur_mission_id in ("+cancelMissionIds.toString()+")");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7 , mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and mst.mission_id in ( select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id in("+cancelMissionIds.toString()+")) ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7 , mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.revoke_n81i' where mst.mission_state = 6 and mst.mission_id in ( select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id in("+cancelMissionIds.toString()+")) ");
}
//存在正常周期的轮次任务
if(missionIds.length()>1){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 3 where mst.mission_state = 2 and mst.cur_mission_id in ("+missionIds.toString()+")");
}
}
//- 变更周期任务信息状态 mission_state_table
StringBuffer missionSql = new StringBuffer();
missionSql.append(" select mst.mission_id,mst.mission_state");
missionSql.append(" from (");
missionSql.append(" select lmst.mission_id, ");
missionSql.append(" sum(decode(lmst.mission_state, 3, 1, 7, 1, 0)) ok,");//正常执行完成的周期,撤销完成的周期
missionSql.append(" sum(decode(lmst.mission_state, 4, 1, 0)) fail,");//未能执行的周期
missionSql.append(" count(lmst.cur_mission_id) total");
missionSql.append(" from loopmission_state_table lmst");
missionSql.append(" group by lmst.mission_id");
missionSql.append(" ) t");
missionSql.append(" left join mission_state_table mst on mst.mission_id = t.mission_id");
missionSql.append(" where t.ok + t.fail = t.total");
missionSql.append(" and nvl(mst.mission_id, -1) <> -1");
missionSql.append(" and mst.is_loop = 1");
missionSql.append(" and mst.mission_state not in (3, 7, 4)");
StringBuffer missionIds0 = new StringBuffer("0");
List<Map<String, String>> mapList0 = dao.dbSelect(missionSql.toString(), fields);
//- 变更周期任务信息状态 mission_state_table
if(mapList0 != null && mapList0.size()>0){
EmailService emailService = new EmailService(dao);
for(Map<String, String> map : mapList0){
missionIds0.append(","+map.get("mission_id"));
if(StringUtils.isNotEmpty(map.get("mission_id"))){
// 发送邮件
// emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "任务执行通知", "任务执行结束");
emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "i18n_server.UpgradeService.missionExec_n81i", "i18n_server.UpgradeService.missionEnd_n81i");
}
}
//将撤销任务或撤销超时任务置为撤销完成状态
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and (mst.mission_id in ("+missionIds0.toString()+") or mst.end_time <= sysdate)");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and mst.mission_id in ("+missionIds0.toString()+") ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.revoke_n81i' where mst.mission_state = 6 and mst.mission_id in ("+missionIds0.toString()+") ");
//只针对完成的周期任务不包括撤销任务完成的状况可能是全部完成mission_state为3的=total部分未能执行fail>0
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务执行完成' where mst.mission_state = 2 and (mst.mission_id in ("+missionIds0.toString()+") or mst.end_time <= sysdate)");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务执行完成' where mst.mission_state = 2 and mst.mission_id in ("+missionIds0.toString()+") ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.revoke_n81i' where mst.mission_state = 2 and mst.mission_id in ("+missionIds0.toString()+") ");
//--将超时的任务检查,单独提出-checkTimeoutLoopMisssionAndAddResult()方法
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
//对于超时周期任务的清理周期未初始化结果loop表的state=0 or 1将loop表的state修改为4未能执行
public void updateTimeoutLoopMissionState(String timeoutMissIds) {
if(StringUtils.isNotBlank(timeoutMissIds)) {
StringBuffer loopSQL = new StringBuffer();
loopSQL.append(" select lmst.mission_id,lmst.cur_mission_id , lmst.mission_state");
loopSQL.append(" from loopmission_state_table lmst ");
loopSQL.append(" where lmst.mission_id in ("+timeoutMissIds+") and lmst.mission_state in (0,1) and lmst.end_time<=to_date('"+format.format(new Date())+"','yyyy-MM-dd HH24:mi:ss') ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("cur_mission_id");
fields.add("mission_state");
try {
List<Map<String, String>> mapList = dao.dbSelect(loopSQL.toString(), fields);
//- 变更周期任务信息状态 loopmission_state_table
if(mapList != null && mapList.size()>0){
StringBuffer missionIds = new StringBuffer("0");
StringBuffer cancelMissionIds = new StringBuffer("0");
for(Map<String, String> map : mapList){
if(StringUtils.isNotEmpty(map.get("mission_state")) && map.get("mission_state").equals("6")){ //撤销周期
cancelMissionIds.append(","+map.get("cur_mission_id"));
}else{ //非撤销周期
missionIds.append(","+map.get("cur_mission_id"));
}
}
//存在撤销周期的轮次任务
if(cancelMissionIds.length()>1){
//将该周期轮次状态置为撤销完成,将该任务状态置为撤销完成
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 7 where mst.mission_state = 6 and mst.cur_mission_id in ("+cancelMissionIds.toString()+")");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7 , mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and mst.mission_id in ( select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id in("+cancelMissionIds.toString()+")) ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7 , mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.revoke_n81i' where mst.mission_state = 6 and mst.mission_id in ( select lmst.mission_id from loopmission_state_table lmst where lmst.cur_mission_id in("+cancelMissionIds.toString()+")) ");
}
//存在正常周期的轮次任务
if(missionIds.length()>1){
dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 4 where mst.cur_mission_id in ("+missionIds.toString()+")");
}
}
//- 变更周期任务信息状态 mission_state_table
StringBuffer missionSql = new StringBuffer();
missionSql.append(" select mst.mission_id,mst.mission_state");
missionSql.append(" from (");
missionSql.append(" select lmst.mission_id, ");
missionSql.append(" sum(decode(lmst.mission_state, 3, 1, 7, 1, 0)) ok,");//正常执行完成的周期,撤销完成的周期
missionSql.append(" sum(decode(lmst.mission_state, 4, 1, 0)) fail,");//未能执行的周期
missionSql.append(" count(lmst.cur_mission_id) total");
missionSql.append(" from loopmission_state_table lmst");
missionSql.append(" group by lmst.mission_id");
missionSql.append(" ) t");
missionSql.append(" left join mission_state_table mst on mst.mission_id = t.mission_id");
missionSql.append(" where t.ok + t.fail = t.total");
missionSql.append(" and nvl(mst.mission_id, -1) <> -1");
missionSql.append(" and mst.is_loop = 1");
missionSql.append(" and mst.mission_state not in (3, 7, 4)");
ArrayList<String> missFields = new ArrayList<String>();
missFields.add("mission_id");
missFields.add("mission_state");
StringBuffer missionIds0 = new StringBuffer("0");
List<Map<String, String>> mapList0 = dao.dbSelect(missionSql.toString(), missFields);
//- 变更周期任务信息状态 mission_state_table
if(mapList0 != null && mapList0.size()>0){
EmailService emailService = new EmailService(dao);
for(Map<String, String> map : mapList0){
missionIds0.append(","+map.get("mission_id"));
if(StringUtils.isNotEmpty(map.get("mission_id"))){
// 发送邮件
// emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "任务执行通知", "任务执行结束");
emailService.sendEmailForMission(Long.parseLong(map.get("mission_id")), "i18n_server.UpgradeService.missionExec_n81i", "i18n_server.UpgradeService.missionExec_n81i");
}
}
//将撤销任务或撤销超时任务置为撤销完成状态
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and mst.mission_id in ("+missionIds0.toString()+") ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.revoke_n81i' where mst.mission_state = 6 and mst.mission_id in ("+missionIds0.toString()+") ");
//只针对完成的周期任务不包括撤销任务完成的状况可能是全部完成mission_state为3的=total部分未能执行fail>0
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务执行完成' where mst.mission_state = 2 and mst.mission_id in ("+missionIds0.toString()+") ");
dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" i18n_server.UpgradeService.sql.executed_n81i' where mst.mission_state = 2 and mst.mission_id in ("+missionIds0.toString()+") ");
//--将超时的任务检查,单独提出-checkTimeoutLoopMisssionAndAddResult()方法
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
}
}
/**
* 2013-3-13 hyx
* 检查周期任务中超时的任务并将结果state状态修改存入缓存等待下一次录入结果线程执行时更改任务的状态及描述
* 针对过期未完成的周期任务进行清理非周期任务不需要清理因为没有结束时间endTime所以不会超时
* 1.会不会重复添加过期任务呢-不会因为此处将结果加入缓存后会先执行上面的结果录入和任务状态的改变再执行过期任务清理时之前的过期任务的状态已修改为3或者7不会被统计
* 2.清理时将超时的任务mission_state_table表中state=2或者6的且endTime小于当前时间的的结果存入缓存(Common.addResultToResultList)
* 3.对于过期的周期任务
* 除了修改周期结果的状态3->1
* 还需要修改loopmission_state_table表的状态(2->3或者6->7,对于状态为0的不需要修改因为界面不会显示更新状态时也不会统计)
* 及mission_state_table的状态(2->3或者6->7对于1的情况在初始化任务时已经做过超时检查了初始化后任务的状态变为2了就所以此处不用对1的做超时检查)
* 将过期周期任务结果存入缓存后上面进行统计时就会根据结果的状态统计loop表的状态及mission_state_table表的状态所以步骤3的3个修改我们只需要做第一步将结果存入缓存
*
* 程序逻辑
* 如果获得超时的任务--所谓的超时是指表mission_state_table的endTime小于当前时间
* 1从mission_state_table表查询周期任务isLoop=1 and missType=4state=2或者6的且endTime小于当前时间的任务ids
* 2根据1生成的任务ids查询结果表里的信息只查找result=3或者5的再生成MissionResult2类使result=1
* 3将生成的MissionResult2存入缓存
*/
public void checkTimeoutLoopMisssionAndAddResult() {
//第一步-- 超时周期任务 检查SQL
Date sysdateD = new Date();
String sysdate = format.format(sysdateD);//为了统一时间都去DC的时间
StringBuffer missionTimeoutCheckSQL = new StringBuffer();
missionTimeoutCheckSQL.append(" select mst.mission_id, mst.mission_state");
missionTimeoutCheckSQL.append(" from mission_state_table mst");
missionTimeoutCheckSQL.append(" where mst.is_loop=1");
missionTimeoutCheckSQL.append(" and mst.mission_type=4");
missionTimeoutCheckSQL.append(" and mst.mission_state in(2,6)");
missionTimeoutCheckSQL.append(" and mst.end_time<to_date('"+sysdate+"','yyyy-MM-dd HH24:mi:ss') ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("mission_state");
try {
StringBuffer timeoutMissIds = new StringBuffer("0");
List<Map<String, String>> timeoutMissMapList = dao.dbSelect(missionTimeoutCheckSQL.toString(), fields);
if(timeoutMissMapList != null && timeoutMissMapList.size()>0){
//第二步
for(Map<String, String> map : timeoutMissMapList){
timeoutMissIds.append(","+map.get("mission_id"));
}
System.out.println(timeoutMissIds.toString());
//对于超时周期任务的清理:任务结果为下发中的部分
List<MissionResult2> mrList = getAllMissRltsForLoopTask(timeoutMissIds.toString());
//第三步
for( MissionResult2 mr : mrList){
// MissionResult2 result2 = new MissionResult2();
// //- 任务Id long
// result2.setMissionId(mr.getMissionId());
// //-- 任务类型 long
// result2.setMissionType(4l);
// //- UUID long
// result2.setUuid(mr.getUuid());
// //- 周期标识 long
// result2.setLoopFlag(1l);
// //- 开始执行时间 long
// result2.setStartTime(null);
// //- 结束时间 long
// result2.setEndTime(null);
// //- 配置截取文本 string
// result2.setText(null);
//- 结果状态 long
mr.setResult(1l);
//- 结果描述 string
mr.setDescription(MissionConstants.ERROR_RESULT_EXEC_TIMEOUT);
Common.addResultToResultList(mr);//超时未执行的任务
}
//对于超时周期任务的清理周期未初始化结果loop表的state=0 or 1将loop表的state修改为4未能执行
updateTimeoutLoopMissionState(timeoutMissIds.toString());
}
} catch (Exception e) {
logger.error("Check the timeout task in the cycle task and store the result of the timeout task into the cache exception",e);
}finally{
dao.clearConn();
}
}
//清理指定任务id的周期任务:修改结果表和loop表时会先判断是否超时
public void clearTimeoutLoopMisssion(Long missionId) {
try {
if(missionId!=null) {
//对于超时周期任务的清理:任务结果为下发中的部分
List<MissionResult2> mrList = getAllMissRltsForLoopTask(missionId.toString());
//第三步
for( MissionResult2 mr : mrList){
//- 结果状态 long
mr.setResult(1l);
//- 结果描述 string
mr.setDescription(MissionConstants.ERROR_RESULT_EXEC_TIMEOUT);
Common.addResultToResultList(mr);//超时未执行的任务
}
//对于超时周期任务的清理周期未初始化结果loop表的state=0 or 1将loop表的state修改为4未能执行
updateTimeoutLoopMissionState(missionId.toString());
}
} catch (Exception e) {
logger.error("Clear the specified cycle task and store the result of timeout task into cache exception",e);
}finally{
dao.clearConn();
}
}
private ArrayList<MissionResult2> getAllMissRltsForLoopTask(String missionIds){
if(StringUtils.isBlank(missionIds) || "0".equals(missionIds)){
return null;
}
ArrayList<MissionResult2> mrList = new ArrayList<MissionResult2>();
StringBuffer searchSQL = new StringBuffer();
searchSQL.append("select lmst.mission_id, ");
searchSQL.append(" to_char(lmst.START_TIME,'"+Constants.DB_DATE_FORMAT+"') START_TIME, ");
searchSQL.append(" to_char(lmst.END_TIME,'"+Constants.DB_DATE_FORMAT+"') END_TIME, ");
searchSQL.append(" nt.node_ip, ");
searchSQL.append(" mrt.seq_id, ");
searchSQL.append(" nvl(mrt.result,3) result ");
searchSQL.append("from mission_result_table4 mrt ");
searchSQL.append("left join loopmission_state_table lmst on lmst.cur_mission_id = mrt.mission_id ");
searchSQL.append("left join (select distinct node_ip,ipn,seq_id from node_table n) nt on nt.seq_id=mrt.seq_id ");
searchSQL.append("where lmst.mission_id in("+missionIds+") ");
searchSQL.append(" and nvl(mrt.result,3) in(3,5)");
searchSQL.append(" and lmst.end_time<=to_date('"+format.format(new Date())+"','yyyy-MM-dd HH24:mi:ss') ");
ArrayList<String> fields = new ArrayList<String>();
fields.add("mission_id");
fields.add("START_TIME");
fields.add("END_TIME");
fields.add("node_ip");
fields.add("result");
fields.add("seq_id");
ArrayList<Map<String, String>> rs = null;
try {
logger.debug(searchSQL.toString());
rs = dao.dbSelect(searchSQL.toString(), fields);
//-- 整理到对象集合
if(rs!=null && rs.size()>0){
for(Map<String, String> maps : rs){
MissionResult2 result = new MissionResult2();
result.setMissionId(Long.parseLong(maps.get("mission_id")));
// result.setNodeIp(maps.get("node_ip"));
result.setUuid(maps.get("seq_id")==null ? null:Long.parseLong(maps.get("seq_id")));
result.setResult(maps.get("result")==null ? null:Long.parseLong(maps.get("result")));
result.setEndTime(maps.get("END_TIME")==null ? null:format.parse(maps.get("END_TIME")).getTime());
result.setStartTime(maps.get("START_TIME")==null ? null:format.parse(maps.get("START_TIME")).getTime());
// result.setEndTime(maps.get("result")==null ? null:Long.parseLong(maps.get("result")));
result.setMissionType(4l);
result.setLoopFlag(1l);
mrList.add(result);
}
}
} catch (Exception e) {
logger.error("",e);
}finally{
dao.clearConn();
}
return mrList;
}
/**
* 将周期任务的部分结果设置为空
* @time Nov 17, 2011-4:47:55 PM
*/
// public void checkAndUpdateLoopMissionComplete() {
// //-- 周期任务 的检查SQL
// StringBuffer loopSQL = new StringBuffer();
//
//// SimpleDateFormat format = new SimpleDateFormat();
// loopSQL.append("select lmst.cur_mission_id mission_id from (");
// loopSQL.append("(select mrt.mission_id,sum(case when mrt.result = 0 then 1 else 0 end) ok,sum(case when mrt.result in (1,-1) then 1 else 0 end) fail,count(mrt.seq_id) total from mission_result_table4 mrt group by mrt.mission_id ) ");
// loopSQL.append("union all " +
// "(select mrt.mission_id,sum(case when mrt.result='7' then 1 else 0 end) ok,sum(case when mrt.result='0' then 1 else 0 end) fail,count(mrt.seq_id) total from mission_result_table4 mrt group by mrt.mission_id ) ");
// loopSQL.append(") t ");
// loopSQL.append("left join loopmission_state_table lmst on lmst.cur_mission_id = t.mission_id ");
// loopSQL.append("where t.ok + t.fail = t.total ");
// loopSQL.append("and nvl(t.mission_id,-1) <> -1 ");
// loopSQL.append("and lmst.mission_state not in (3,7) ");
//
// ArrayList<String> fields = new ArrayList<String>();
// fields.add("mission_id");
// try {
// StringBuffer missionIds = new StringBuffer("0");
// List<Map<String, String>> mapList = dao.dbSelect(loopSQL.toString(), fields);
// //- 变更周期任务信息状态 loopmission_state_table
// if(mapList != null && mapList.size()>0){
// for(Map<String, String> map : mapList){
// missionIds.append(","+map.get("mission_id"));
//// if(StringUtils.isNotEmpty(map.get("mission_id"))){
//// createEmailContextForMission(Long.parseLong(map.get("mission_id")));
//// }
// }
//// missionIds = missionIds.deleteCharAt(0);
// dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 3 where mst.mission_state = 2 and mst.cur_mission_id in ("+missionIds.toString()+")");
// dao.dbUpdate("update loopmission_state_table mst set mst.mission_state = 7 where mst.mission_state = 6 and mst.cur_mission_id in ("+missionIds.toString()+")");
// }
// //- 变更周期任务信息状态 mission_state_table
// if(mapList != null && mapList.size()>0){
// StringBuffer missionSql = new StringBuffer();
// missionSql.append("select mst.mission_id from (");
// missionSql.append("select lmst.mission_id,sum(decode(mrt.result,3,1,7,1,0) ) ok,sum(decode(mrt.result,4,1,0) ) fail,count(lmst.cur_mission_id) total from loopmission_state_table lmst group by lmst.mission_id ");
// missionSql.append(") t ");
// missionSql.append("left join mission_state_table mst on mst.mission_id = t.mission_id ");
// missionSql.append("where t.ok + t.fail = t.total ");
// missionSql.append("and nvl(t.mission_id,-1) <> -1 ");
// missionSql.append("and mst.is_loop = 1 ");
// missionSql.append("and lmst.mission_state not in(3,7,4) ");
//
// StringBuffer missionIds0 = new StringBuffer("0");
// List<Map<String, String>> mapList0 = dao.dbSelect(loopSQL.toString(), fields);
// //- 变更周期任务信息状态 loopmission_state_table
// if(mapList != null && mapList.size()>0){
// for(Map<String, String> map : mapList0){
// missionIds0.append(","+map.get("mission_id"));
// if(StringUtils.isNotEmpty(map.get("mission_id"))){
// createEmailContextForMission(Long.parseLong(map.get("mission_id")));
// }
// }
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 7,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务撤销完成' where mst.mission_state = 6 and mst.mission_id in ("+missionIds.toString()+") ");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 3,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 任务执行完成' where mst.mission_state = 2 and mst.mission_id in ("+missionIds.toString()+") and mst.end_time <= sysdate");
// dao.dbUpdate("update mission_state_table mst set mst.mission_state = 4,mst.auto_desc='"+format.format(System.currentTimeMillis())+" 当前系统时间 大于 结束时间,无法执行' where mst.mission_state = 1 and mst.end_time <= sysdate");
// }
// }
// } catch (Exception e) {
// logger.error("",e);
// }finally{
// dao.clearConn();
// }
// }
/**
* 获取任务结果更新Sql
* @time Nov 16, 2011-1:32:07 PM
* @param mr
* @return
*/
// public String getUpdateSql(MissionResult2 mr2) {
// StringBuffer sql = new StringBuffer("update mission_result_table");
// sql.append(mr2.getMissionType()+" mrt set ");
// sql.append("mrt.result ='"+(mr2.getResult()==null?1:mr2.getResult())+"' ");
// String desc = StringUtils.isEmpty(mr2.getDescription())?"":mr2.getDescription();
// sql.append(",mrt.result_desc = substr(mrt.result_desc||'?',decode(sign(vsize(mrt.result_desc||'"+desc+"')-1024),-1,0,0,0,1,vsize(mrt.result_desc||'"+desc+"')+1-1024),1024) ");
// sql.append("where mrt.mission_id ='"+mr2.getMissionId().longValue()+"' ");
// sql.append("and mrt.seq_id ='"+mr2.getUuid().longValue()+"' ");
// return sql.toString();
// }
}