HcFtpToFileSystemConfigAction.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. package com.java110.job.Api;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.java110.core.factory.GenerateCodeFactory;
  5. import com.java110.job.dao.IHcFtpFileDAO;
  6. import com.java110.job.smo.DownloadFileFromFtpToTable;
  7. import com.java110.job.task.HcFtpToFileSystemJob;
  8. import org.apache.commons.validator.GenericValidator;
  9. import org.apache.commons.validator.util.ValidatorUtils;
  10. import org.quartz.*;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import javax.servlet.http.HttpServletRequest;
  16. import java.text.DateFormat;
  17. import java.text.SimpleDateFormat;
  18. import java.util.*;
  19. /**
  20. *
  21. * @author wuxw7 add by 20170103
  22. * shiyj update by 2019.08.29
  23. *
  24. */
  25. @Service
  26. public class HcFtpToFileSystemConfigAction {
  27. private static final Logger logger = LoggerFactory.getLogger(HcFtpToFileSystemConfigAction.class);
  28. private static final String defaultCronExpression = "0 * * * * ?";// 每分钟执行一次
  29. private static final String prefixJobName = "HcFtpToSystem_"; // job
  30. private static final String triggerNames = "HcFtpToData_"; // job
  31. // 名称前缀,防止和其他的job名称产生冲突
  32. private static final String RUNFLAG_START = "1";
  33. private static final String RUNFLAG_STOP = "0";
  34. @Autowired
  35. private IHcFtpFileDAO iHcFtpFileDAO;
  36. @Autowired
  37. private Scheduler scheduler;
  38. // 每页数据条数
  39. private static int pageSize = 20;
  40. public JSONObject resultMsg;
  41. /**
  42. *
  43. */
  44. private static final long serialVersionUID = 1L;
  45. private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  46. /**
  47. * 查询配置的需要下载任务的列表
  48. *
  49. * @return
  50. */
  51. public JSONObject queryFtpItems(HttpServletRequest request) {
  52. String curPage = request.getParameter("curPage");
  53. curPage = curPage == null || "".equals(curPage) ? "1" : curPage;
  54. // 查询在用状态时的下载任务列表
  55. Map info = new HashMap();
  56. info.put("curPage", (Integer.parseInt(curPage)-1)*pageSize);
  57. info.put("pageSize", pageSize*Integer.parseInt(curPage));
  58. Map resultInfo = iHcFtpFileDAO.queryFtpItems(info);
  59. // 获取总数据数
  60. int dataCount = resultInfo.get("ITEMSCOUNT") == null ? 0 : Integer.parseInt(resultInfo.get("ITEMSCOUNT").toString());
  61. // 计算页数
  62. if (dataCount % pageSize == 0) {
  63. dataCount /= pageSize;
  64. } else {
  65. dataCount = dataCount / pageSize + 1;
  66. }
  67. // 获取数据
  68. List<Map> ftpItems = resultInfo.get("DATA") == null ? null : (List) resultInfo.get("DATA");
  69. // {"total":10,"rows":[{},{}]}
  70. JSONObject data = new JSONObject();
  71. data.put("total", dataCount);
  72. data.put("currentPage", curPage);
  73. if (ftpItems != null && ftpItems.size() > 0) {
  74. JSONArray rows = new JSONArray();
  75. for (int itemIndex = 0; itemIndex < ftpItems.size(); itemIndex++) {
  76. // 处理时间显示和界面显示传输类型
  77. Map ftpItemMap = ftpItems.get(itemIndex);
  78. ftpItemMap.put("U_OR_D_NAME", ftpItemMap.get("U_OR_D"));// 暂且写死,最终还是读取配置
  79. ftpItemMap.put("CREATE_DATE", df.format(ftpItemMap.get("CREATE_DATE")));// 暂且写死,最终还是读取配置
  80. rows.add(JSONObject.parseObject(JSONObject.toJSONString(ftpItems.get(itemIndex))));
  81. }
  82. data.put("rows", rows);
  83. resultMsg = data;
  84. return data;
  85. }
  86. data.put("rows", "[]");
  87. resultMsg = data;
  88. return data;
  89. }
  90. /**
  91. * 增加Ftp配置
  92. *
  93. * @return
  94. */
  95. public JSONObject addFtpItem(HttpServletRequest request) {
  96. // 请求参数
  97. String ftpItemJson = request.getParameter("ftpItemJson");
  98. JSONObject ftpItemJsonObj = null;
  99. try {
  100. // 校验格式是否正确
  101. ftpItemJsonObj = JSONObject.parseObject(ftpItemJson);
  102. } catch (Exception e) {
  103. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  104. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  105. return resultMsg;
  106. }
  107. // 将ftpItemJson装为Map保存操作
  108. Map paramIn = JSONObject.parseObject(ftpItemJsonObj.getJSONObject("taskInfo").toJSONString(), Map.class);
  109. // 数据规范性校验
  110. Object dealClassObj = null;
  111. //目前写死他
  112. if ("DT".equals(paramIn.get("uOrD").toString())) {
  113. dealClassObj = "downloadFileFromFtpToTable";
  114. }else{
  115. resultMsg = this.createResultMsg("1999", "对应模板不存在,请联系管理员", "");
  116. return resultMsg;
  117. }
  118. // Object dealClassObj = "provInner.DownloadFileFromFtpToTFS";
  119. if (dealClassObj == null) {
  120. resultMsg = this.createResultMsg("1999", "对应模板不存在,请联系管理员", "");
  121. return resultMsg;
  122. }
  123. String dealClass = dealClassObj.toString();
  124. String taskId = GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_HCJOBId);
  125. // 保存数据
  126. paramIn.put("taskId", taskId);
  127. paramIn.put("dealClass", dealClass);
  128. int addFtpItemFlag = iHcFtpFileDAO.addFtpItem(paramIn);
  129. if (addFtpItemFlag > 0) {
  130. // #taskId#,#itemSpecId#,#value#
  131. // 保存属性信息
  132. JSONArray taskAttrs = ftpItemJsonObj.getJSONArray("taskAttrs");
  133. List<Map> taskAttrsList = new ArrayList<Map>();
  134. for (int taskAttrIndex = 0; taskAttrIndex < taskAttrs.size(); taskAttrIndex++) {
  135. JSONObject taskAttr = taskAttrs.getJSONObject(taskAttrIndex);
  136. Map taskAttrMap = new HashMap();
  137. taskAttrMap.put("taskId", taskId);
  138. taskAttrMap.put("itemSpecId", taskAttr.get("itemSpecId"));
  139. taskAttrMap.put("value", taskAttr.get("value"));
  140. taskAttrsList.add(taskAttrMap);
  141. }
  142. int addFtpItemAttrFlag = iHcFtpFileDAO.addFtpItemAttrs(taskAttrsList);
  143. if (addFtpItemAttrFlag > 0) {
  144. resultMsg = this.createResultMsg("0000", "成功", ftpItemJson);
  145. } else {
  146. resultMsg = this.createResultMsg("1999", "保存属性失败", "");
  147. }
  148. return resultMsg;
  149. }
  150. resultMsg = this.createResultMsg("1999", "保存数据失败", "");
  151. return resultMsg;
  152. }
  153. /**
  154. * 编辑Ftp配置,编辑时将会修改所有的ftpItem 信息,所以传递是所有字段需要传递全
  155. *
  156. * @return
  157. */
  158. public JSONObject editFtpItem(HttpServletRequest request) {
  159. // 请求参数为{"taskId":"12","taskName":"经办人照片同步处理","ftpUserName":"weblogic",.....}
  160. String ftpItemJson = request.getParameter("ftpItemJson");
  161. JSONObject ftpItemJsonObj = null;
  162. try {
  163. // 校验格式是否正确
  164. ftpItemJsonObj = JSONObject.parseObject(ftpItemJson);
  165. } catch (Exception e) {
  166. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  167. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  168. return resultMsg;
  169. }
  170. // 将ftpItemJson装为Map保存操作
  171. Map paramIn = JSONObject.parseObject(ftpItemJsonObj.getJSONObject("taskInfo").toJSONString(), Map.class);
  172. Object dealClassObj = null;
  173. //目前写死他
  174. if ("DT".equals(paramIn.get("uOrD").toString())) {
  175. dealClassObj = "downloadFileFromFtpToTable";
  176. }else{
  177. resultMsg = this.createResultMsg("1999", "对应模板不存在,请联系管理员", "");
  178. return resultMsg;
  179. }
  180. // Object dealClassObj = "provInner.DownloadFileFromFtpToTFS";
  181. if (dealClassObj == null) {
  182. resultMsg = this.createResultMsg("1999", "对应模板不存在,请联系管理员", "");
  183. return resultMsg;
  184. }
  185. String dealClass = dealClassObj.toString();
  186. paramIn.put("dealClass", dealClass);
  187. // 根据taskId 查询记录是否存在,如果不存在直接返回失败
  188. Map ftpItem = iHcFtpFileDAO.queryFtpItemByTaskId(paramIn);
  189. // 判断是否有对应的数据
  190. if (ftpItem != null && ftpItem.containsKey("TASKID")) {
  191. // 更新数据
  192. int updateFtpItemFlag = iHcFtpFileDAO.updateFtpItemByTaskId(paramIn);
  193. if (updateFtpItemFlag > 0) {
  194. // 首先先删除
  195. iHcFtpFileDAO.deleteFtpItemAttrsbyTaskId(paramIn);
  196. // 保存属性信息
  197. JSONArray taskAttrs = ftpItemJsonObj.getJSONArray("taskAttrs");
  198. List<Map> taskAttrsList = new ArrayList<Map>();
  199. for (int taskAttrIndex = 0; taskAttrIndex < taskAttrs.size(); taskAttrIndex++) {
  200. JSONObject taskAttr = taskAttrs.getJSONObject(taskAttrIndex);
  201. Map taskAttrMap = new HashMap();
  202. taskAttrMap.put("taskId", paramIn.get("taskId"));
  203. taskAttrMap.put("itemSpecId", taskAttr.get("itemSpecId"));
  204. taskAttrMap.put("value", taskAttr.get("value"));
  205. taskAttrsList.add(taskAttrMap);
  206. }
  207. int addFtpItemAttrFlag = iHcFtpFileDAO.addFtpItemAttrs(taskAttrsList);
  208. if (addFtpItemAttrFlag > 0) {
  209. resultMsg = this.createResultMsg("0000", "成功", ftpItemJson);
  210. } else {
  211. resultMsg = this.createResultMsg("1999", "更新属性失败", "");
  212. }
  213. return resultMsg;
  214. }
  215. resultMsg = this.createResultMsg("1999", "修改的数据不存在或修改失败", "");
  216. return resultMsg;
  217. }
  218. resultMsg = this.createResultMsg("1999", "未找到对应的数据更新失败【" + paramIn.get("taskId") + "】", "");
  219. return resultMsg;
  220. }
  221. /**
  222. * 删除ftp配置
  223. *
  224. * @return
  225. */
  226. public JSONObject deleteFtpItem(HttpServletRequest request) {
  227. // 请求参数为{"tasks":[{"taskId":1},{"taskId":2}],"state":"DELETE"}
  228. String ftpItemJson = request.getParameter("ftpItemJson");
  229. if (logger.isDebugEnabled()) {
  230. logger.debug("---【PrvncFtpToFileSystemConfigAction.deleteFtpItem】入参为:" + ftpItemJson, ftpItemJson);
  231. }
  232. JSONObject paramIn = null;
  233. try {
  234. // 校验格式是否正确
  235. paramIn = JSONObject.parseObject(ftpItemJson);
  236. } catch (Exception e) {
  237. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  238. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson + e, "");
  239. return resultMsg;
  240. }
  241. // 传入报文不为空
  242. if (paramIn == null || !paramIn.containsKey("tasks") || !paramIn.containsKey("state")) {
  243. resultMsg = createResultMsg("1999", "传入参数格式不正确(必须包含tasks 和 state节点):" + ftpItemJson, "");
  244. return resultMsg;
  245. }
  246. // 校验当前是否为启动侦听
  247. if (!"DELETE".equals(paramIn.get("state"))) {
  248. resultMsg = createResultMsg("1999", "传入参数格式不正确(state的值必须是DELETE):" + ftpItemJson, "");
  249. return resultMsg;
  250. }
  251. // 查询需要操作的任务
  252. JSONArray taskInfos = paramIn.getJSONArray("tasks");
  253. String taskIds = "";
  254. for (int taskIndex = 0; taskIndex < taskInfos.size(); taskIndex++) {
  255. taskIds += (taskInfos.getJSONObject(taskIndex).getString("taskId") + ",");
  256. }
  257. if (taskIds.length() > 0) {
  258. taskIds = taskIds.substring(0, taskIds.length() - 1);
  259. }
  260. // 将ftpItemJson装为Map保存操作
  261. Map paramInfo = new HashMap();
  262. paramInfo.put("taskIds", taskIds.split(","));
  263. // 更新数据
  264. int updateFtpItemFlag = iHcFtpFileDAO.deleteFtpItemByTaskId(paramInfo);
  265. if (updateFtpItemFlag > 0) {
  266. resultMsg = this.createResultMsg("0000", "成功", ftpItemJson);
  267. return resultMsg;
  268. }
  269. resultMsg = this.createResultMsg("1999", "删除数据已经不存在,或删除失败", "");
  270. return resultMsg;
  271. }
  272. /**
  273. * 根据taskId 获取 ftp配置信息
  274. *
  275. * @return
  276. */
  277. public String queryFtpItemByTaskId(HttpServletRequest request) {
  278. // 请求参数为{"taskId":"12"}
  279. String ftpItemJson = request.getParameter("ftpItemJson");
  280. if (logger.isDebugEnabled()) {
  281. logger.debug("---【PrvncFtpToFileSystemConfigAction.queryFtpItemByTaskId】入参为:" + ftpItemJson, ftpItemJson);
  282. }
  283. try {
  284. // 校验格式是否正确
  285. JSONObject.parseObject(ftpItemJson);
  286. } catch (Exception e) {
  287. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  288. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  289. return "queryFtpItemByTaskId";
  290. }
  291. // 将ftpItemJson装为Map保存操作
  292. Map paramIn = JSONObject.parseObject(ftpItemJson, Map.class);
  293. // 根据taskId 查询记录是否存在,如果不存在直接返回失败
  294. Map ftpItem = iHcFtpFileDAO.queryFtpItemByTaskId(paramIn);
  295. // 判断是否有对应的数据
  296. if (ftpItem != null && ftpItem.containsKey("TASKID")) {
  297. // 更新数据
  298. this.createResultMsg("0000", "成功", JSONObject.toJSONString(ftpItem));
  299. return "queryFtpItemByTaskId";
  300. }
  301. resultMsg = this.createResultMsg("1999", "删除数据已经不存在,或删除失败", "");
  302. return "queryFtpItemByTaskId";
  303. }
  304. /**
  305. * 查询任务模板 ftpItemJson:{'uOrD':'U'}
  306. *
  307. * @return
  308. */
  309. public JSONObject questTaskTample(HttpServletRequest request) {
  310. // 请求参数为{"taskId":"12"}
  311. String ftpItemJson = request.getParameter("ftpItemJson");
  312. if (logger.isDebugEnabled()) {
  313. logger.debug("---【PrvncFtpToFileSystemConfigAction.queryFtpItemByTaskId】入参为:" + ftpItemJson, ftpItemJson);
  314. }
  315. JSONObject paramIn = null;
  316. try {
  317. // 校验格式是否正确
  318. paramIn = JSONObject.parseObject(ftpItemJson);
  319. } catch (Exception e) {
  320. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  321. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  322. return resultMsg;
  323. }
  324. String tample = paramIn.getString("uOrD");
  325. Map info = new HashMap();
  326. info.put("domain", tample);
  327. List<Map> itemSpecs = iHcFtpFileDAO.queryItemSpec(info);
  328. String taskItems = JSONObject.toJSONString(itemSpecs);
  329. resultMsg = this.createResultMsg("0000", "成功", "{\"U_OR_D\":\"" + tample + "\",\"TASK_ITEMS\":" + taskItems + "}");
  330. return resultMsg;
  331. }
  332. /**
  333. * 根据TaskId 获取任务属性
  334. *
  335. * @return
  336. */
  337. public JSONObject queryTaskAttrs(HttpServletRequest request) {
  338. // 请求参数为{"taskId":"12"}
  339. String ftpItemJson = request.getParameter("ftpItemJson");
  340. if (logger.isDebugEnabled()) {
  341. logger.debug("---【PrvncFtpToFileSystemConfigAction.queryTaskAttrs】入参为:" + ftpItemJson, ftpItemJson);
  342. }
  343. JSONObject paramIn = null;
  344. try {
  345. // 校验格式是否正确
  346. paramIn = JSONObject.parseObject(ftpItemJson);
  347. } catch (Exception e) {
  348. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  349. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  350. return resultMsg;
  351. }
  352. long taskId = paramIn.getLong("taskId");
  353. Map info = new HashMap();
  354. info.put("taskId", taskId);
  355. List<Map> itemAttrs = iHcFtpFileDAO.queryFtpItemAttrsByTaskId(info);
  356. String itemsAttrs = JSONObject.toJSONString(itemAttrs);
  357. resultMsg = this.createResultMsg("0000", "成功", "{\"TASK_ATTRS\":" + itemsAttrs + "}");
  358. return resultMsg;
  359. }
  360. /**
  361. * 启动侦听(多节点启动)
  362. *
  363. * @return
  364. */
  365. public JSONObject startJob(HttpServletRequest request) {
  366. // 请求参数为{"tasks":[{"taskId":1},{"taskId":2}],"state":"START"}
  367. String ftpItemJson = request.getParameter("ftpItemJson");
  368. if (logger.isDebugEnabled()) {
  369. logger.debug("---【PrvncFtpToFileSystemConfigAction.startJob】入参为:" + ftpItemJson, ftpItemJson);
  370. }
  371. JSONObject paramIn = null;
  372. try {
  373. // 校验格式是否正确
  374. paramIn = JSONObject.parseObject(ftpItemJson);
  375. } catch (Exception e) {
  376. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  377. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  378. return resultMsg;
  379. }
  380. // 传入报文不为空
  381. if (paramIn == null || !paramIn.containsKey("tasks") || !paramIn.containsKey("state")) {
  382. resultMsg = createResultMsg("1999", "传入参数格式不正确(必须包含tasks 和 state节点):" + ftpItemJson, "");
  383. return resultMsg;
  384. }
  385. // 校验当前是否为启动侦听
  386. if (!"START".equals(paramIn.get("state"))) {
  387. resultMsg = createResultMsg("1999", "传入参数格式不正确(state的值必须是START):" + ftpItemJson, "");
  388. return resultMsg;
  389. }
  390. // 查询需要操作的任务
  391. JSONArray taskInfos = paramIn.getJSONArray("tasks");
  392. String taskIds = "";
  393. for (int taskIndex = 0; taskIndex < taskInfos.size(); taskIndex++) {
  394. taskIds += (taskInfos.getJSONObject(taskIndex).getString("taskId") + ",");
  395. }
  396. if (taskIds.length() > 0) {
  397. taskIds = taskIds.substring(0, taskIds.length() - 1);
  398. }
  399. Map info = new HashMap();
  400. info.put("taskIds", taskIds.split(","));
  401. List<Map> doFtpItems = iHcFtpFileDAO.queryFtpItemsByTaskIds(info);
  402. int linstenCount = 0;
  403. int updateTaskStateFailCount = 0;
  404. try {
  405. for (int doIndex = 0; doIndex < doFtpItems.size(); doIndex++) {
  406. Map doFtpItem = doFtpItems.get(doIndex);
  407. // 侦听运行状态
  408. String runState = doFtpItem.get("RUN_STATE") == null ? "1" : doFtpItem.get("RUN_STATE").toString();// 如果为空,为了操作正常,默认为1,也就是启动状态,在后面再关闭一次
  409. // 获取taskId
  410. String taskId = doFtpItem.get("TASKID").toString();// 这个就不用三目判断了,因为如果为空,则直接抛出异常,正常情况下不会出现空的情况
  411. // 获取定时时间
  412. String cronExpression = doFtpItem.get("TASKCRON") == null ? defaultCronExpression : doFtpItem.get("TASKCRON").toString();// 如果没有配置则,每一分运行一次
  413. // 设置触发时间点
  414. CronScheduleBuilder cronScheduleBuilder =CronScheduleBuilder.cronSchedule(cronExpression);
  415. String jobName = prefixJobName + taskId;
  416. String triggerName = triggerNames + taskId;
  417. //设置任务名称
  418. JobKey jobKey = new JobKey(jobName,HcFtpToFileSystemJob.JOB_GROUP_NAME);
  419. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
  420. if (jobDetail == null) {
  421. // 任务名称
  422. String taskCfgName = (String) doFtpItem.get("TASKNAME");
  423. //构建job信息
  424. JobDetail warnJob = JobBuilder.newJob(HcFtpToFileSystemJob.class).withIdentity(jobName, HcFtpToFileSystemJob.JOB_GROUP_NAME).withDescription("任务启动").build();
  425. warnJob.getJobDataMap().put(HcFtpToFileSystemJob.JOB_DATA_CONFIG_NAME, taskCfgName);
  426. warnJob.getJobDataMap().put(HcFtpToFileSystemJob.JOB_DATA_TASK_ID, taskId);
  427. // 触发时间点
  428. CronTrigger warnTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerName+"_group").withSchedule(cronScheduleBuilder).build();
  429. // 错过执行后,立即执行
  430. //warnTrigger(CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW);
  431. //交由Scheduler安排触发
  432. scheduler.scheduleJob(warnJob, warnTrigger);
  433. // 修改数据状态,将任务数据状态改为运行状态
  434. Map updateTaskInfo = new HashMap();
  435. updateTaskInfo.put("taskId", taskId);
  436. updateTaskInfo.put("runFlag", RUNFLAG_START);
  437. // 这里更新状态没有成功的,只是在后台打印日志,再前台不进行展示
  438. int updateTaskStateFlag = iHcFtpFileDAO.updateFtpItemByTaskId(updateTaskInfo);
  439. if (updateTaskStateFlag < 1) {
  440. logger.error("---侦听【" + taskId + "】启动成功,但是更新任务状态失败,请关注!!!", info);
  441. updateTaskStateFailCount++;
  442. }
  443. }
  444. linstenCount++;
  445. }
  446. String resultMsgStr = "侦听启动成功,启动目标侦听个数为【" + doFtpItems.size() + "】,成功启动个数为【" + linstenCount + "】";
  447. if (updateTaskStateFailCount > 0) {
  448. resultMsgStr += (",有【" + updateTaskStateFailCount + "】任务启动成功,更新数据失败");
  449. }
  450. resultMsg = this.createResultMsg("0000", resultMsgStr, taskIds);
  451. } catch (Exception e) {
  452. // TODO Auto-generated catch block
  453. logger.error("调度器启动出错:" + ftpItemJson, e);
  454. resultMsg = createResultMsg("1999", "调度器启动出错:" + e, "");
  455. return resultMsg;
  456. }
  457. if (logger.isDebugEnabled()) {
  458. logger.debug("---【PrvncFtpToFileSystemConfigAction.startJob】出参为:" + resultMsg, resultMsg);
  459. }
  460. return resultMsg;
  461. }
  462. /**
  463. * 停止侦听
  464. *
  465. * @return
  466. */
  467. public JSONObject stopJob(HttpServletRequest request) {
  468. // 请求参数为{"tasks":[{"taskId":1},{"taskId":2}],"state":"STOP"}
  469. String ftpItemJson = request.getParameter("ftpItemJson");
  470. if (logger.isDebugEnabled()) {
  471. logger.debug("---【PrvncFtpToFileSystemConfigAction.stopJob】入参为:" + ftpItemJson, ftpItemJson);
  472. }
  473. JSONObject paramIn = null;
  474. try {
  475. // 校验格式是否正确
  476. paramIn = JSONObject.parseObject(ftpItemJson);
  477. } catch (Exception e) {
  478. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  479. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  480. return resultMsg;
  481. }
  482. // 传入报文不为空
  483. if (paramIn == null || !paramIn.containsKey("tasks") || !paramIn.containsKey("state")) {
  484. resultMsg = createResultMsg("1999", "传入参数格式不正确(必须包含tasks 和 state节点):" + ftpItemJson, "");
  485. return resultMsg;
  486. }
  487. // 校验当前是否为启动侦听
  488. if (!"STOP".equals(paramIn.get("state"))) {
  489. resultMsg = createResultMsg("1999", "传入参数格式不正确(state的值必须是START):" + ftpItemJson, "");
  490. return resultMsg;
  491. }
  492. // 查询需要操作的任务
  493. JSONArray taskInfos = paramIn.getJSONArray("tasks");
  494. String taskIds = "";
  495. for (int taskIndex = 0; taskIndex < taskInfos.size(); taskIndex++) {
  496. taskIds += (taskInfos.getJSONObject(taskIndex).getString("taskId") + ",");
  497. }
  498. if (taskIds.length() > 0) {
  499. taskIds = taskIds.substring(0, taskIds.length() - 1);
  500. }
  501. Map info = new HashMap();
  502. info.put("taskIds", taskIds.split(","));
  503. List<Map> doFtpItems = iHcFtpFileDAO.queryFtpItemsByTaskIds(info);
  504. int linstenCount = 0;
  505. int updateTaskStateFailCount = 0;
  506. try {
  507. for (Map doFtpItem : doFtpItems) {
  508. // 获取taskId
  509. String taskId = doFtpItem.get("TASKID").toString();// 这个就不用三目判断了,因为如果为空,则直接抛出异常,正常情况下不会出现空的情况
  510. // 获取定时时间
  511. String cronExpression = doFtpItem.get("TASKCRON") == null ? defaultCronExpression : doFtpItem.get("TASKCRON").toString();// 如果没有配置则,每一分运行一次
  512. String jobName = prefixJobName + taskId;
  513. String triggerName = prefixJobName + taskId;
  514. TriggerKey triggerKey = TriggerKey.triggerKey(jobName, HcFtpToFileSystemJob.JOB_GROUP_NAME);
  515. // 停止触发器
  516. scheduler.pauseTrigger(triggerKey);
  517. // 移除触发器
  518. scheduler.unscheduleJob(triggerKey);
  519. JobKey jobKey = new JobKey(jobName, HcFtpToFileSystemJob.JOB_GROUP_NAME);
  520. // 删除任务
  521. scheduler.deleteJob(jobKey);
  522. // 修改数据状态,将任务数据状态改为运行状态
  523. Map updateTaskInfo = new HashMap();
  524. updateTaskInfo.put("taskId", taskId);
  525. updateTaskInfo.put("runFlag", RUNFLAG_STOP);
  526. // 这里更新状态没有成功的,只是在后台打印日志,再前台不进行展示
  527. int updateTaskStateFlag = iHcFtpFileDAO.updateFtpItemByTaskId(updateTaskInfo);
  528. if (updateTaskStateFlag < 1) {
  529. logger.error("---侦听【" + taskId + "】停止成功,但是更新任务状态失败,请关注!!!", info);
  530. updateTaskStateFailCount++;
  531. }
  532. linstenCount++;
  533. String resultMsgStr = "侦听停止成功,停止目标侦听个数为【" + doFtpItems.size() + "】,成功停止个数为【" + linstenCount + "】";
  534. if (updateTaskStateFailCount > 0) {
  535. resultMsgStr += (",有【" + updateTaskStateFailCount + "】任务停止成功,更新数据失败");
  536. }
  537. resultMsg = this.createResultMsg("0000", resultMsgStr, taskIds);
  538. }
  539. } catch (Exception e) {
  540. // TODO Auto-generated catch block
  541. logger.error("调度器停止出错:" + ftpItemJson, e);
  542. resultMsg = createResultMsg("1999", "调度器停止出错:" + e, "");
  543. return resultMsg;
  544. }
  545. if (logger.isDebugEnabled()) {
  546. logger.debug("---【PrvncFtpToFileSystemConfigAction.startJob】出参为:" + resultMsg, resultMsg);
  547. }
  548. return resultMsg;
  549. }
  550. /**
  551. * 根据任务名称或任务ID模糊查询
  552. *
  553. * @return
  554. */
  555. public String searchTaskByNameOrId(HttpServletRequest request) {
  556. String ftpItemJson = request.getParameter("ftpItemJson");
  557. JSONObject ftpItemJsonObj = null;
  558. try {
  559. // 校验格式是否正确
  560. // {"taskName":"经办人照片同步处理"}
  561. ftpItemJsonObj = JSONObject.parseObject(ftpItemJson);
  562. } catch (Exception e) {
  563. logger.error("传入参数格式不正确:" + ftpItemJson, e);
  564. resultMsg = createResultMsg("1999", "传入参数格式不正确:" + ftpItemJson, "");
  565. return "addFtpItem";
  566. }
  567. // 将ftpItemJson装为Map保存操作
  568. Map paramIn = JSONObject.parseObject(ftpItemJsonObj.toJSONString(), Map.class);
  569. String taskNameOrTaskId = paramIn.get("taskName") == null ? "1" : paramIn.get("taskName").toString();
  570. taskNameOrTaskId = ValidatorUtils.getValueAsString(paramIn, "taskName");
  571. // 规则校验
  572. JSONObject data = new JSONObject();
  573. data.put("total", 1); // 搜索不进行分页处理
  574. data.put("currentPage", 1);
  575. List<Map> ftpItems = null;
  576. // 说明是taskId
  577. if (GenericValidator.isInt(taskNameOrTaskId) || GenericValidator.isLong(taskNameOrTaskId)) {
  578. // 根据taskId 查询记录
  579. paramIn.put("taskId", taskNameOrTaskId);
  580. Map ftpItem = iHcFtpFileDAO.queryFtpItemByTaskId(paramIn);
  581. if (ftpItem != null && ftpItem.containsKey("FTP_ITEM_ATTRS")) {
  582. ftpItem.remove("FTP_ITEM_ATTRS");// 前台暂时用不到,所以这里将属性移除
  583. ftpItems = new ArrayList<Map>();
  584. ftpItems.add(ftpItem);
  585. }
  586. } else {
  587. ftpItems = iHcFtpFileDAO.searchFtpItemByTaskName(paramIn);
  588. }
  589. JSONArray rows = new JSONArray();
  590. if (ftpItems != null && ftpItems.size() > 0) {
  591. DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  592. for (Map ftpItemMap : ftpItems) {
  593. // 处理时间显示和界面显示传输类型
  594. ftpItemMap.put("U_OR_D_NAME", ftpItemMap.get("U_OR_D"));// 暂且写死,最终还是读取配置
  595. ftpItemMap.put("CREATE_DATE", df.format(ftpItemMap.get("CREATE_DATE")));// 暂且写死,最终还是读取配置
  596. rows.add(JSONObject.parseObject(JSONObject.toJSONString(ftpItemMap)));
  597. }
  598. }
  599. data.put("rows", rows);
  600. resultMsg = data;
  601. return "searchTaskByNameOrId";
  602. }
  603. /**
  604. * 创建公用输出
  605. *
  606. * @return
  607. */
  608. private JSONObject createResultMsg(String resultCode, String resultMsg, String resultInfo) {
  609. JSONObject data = new JSONObject();
  610. data.put("RESULT_CODE", resultCode);
  611. data.put("RESULT_MSG", resultMsg);
  612. data.put("RESULT_INFO", resultInfo);
  613. return data;
  614. }
  615. }