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; 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 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) "); //以创建任务 准备撤销任务 均作为新任务周期性载入 searchSQL.append("order by mst.create_time,mst.mission_id asc "); ArrayList fields = new ArrayList(); 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> rs = null; ArrayList mstList = new ArrayList(); 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 ipSegList = Common.getServerTable().getIpSegList(); for(Map 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 mnFields = new ArrayList(); mnFields.add("node_ips_id"); mnFields.add("node_groups_id"); ArrayList> mns = dao.dbSelect(mnSql.toString(), mnFields); if (mns != null && mns.size() > 0) { for (Map 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 nodeFields = new ArrayList(); 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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); //----拼写uuid串,用于校验管理范围外IP StringBuffer uuidStr = new StringBuffer("0"); if (nodeMapList != null && nodeMapList.size() > 0) { for(Map 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 omNodeFields = new ArrayList(); omNodeFields.add("seq_id"); ArrayList> 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范围内,已取消"); } } } 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 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 fields = new ArrayList(); 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> rs = null; ArrayList mstList = new ArrayList(); try { rs = dao.dbSelect(searchSQL.toString(), fields); if(rs!=null && rs.size()>0){ for(Map 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 fields = new ArrayList(); StringBuffer searchSql = new StringBuffer(); ArrayList> mapsList = new ArrayList>(); //-- 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:任务下发中 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 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:任务下发中 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 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:任务下发中 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 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 fields = new ArrayList(); 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> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields); MissionStateTable mission = new MissionStateTable(); if(rs!=null && rs.size()>0){ Map 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; } /** * 校验并初始化周期任务轮次信息
*

设计说明:
* 1、校验 缓存中是否存在 该周期任务信息,不存在 则添加
* 2、校验 缓存中是否存在 该周期任务的轮次信息 不存在 则添加
* 3、校验 缓存中 轮次信息是否 符合要求:
* a、周期判定[startTime,endTime)
* b、保证周期任务的轮次信息的连续性和非重复性(起始时间 至 结束时间 无遗漏 无交集)
* c、过期的轮次信息创建 其状态为 4(未能执行)
* d、预置周期(轮次起始时间大于当前系统时间)数量
* 为 Constants.COMMON_MISSION_LOOP_PRESET_NUMBER
* e、新预置轮次信息的状态为 0
* @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 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 当前系统时间 * 调整后的timeStart 为roundInfoList最后一个对象的结束时间 * */ //-- 第一步 获取已存在的轮次信息 调整周期的起始时间、结束时间和预置数 if(roundInfoList!=null && roundInfoList.size()>0){ //继续校验,并检查 LoopMissionRoundInfo roundInfo = null; for (Iterator 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 cycleList = new LinkedList(); //新轮次信息集合 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 fields = new ArrayList(); 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> 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 params = new LinkedList(); for(Map 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 msFields = new ArrayList(); 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> missionSateMap = dao.dbSelect(msSQL.toString(), msFields); if(missionSateMap== null || missionSateMap.size() == 0){ return; } ArrayList nodeFields = new ArrayList(); 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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); // 任务下发节点 if(nodeMapList != null && nodeMapList.size()>0){ //拼写uuid串,用于校验管理范围外IP StringBuffer uuidStr = new StringBuffer("0"); for(Map 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(" "); } ArrayList ipnSegmentFields = new ArrayList(); 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); ipnSegmentFields.add("start_ipn"); ipnSegmentFields.add("end_ipn"); ArrayList> 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 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 omNodeFields = new ArrayList(); 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 params = new LinkedList(); node:for(Map nodeMap : nodeMapList){ if("0".equals(nodeMap.get("node_type"))){ //服务器节点 if(omNodeMapList!= null && omNodeMapList.size()>0){ omNode:for(Map 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}); 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 msFields = new ArrayList(); 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> missionSateMap = dao.dbSelect(msSQL.toString(), msFields); if(missionSateMap== null || missionSateMap.size() == 0){ return; } ArrayList nodeFields = new ArrayList(); 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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); // 任务下发节点 if(nodeMapList != null && nodeMapList.size()>0){ //拼写uuid串,用于校验管理范围外IP StringBuffer uuidStr = new StringBuffer("0"); for(Map 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(" "); } ArrayList ipnSegmentFields = new ArrayList(); 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); ipnSegmentFields.add("start_ipn"); ipnSegmentFields.add("end_ipn"); ArrayList> 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 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 omNodeFields = new ArrayList(); 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 params = new LinkedList(); //查询当前任务的执行节点中上一周期下发失败的节点-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 hasRltFields = new ArrayList(); hasRltFields.add("result"); hasRltFields.add("result_detail"); ArrayList> 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 nodeMap : nodeMapList){ String seqIdTmp = nodeMap.get("seq_id")+""; if("0".equals(nodeMap.get("node_type"))){ //服务器节点 if(omNodeMapList!= null && omNodeMapList.size()>0){ omNode:for(Map map : omNodeMapList){ if(seqIdTmp.equals(map.get("seq_id"))){//管理范围外节点失败结果 //params.add(new String[]{curMissionId.longValue()+"",seqIdTmp,"1",MissionConstants.ERROR_RESULT_UN_MANAGEMENT_NODE}); 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 msFields = new ArrayList(); 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> missionSateMap = dao.dbSelect(msSQL.toString(), msFields); if(missionSateMap== null || missionSateMap.size() == 0){ return; } //查询需要插入结果的节点 ArrayList nodeFields = new ArrayList(); 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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); // 任务下发节点 if(nodeMapList != null && nodeMapList.size()>0){ //拼写uuid串,用于校验管理范围外IP StringBuffer uuidStr = new StringBuffer("0"); for(Map map : nodeMapList){ if(StringUtils.isNotEmpty(map.get("seq_id"))){ uuidStr.append(","+map.get("seq_id")); } } //查询任务下发节点sql-管理范围外节点 ArrayList ipnSegmentFields = new ArrayList(); 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> 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 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 omNodeFields = new ArrayList(); 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 params = new LinkedList(); //由于其他地方导致的缓存中的轮次信息的state和数据库中的不一致,对于已经有结果的,还要初始化,所以此处验证一下,如果已经有结果了,则不做插入操作 ArrayList hasRltFields = new ArrayList(); hasRltFields.add("result"); hasRltFields.add("result_detail"); ArrayList> 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 nodeMap : nodeMapList){ String seqIdTmp = nodeMap.get("seq_id")+""; if("0".equals(nodeMap.get("node_type"))){ //服务器节点 if(omNodeMapList!= null && omNodeMapList.size()>0){ omNode:for(Map 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 nodeFields = new ArrayList(); 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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); if(nodeMapList != null && nodeMapList.size()>0){ for(Map 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 nodeFields = new ArrayList(); 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=1,result_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> nodeMapList = dao.dbSelect(nodeSQL.toString(), nodeFields); if(nodeMapList != null && nodeMapList.size()>0){ for(Map 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表的state:2 or 4 * */ public List checkLoopMissAssignFail() { List assignFailMissIds = new ArrayList(); try { ArrayList missFields = new ArrayList(); 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> 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 curMissFields = new ArrayList(); curMissFields.add("toAssign"); curMissFields.add("assignFail"); for(Map 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> missCurMissMapList = dao.dbSelect(initRltCurMissIdSql, curMissFields, missId,curMissId); boolean assignOneFlag = true; if(missCurMissMapList!=null && missCurMissMapList.size()>0) { for(Map mapTmp : missCurMissMapList){ LoopMissionRoundInfo roundInfo = null; if(StringUtils.isNotBlank(mapTmp.get("toAssign")) && assignOneFlag) {//初始化下发结果:只初始化最近的未过期的一个周期,可能周期未执行完毕 //未过期的,下发 Long toAssignCurMissId = Long.parseLong(mapTmp.get("toAssign")); //-- 轮次校验和初始化 checkAndInitMissionCycle(mission); //-- 获取当前周期轮次 List roundInfoList = Common.getLoopMissionRoundInfoList().get(missId); if(roundInfoList !=null && roundInfoList.size()>0){ //-- 获取当前周期轮次 for (Iterator 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 roundInfoList = Common.getLoopMissionRoundInfoList().get(missId); if(roundInfoList !=null && roundInfoList.size()>0){ //-- 获取当前周期轮次 for (Iterator 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 fields = new ArrayList(); 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> 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 params = new LinkedList(); for(Map 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 fields = new ArrayList(); fields.add("node_groups_id"); fields.add("NODE_IPS_ID"); fields.add("command_para"); ArrayList> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields); //-- 整理到对象集合 if(rs!=null && rs.size()>0){ Map 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 fields = new ArrayList(); fields.add("system_ip"); ArrayList> 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 map = (Map) 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 fields = new ArrayList(); fields.add("system_ip"); ArrayList> 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 map = (Map) 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 getMissionFileInformations(Long missionId){ List pushFileList = new LinkedList(); StringBuffer searchSQL = new StringBuffer(); ArrayList fields = new ArrayList(); fields.add("file_name"); fields.add("md5_value"); ArrayList> 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 map = (Map) 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 getMissionFileInformations2(Long missionId){ List pushFileList = new LinkedList(); StringBuffer searchSQL = new StringBuffer(); ArrayList fields = new ArrayList(); fields.add("file_name"); fields.add("md5_value"); ArrayList> 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 map = (Map) 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 fields = new ArrayList(); 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> rs = null; // MissionResult result = new MissionResult(); try { rs = dao.dbSelect(searchSQL.toString(), fields); String split = ";"; //-- 整理到对象集合 if(rs!=null && rs.size()>0){ Map 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 fields = new ArrayList(); 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> rs = null; // MissionResult result = new MissionResult(); try { rs = dao.dbSelect(searchSQL.toString(), fields); // String split = ";"; //-- 整理到对象集合 if(rs!=null && rs.size()>0){ Map 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 getMissionResultsForTask(long missionId,int missionType){ if(missionType==0 || missionId == 0l){ return null; } ArrayList mrList = new ArrayList(); 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("node_ip"); fields.add("result"); fields.add("seq_id"); ArrayList> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields); //-- 整理到对象集合 if(rs!=null && rs.size()>0){ for(Map 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 getMissionResultsForLoopTask(long missionId,int missionType,Integer resultVal){ if(missionType==0 || missionId == 0l){ return null; } ArrayList mrList = new ArrayList(); 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("node_ip"); fields.add("result"); fields.add("seq_id"); ArrayList> rs = null; try { logger.debug(searchSQL.toString()); rs = dao.dbSelect(searchSQL.toString(), fields); //-- 整理到对象集合 if(rs!=null && rs.size()>0){ for(Map 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 getMissionResultsForLoopTaskByCurMissId(long curMissionId,Integer resultVal){ int missionType = 4; if(curMissionId == 0l || resultVal==null){ return null; } ArrayList mrList = new ArrayList(); 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("node_ip"); fields.add("result"); fields.add("seq_id"); ArrayList> rs = null; try { logger.debug(searchSQL.toString()); rs = dao.dbSelect(searchSQL.toString(), fields); //-- 整理到对象集合 if(rs!=null && rs.size()>0){ for(Map 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 mr2List) throws Exception { List params = new ArrayList(); //-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 loopMissionIdofInsertRltList = new ArrayList();//记录有结果录入的周期任务的总id,并进行轮次检查和更新(因为如果没轮次了再检测,可能任务的总状态就被统计为已完成了,之后的结果也就不会被统计上了) //- 遍历任务结果集 Iterator 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 rList = Common.getLoopMissionRoundInfoList().get(mr.getMissionId()); if(rList == null){ rList = new LinkedList(); 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 loopMissionInfoMap = new HashMap(); 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 mr2List = new ArrayList(); // 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 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 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 fields = new ArrayList(); 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> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields, params); if(rs!=null && rs.size()>0){ for(Map 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 fields = new ArrayList(); 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> rs = null; rs = dao.dbSelect(searchSQL.toString(), fields, params); if(rs!=null && rs.size()>0){ for(Map 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 updateLoopMissionInfo(Map 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 fields = new ArrayList(); 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> rs = null; ArrayList mstList = new ArrayList(); try { rs = dao.dbSelect(searchSQL.toString(), fields); if(rs!=null && rs.size()>0){ for(Map 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 fields = new ArrayList(); 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> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields); if(rs!=null && rs.size()>0){ mission = new MissionStateTable(); Map 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> loopMissionRoundMap 中 * @time Feb 10, 2012-2:23:58 PM * @param missionInfoMap * @param missionId * @return */ public void updateLoopMissionRoundInfo(Map> loopMissionRoundMap,Long missionId) { List mIdsList = new LinkedList(); 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 fields = new ArrayList(); fields.add("mission_id"); try { //将missionId们存入周期任务队列 ArrayList> rs = dao.dbSelect(midsSql, fields); if(rs != null){ for (Iterator midsIte = rs.iterator(); midsIte.hasNext();) { Map midMap = (Map) 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 fields = new ArrayList(); fields.add("cur_mission_id"); fields.add("mission_id"); fields.add("mission_state"); fields.add("start_time"); fields.add("end_time"); ArrayList> rs = null; try { rs = dao.dbSelect(searchSQL.toString(), fields,new String[]{mid.longValue()+""}); if(rs!=null && rs.size()>0){ for(Map 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 list = new LinkedList(); 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 fields = new ArrayList(); fields.add("mission_name"); fields.add("create_time"); fields.add("mission_state"); try { ArrayList> mapsList = this.dao.dbSelect(selectSql, fields); if(mapsList !=null && mapsList.size()>0){ Map 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 fields = new ArrayList(); fields.add("mission_name"); // fields.add("create_time"); try { ArrayList> mapsList = this.dao.dbSelect(selectSql, fields); if(mapsList !=null && mapsList.size()>0){ Map 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 fields = new ArrayList(); fields.add("mission_name"); fields.add("create_time"); try { ArrayList> mapsList = this.dao.dbSelect(selectSql, fields); if(mapsList !=null && mapsList.size()>0){ Map 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 mr2List) { // List updateSqlList = new ArrayList(); // try { // if(mr2List!= null && mr2List.size()>0){ // Iterator 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 fields = new ArrayList(); fields.add("mission_id"); try { // StringBuffer missionIds = new StringBuffer(); List> mapList = dao.dbSelect(selectSql.toString(), fields); if(mapList != null && mapList.size()>0){// for(Map 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(); } }*/ /** * 非周期任务:录入任务结果后,若任务已完成,则更新任务状态为成功、部分成功、全部失败中的一个(原来只有一个完成状态,做此修改便于更清晰的描述任务完成的状态) * 完成(3):t.ok + t.fail = t.total * 成功(31):t.ok + t.fail = t.total and t.ok = t.total * 部分成功(32):t.ok + t.fail = t.total and t.ok>0 and t.fail>0 * 全部失败(30):t.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 fields = new ArrayList(); fields.add("mission_id"); fields.add("ok"); fields.add("fail"); fields.add("total"); try { List> mapList = dao.dbSelect(selectSql.toString(), fields); if(mapList != null && mapList.size()>0){// EmailService emailService = new EmailService(dao); for(Map 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 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("ok"); fields.add("fail"); fields.add("total"); try { List> mapList = dao.dbSelect(selectSql.toString(), fields); if(mapList != null && mapList.size()>0){// List sqls = new ArrayList(); for(Map 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+"个执行节点,
"+(total-ok-fail)+"个未执行,
"+(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,
"+(total-ok-fail)+" i18n_server.UpgradeService.sql.unexecute_n81i,
"+(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 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 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 fields = new ArrayList(); fields.add("missionId"); fields.add("ok"); fields.add("fail"); fields.add("total"); try { List> mapList = dao.dbSelect(selectSql.toString(), fields); if(mapList != null && mapList.size()>0){// List sqls = new ArrayList(); for(Map 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+"个执行节点,
"+(total-ok-fail)+"个未执行,
"+(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,
"+(total-ok-fail)+" i18n_server.UpgradeService.sql.unexecute_n81i,
"+(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->3,6->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,");//0,1,-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 fields = new ArrayList(); fields.add("mission_id"); fields.add("mission_state"); try { List> 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 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> mapList0 = dao.dbSelect(missionSql.toString(), fields); //- 变更周期任务信息状态 mission_state_table if(mapList0 != null && mapList0.size()>0){ EmailService emailService = new EmailService(dao); for(Map 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("cur_mission_id"); fields.add("mission_state"); try { List> 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 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 missFields = new ArrayList(); missFields.add("mission_id"); missFields.add("mission_state"); StringBuffer missionIds0 = new StringBuffer("0"); List> mapList0 = dao.dbSelect(missionSql.toString(), missFields); //- 变更周期任务信息状态 mission_state_table if(mapList0 != null && mapList0.size()>0){ EmailService emailService = new EmailService(dao); for(Map 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=4),state=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 fields = new ArrayList(); fields.add("mission_id"); fields.add("mission_state"); try { StringBuffer timeoutMissIds = new StringBuffer("0"); List> timeoutMissMapList = dao.dbSelect(missionTimeoutCheckSQL.toString(), fields); if(timeoutMissMapList != null && timeoutMissMapList.size()>0){ //第二步 for(Map map : timeoutMissMapList){ timeoutMissIds.append(","+map.get("mission_id")); } System.out.println(timeoutMissIds.toString()); //对于超时周期任务的清理:任务结果为下发中的部分 List 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 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 getAllMissRltsForLoopTask(String missionIds){ if(StringUtils.isBlank(missionIds) || "0".equals(missionIds)){ return null; } ArrayList mrList = new ArrayList(); 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 fields = new ArrayList(); fields.add("mission_id"); fields.add("START_TIME"); fields.add("END_TIME"); fields.add("node_ip"); fields.add("result"); fields.add("seq_id"); ArrayList> rs = null; try { logger.debug(searchSQL.toString()); rs = dao.dbSelect(searchSQL.toString(), fields); //-- 整理到对象集合 if(rs!=null && rs.size()>0){ for(Map 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 fields = new ArrayList(); // fields.add("mission_id"); // try { // StringBuffer missionIds = new StringBuffer("0"); // List> mapList = dao.dbSelect(loopSQL.toString(), fields); // //- 变更周期任务信息状态 loopmission_state_table // if(mapList != null && mapList.size()>0){ // for(Map 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> mapList0 = dao.dbSelect(loopSQL.toString(), fields); // //- 变更周期任务信息状态 loopmission_state_table // if(mapList != null && mapList.size()>0){ // for(Map 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(); // } }