8f7fb5314bc2a5c3c6bde9488435b389dd0062aa.svn-base 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.xxl.job.admin.core.thread;
  2. import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
  3. import com.xxl.job.admin.core.model.XxlJobLog;
  4. import com.xxl.job.admin.core.util.I18nUtil;
  5. import com.xxl.job.core.biz.model.ReturnT;
  6. import com.xxl.job.core.util.DateUtil;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import java.util.Date;
  10. import java.util.List;
  11. import java.util.concurrent.TimeUnit;
  12. /**
  13. * job lose-monitor instance
  14. *
  15. * @author xuxueli 2015-9-1 18:05:56
  16. */
  17. public class JobLosedMonitorHelper {
  18. private static Logger logger = LoggerFactory.getLogger(JobLosedMonitorHelper.class);
  19. private static JobLosedMonitorHelper instance = new JobLosedMonitorHelper();
  20. public static JobLosedMonitorHelper getInstance(){
  21. return instance;
  22. }
  23. // ---------------------- monitor ----------------------
  24. private Thread monitorThread;
  25. private volatile boolean toStop = false;
  26. public void start(){
  27. monitorThread = new Thread(new Runnable() {
  28. @Override
  29. public void run() {
  30. // monitor
  31. while (!toStop) {
  32. try {
  33. // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败;
  34. Date losedTime = DateUtil.addMinutes(new Date(), -10);
  35. List<Long> losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLostJobIds(losedTime);
  36. if (losedJobIds!=null && losedJobIds.size()>0) {
  37. for (Long logId: losedJobIds) {
  38. XxlJobLog jobLog = new XxlJobLog();
  39. jobLog.setId(logId);
  40. jobLog.setHandleTime(new Date());
  41. jobLog.setHandleCode(ReturnT.FAIL_CODE);
  42. jobLog.setHandleMsg( I18nUtil.getString("joblog_lost_fail") );
  43. XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateHandleInfo(jobLog);
  44. }
  45. }
  46. } catch (Exception e) {
  47. if (!toStop) {
  48. logger.error(">>>>>>>>>>> xxl-job, job fail monitor thread error:{}", e);
  49. }
  50. }
  51. try {
  52. TimeUnit.SECONDS.sleep(60);
  53. } catch (Exception e) {
  54. if (!toStop) {
  55. logger.error(e.getMessage(), e);
  56. }
  57. }
  58. }
  59. logger.info(">>>>>>>>>>> xxl-job, JobLosedMonitorHelper stop");
  60. }
  61. });
  62. monitorThread.setDaemon(true);
  63. monitorThread.setName("xxl-job, admin JobLosedMonitorHelper");
  64. monitorThread.start();
  65. }
  66. public void toStop(){
  67. toStop = true;
  68. // interrupt and wait
  69. monitorThread.interrupt();
  70. try {
  71. monitorThread.join();
  72. } catch (InterruptedException e) {
  73. logger.error(e.getMessage(), e);
  74. }
  75. }
  76. }