Pārlūkot izejas kodu

review code with spring code style and update spring version and springboot version

kerry 5 gadus atpakaļ
vecāks
revīzija
08a06a72d4
29 mainītis faili ar 632 papildinājumiem un 537 dzēšanām
  1. 7 7
      pom.xml
  2. 1 1
      xxl-job-admin/config/application.properties
  3. 7 0
      xxl-job-admin/pom.xml
  4. 21 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/config/StaticAware.java
  5. 44 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/config/XxlJobConfiguration.java
  6. 7 4
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java
  7. 3 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java
  8. 4 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java
  9. 13 116
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java
  10. 14 1
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java
  11. 2 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java
  12. 1 2
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java
  13. 18 49
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java
  14. 35 172
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
  15. 29 14
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java
  16. 27 11
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java
  17. 31 12
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java
  18. 25 17
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java
  19. 30 11
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java
  20. 43 24
      xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java
  21. 21 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/AlarmService.java
  22. 2 3
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java
  23. 200 0
      xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AlarmServiceImpl.java
  24. 13 28
      xxl-job-admin/src/main/resources/application-dev1.properties
  25. 14 29
      xxl-job-admin/src/main/resources/application-dev2.properties
  26. 12 26
      xxl-job-admin/src/main/resources/application.properties
  27. 2 2
      xxl-job-admin/src/main/resources/templates/common/common.macro.ftl
  28. 2 2
      xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java
  29. 4 0
      xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java

+ 7 - 7
pom.xml Parādīt failu

20
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
21
 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
22
 		<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
22
 		<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
23
-		<maven.compiler.source>1.7</maven.compiler.source>
24
-		<maven.compiler.target>1.7</maven.compiler.target>
23
+		<maven.compiler.source>1.8</maven.compiler.source>
24
+		<maven.compiler.target>1.8</maven.compiler.target>
25
 		<maven.test.skip>true</maven.test.skip>
25
 		<maven.test.skip>true</maven.test.skip>
26
 
26
 
27
 		<xxl-rpc.version>1.5.0</xxl-rpc.version>
27
 		<xxl-rpc.version>1.5.0</xxl-rpc.version>
28
 
28
 
29
-		<spring.version>4.3.25.RELEASE</spring.version>
30
-		<spring-boot.version>1.5.22.RELEASE</spring-boot.version>
31
-		<mybatis-spring-boot-starter.version>1.3.5</mybatis-spring-boot-starter.version>
32
-		<mysql-connector-java.version>5.1.48</mysql-connector-java.version>
29
+		<spring.version>5.2.2.RELEASE</spring.version>
30
+		<spring-boot.version>2.2.2.RELEASE</spring-boot.version>
31
+		<mybatis-spring-boot-starter.version>2.1.1</mybatis-spring-boot-starter.version>
32
+		<mysql-connector-java.version>8.0.18</mysql-connector-java.version>
33
 
33
 
34
-		<slf4j-api.version>1.7.29</slf4j-api.version>
34
+		<slf4j-api.version>1.7.30</slf4j-api.version>
35
 		<junit.version>4.12</junit.version>
35
 		<junit.version>4.12</junit.version>
36
 
36
 
37
 		<groovy.version>2.5.8</groovy.version>
37
 		<groovy.version>2.5.8</groovy.version>

+ 1 - 1
xxl-job-admin/config/application.properties Parādīt failu

1
-spring.profiles.active=production
1
+#spring.profiles.active=production

+ 7 - 0
xxl-job-admin/pom.xml Parādīt failu

73
             <version>${project.parent.version}</version>
73
             <version>${project.parent.version}</version>
74
         </dependency>
74
         </dependency>
75
 
75
 
76
+        <dependency>
77
+            <groupId>org.projectlombok</groupId>
78
+            <artifactId>lombok</artifactId>
79
+            <version>1.18.10</version>
80
+            <scope>provided</scope>
81
+        </dependency>
82
+
76
     </dependencies>
83
     </dependencies>
77
 
84
 
78
     <build>
85
     <build>

+ 21 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/config/StaticAware.java Parādīt failu

1
+package com.xxl.job.admin.config;
2
+
3
+import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
+import com.xxl.job.admin.core.util.I18nUtil;
5
+import org.springframework.beans.BeansException;
6
+import org.springframework.context.ApplicationContext;
7
+import org.springframework.context.ApplicationContextAware;
8
+import org.springframework.stereotype.Component;
9
+
10
+/**
11
+ * @author VcKerry on 2020/1/6
12
+ */
13
+
14
+@Component
15
+public class StaticAware implements ApplicationContextAware {
16
+    @Override
17
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
18
+        final XxlJobAdminConfig bean = applicationContext.getBean(XxlJobAdminConfig.class);
19
+        I18nUtil.setI18n(bean.getI18n());
20
+    }
21
+}

+ 44 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/config/XxlJobConfiguration.java Parādīt failu

1
+package com.xxl.job.admin.config;
2
+
3
+/**
4
+ * @author VcKerry on 2020/1/6
5
+ */
6
+
7
+//@Configuration
8
+public class XxlJobConfiguration {
9
+
10
+ /*   @Bean
11
+    public JobTriggerPoolHelper jobTriggerPoolHelper() {
12
+        return new JobTriggerPoolHelper();
13
+    }
14
+
15
+
16
+    @Bean
17
+    public JobFailMonitorHelper jobFailMonitorHelper(JobTriggerPoolHelper jobTriggerPoolHelper) {
18
+        return new JobFailMonitorHelper(jobTriggerPoolHelper);
19
+    }
20
+
21
+
22
+    @Bean
23
+    public JobLogReportHelper jobLogReportHelper() {
24
+        return new JobLogReportHelper();
25
+    }
26
+
27
+    @Bean
28
+    public JobScheduleHelper jobScheduleHelper(JobTriggerPoolHelper jobTriggerPoolHelper) {
29
+        return new JobScheduleHelper(jobTriggerPoolHelper);
30
+    }
31
+*/
32
+
33
+   /* @Bean(destroyMethod = "destroy")
34
+    public XxlJobScheduler xxlJobScheduler(JobRegistryMonitorHelper jobRegistryMonitorHelper,
35
+                                           JobFailMonitorHelper jobFailMonitorHelper,
36
+                                           JobTriggerPoolHelper jobTriggerPoolHelper,
37
+                                           JobLogReportHelper jobLogReportHelper,
38
+                                           JobScheduleHelper jobScheduleHelper) throws Exception {
39
+        XxlJobScheduler xxlJobScheduler = new XxlJobScheduler(jobRegistryMonitorHelper, jobFailMonitorHelper, jobTriggerPoolHelper, jobLogReportHelper, jobScheduleHelper);
40
+        xxlJobScheduler.init();
41
+        return xxlJobScheduler;
42
+    }*/
43
+
44
+}

+ 7 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java Parādīt failu

1
 package com.xxl.job.admin.controller;
1
 package com.xxl.job.admin.controller;
2
 
2
 
3
 import com.xxl.job.admin.controller.annotation.PermissionLimit;
3
 import com.xxl.job.admin.controller.annotation.PermissionLimit;
4
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
5
 import com.xxl.job.admin.core.exception.XxlJobException;
4
 import com.xxl.job.admin.core.exception.XxlJobException;
6
 import com.xxl.job.admin.core.util.JacksonUtil;
5
 import com.xxl.job.admin.core.util.JacksonUtil;
7
 import com.xxl.job.core.biz.AdminBiz;
6
 import com.xxl.job.core.biz.AdminBiz;
9
 import com.xxl.job.core.biz.model.RegistryParam;
8
 import com.xxl.job.core.biz.model.RegistryParam;
10
 import com.xxl.job.core.biz.model.ReturnT;
9
 import com.xxl.job.core.biz.model.ReturnT;
11
 import com.xxl.job.core.util.XxlJobRemotingUtil;
10
 import com.xxl.job.core.util.XxlJobRemotingUtil;
11
+import org.springframework.beans.factory.annotation.Value;
12
 import org.springframework.stereotype.Controller;
12
 import org.springframework.stereotype.Controller;
13
 import org.springframework.web.bind.annotation.RequestBody;
13
 import org.springframework.web.bind.annotation.RequestBody;
14
 import org.springframework.web.bind.annotation.RequestMapping;
14
 import org.springframework.web.bind.annotation.RequestMapping;
28
     @Resource
28
     @Resource
29
     private AdminBiz adminBiz;
29
     private AdminBiz adminBiz;
30
 
30
 
31
+    @Value("${xxl.job.accessToken}")
32
+    private String accessToken;
33
+
31
 
34
 
32
     // ---------------------- base ----------------------
35
     // ---------------------- base ----------------------
33
 
36
 
35
      * valid access token
38
      * valid access token
36
      */
39
      */
37
     private void validAccessToken(HttpServletRequest request) {
40
     private void validAccessToken(HttpServletRequest request) {
38
-        if (XxlJobAdminConfig.getAdminConfig().getAccessToken() != null
39
-                && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length() > 0
40
-                && !XxlJobAdminConfig.getAdminConfig().getAccessToken().equals(request.getHeader(XxlJobRemotingUtil.XXL_RPC_ACCESS_TOKEN))) {
41
+        if (accessToken != null
42
+                && accessToken.trim().length() > 0
43
+                && !accessToken.equals(request.getHeader(XxlJobRemotingUtil.XXL_RPC_ACCESS_TOKEN))) {
41
             throw new XxlJobException("The access token is wrong.");
44
             throw new XxlJobException("The access token is wrong.");
42
         }
45
         }
43
     }
46
     }

+ 3 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java Parādīt failu

40
     private XxlJobGroupDao xxlJobGroupDao;
40
     private XxlJobGroupDao xxlJobGroupDao;
41
     @Resource
41
     @Resource
42
     private XxlJobService xxlJobService;
42
     private XxlJobService xxlJobService;
43
+    @Resource
44
+    private JobTriggerPoolHelper jobTriggerPoolHelper;
43
 
45
 
44
     @RequestMapping
46
     @RequestMapping
45
     public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
47
     public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "-1") int jobGroup) {
140
             executorParam = "";
142
             executorParam = "";
141
         }
143
         }
142
 
144
 
143
-        JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam);
145
+        jobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam);
144
         return ReturnT.SUCCESS;
146
         return ReturnT.SUCCESS;
145
     }
147
     }
146
 
148
 

+ 4 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java Parādīt failu

44
     public XxlJobInfoDao xxlJobInfoDao;
44
     public XxlJobInfoDao xxlJobInfoDao;
45
     @Resource
45
     @Resource
46
     public XxlJobLogDao xxlJobLogDao;
46
     public XxlJobLogDao xxlJobLogDao;
47
+    @Resource
48
+    private XxlJobScheduler xxlJobScheduler;
47
 
49
 
48
     @RequestMapping
50
     @RequestMapping
49
     public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
51
     public String index(HttpServletRequest request, Model model, @RequestParam(required = false, defaultValue = "0") Integer jobId) {
137
     @ResponseBody
139
     @ResponseBody
138
     public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) {
140
     public ReturnT<LogResult> logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) {
139
         try {
141
         try {
140
-            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress);
142
+            ExecutorBiz executorBiz = xxlJobScheduler.getExecutorBiz(executorAddress);
141
             ReturnT<LogResult> logResult = executorBiz.log(triggerTime, logId, fromLineNum);
143
             ReturnT<LogResult> logResult = executorBiz.log(triggerTime, logId, fromLineNum);
142
 
144
 
143
             // is end
145
             // is end
171
         // request of kill
173
         // request of kill
172
         ReturnT<String> runResult = null;
174
         ReturnT<String> runResult = null;
173
         try {
175
         try {
174
-            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
176
+            ExecutorBiz executorBiz = xxlJobScheduler.getExecutorBiz(log.getExecutorAddress());
175
             runResult = executorBiz.kill(jobInfo.getId());
177
             runResult = executorBiz.kill(jobInfo.getId());
176
         } catch (Exception e) {
178
         } catch (Exception e) {
177
             logger.error(e.getMessage(), e);
179
             logger.error(e.getMessage(), e);

+ 13 - 116
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java Parādīt failu

1
 package com.xxl.job.admin.core.conf;
1
 package com.xxl.job.admin.core.conf;
2
 
2
 
3
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
4
-import com.xxl.job.admin.dao.*;
5
-import org.springframework.beans.factory.DisposableBean;
6
-import org.springframework.beans.factory.InitializingBean;
3
+import lombok.Data;
7
 import org.springframework.beans.factory.annotation.Value;
4
 import org.springframework.beans.factory.annotation.Value;
8
-import org.springframework.mail.javamail.JavaMailSender;
5
+import org.springframework.context.annotation.Configuration;
9
 import org.springframework.stereotype.Component;
6
 import org.springframework.stereotype.Component;
10
-import org.springframework.web.client.RestTemplate;
11
-
12
-import javax.annotation.Resource;
13
-import javax.sql.DataSource;
14
 
7
 
15
 /**
8
 /**
16
- * xxl-job config
17
- *
18
- * @author xuxueli 2017-04-28
9
+ * @author VcKerry on 2020/1/6
19
  */
10
  */
20
 
11
 
21
-@Component
22
-public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
23
-
24
-    private static XxlJobAdminConfig adminConfig = null;
25
-
26
-    public static XxlJobAdminConfig getAdminConfig() {
27
-        return adminConfig;
28
-    }
29
-
30
-
31
-    // ---------------------- XxlJobScheduler ----------------------
32
-
33
-    private XxlJobScheduler xxlJobScheduler;
34
-
35
-    @Override
36
-    public void afterPropertiesSet() throws Exception {
37
-        adminConfig = this;
38
-
39
-        xxlJobScheduler = new XxlJobScheduler();
40
-        xxlJobScheduler.init();
41
-    }
42
 
12
 
43
-    @Override
44
-    public void destroy() throws Exception {
45
-        xxlJobScheduler.destroy();
46
-    }
47
-
48
-
49
-    // ---------------------- XxlJobScheduler ----------------------
13
+@Data
14
+@Configuration
15
+@Component
16
+public class XxlJobAdminConfig {
50
 
17
 
51
-    // conf
52
     @Value("${xxl.job.i18n}")
18
     @Value("${xxl.job.i18n}")
53
     private String i18n;
19
     private String i18n;
54
 
20
 
55
-    @Value("${xxl.job.accessToken}")
56
-    private String accessToken;
57
-
58
-    @Value("${spring.mail.username}")
59
-    private String emailUserName;
60
-
61
     @Value("${xxl.job.triggerpool.fast.max}")
21
     @Value("${xxl.job.triggerpool.fast.max}")
62
     private int triggerPoolFastMax;
22
     private int triggerPoolFastMax;
63
 
23
 
65
     private int triggerPoolSlowMax;
25
     private int triggerPoolSlowMax;
66
 
26
 
67
     @Value("${xxl.job.logretentiondays}")
27
     @Value("${xxl.job.logretentiondays}")
68
-    private int logretentiondays;
69
-
70
-    // dao, service
71
-
72
-    @Resource
73
-    private XxlJobLogDao xxlJobLogDao;
74
-    @Resource
75
-    private XxlJobInfoDao xxlJobInfoDao;
76
-    @Resource
77
-    private XxlJobRegistryDao xxlJobRegistryDao;
78
-    @Resource
79
-    private XxlJobGroupDao xxlJobGroupDao;
80
-    @Resource
81
-    private XxlJobLogReportDao xxlJobLogReportDao;
82
-    @Resource
83
-    private JavaMailSender mailSender;
84
-    @Resource
85
-    private DataSource dataSource;
86
-    @Resource
87
-    private RestTemplate restTemplate;
88
-
89
-
90
-    public String getI18n() {
91
-        return i18n;
92
-    }
93
-
94
-    public String getAccessToken() {
95
-        return accessToken;
96
-    }
97
-
98
-    public String getEmailUserName() {
99
-        return emailUserName;
100
-    }
28
+    private int logRetentionDays;
101
 
29
 
102
     public int getTriggerPoolFastMax() {
30
     public int getTriggerPoolFastMax() {
103
         if (triggerPoolFastMax < 200) {
31
         if (triggerPoolFastMax < 200) {
113
         return triggerPoolSlowMax;
41
         return triggerPoolSlowMax;
114
     }
42
     }
115
 
43
 
116
-    public int getLogretentiondays() {
117
-        if (logretentiondays < 7) {
118
-            return -1;  // Limit greater than or equal to 7, otherwise close
44
+    public int getLogRetentionDays() {
45
+        if (logRetentionDays < 7) {
46
+            // Limit greater than or equal to 7, otherwise close
47
+            return -1;
119
         }
48
         }
120
-        return logretentiondays;
121
-    }
122
-
123
-    public XxlJobLogDao getXxlJobLogDao() {
124
-        return xxlJobLogDao;
125
-    }
126
-
127
-    public XxlJobInfoDao getXxlJobInfoDao() {
128
-        return xxlJobInfoDao;
129
-    }
130
-
131
-    public XxlJobRegistryDao getXxlJobRegistryDao() {
132
-        return xxlJobRegistryDao;
133
-    }
134
-
135
-    public XxlJobGroupDao getXxlJobGroupDao() {
136
-        return xxlJobGroupDao;
137
-    }
138
-
139
-    public XxlJobLogReportDao getXxlJobLogReportDao() {
140
-        return xxlJobLogReportDao;
141
-    }
142
-
143
-    public JavaMailSender getMailSender() {
144
-        return mailSender;
145
-    }
146
-
147
-    public DataSource getDataSource() {
148
-        return dataSource;
149
-    }
150
-
151
-    public RestTemplate getRestTemplate() {
152
-        return restTemplate;
49
+        return logRetentionDays;
153
     }
50
     }
154
 }
51
 }

+ 14 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/ExecutorRouter.java Parādīt failu

1
 package com.xxl.job.admin.core.route;
1
 package com.xxl.job.admin.core.route;
2
 
2
 
3
+import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
3
 import com.xxl.job.core.biz.model.ReturnT;
4
 import com.xxl.job.core.biz.model.ReturnT;
4
 import com.xxl.job.core.biz.model.TriggerParam;
5
 import com.xxl.job.core.biz.model.TriggerParam;
5
 import org.slf4j.Logger;
6
 import org.slf4j.Logger;
6
 import org.slf4j.LoggerFactory;
7
 import org.slf4j.LoggerFactory;
8
+import org.springframework.beans.BeansException;
9
+import org.springframework.context.ApplicationContext;
10
+import org.springframework.context.ApplicationContextAware;
7
 
11
 
8
 import java.util.List;
12
 import java.util.List;
9
 
13
 
10
 /**
14
 /**
11
  * Created by xuxueli on 17/3/10.
15
  * Created by xuxueli on 17/3/10.
12
  */
16
  */
13
-public abstract class ExecutorRouter {
17
+public abstract class ExecutorRouter implements ApplicationContextAware {
14
     protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class);
18
     protected static Logger logger = LoggerFactory.getLogger(ExecutorRouter.class);
15
 
19
 
20
+
21
+    protected XxlJobScheduler xxlJobScheduler;
22
+
23
+
24
+    @Override
25
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
26
+        xxlJobScheduler = applicationContext.getBean(XxlJobScheduler.class);
27
+    }
28
+
16
     /**
29
     /**
17
      * route address
30
      * route address
18
      *
31
      *

+ 2 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java Parādīt failu

1
 package com.xxl.job.admin.core.route.strategy;
1
 package com.xxl.job.admin.core.route.strategy;
2
 
2
 
3
 import com.xxl.job.admin.core.route.ExecutorRouter;
3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
5
 import com.xxl.job.admin.core.util.I18nUtil;
4
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.core.biz.ExecutorBiz;
5
 import com.xxl.job.core.biz.ExecutorBiz;
7
 import com.xxl.job.core.biz.model.ReturnT;
6
 import com.xxl.job.core.biz.model.ReturnT;
21
             // beat
20
             // beat
22
             ReturnT<String> idleBeatResult = null;
21
             ReturnT<String> idleBeatResult = null;
23
             try {
22
             try {
24
-                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
23
+                ExecutorBiz executorBiz = xxlJobScheduler.getExecutorBiz(address);
25
                 idleBeatResult = executorBiz.idleBeat(triggerParam.getJobId());
24
                 idleBeatResult = executorBiz.idleBeat(triggerParam.getJobId());
26
             } catch (Exception e) {
25
             } catch (Exception e) {
27
                 logger.error(e.getMessage(), e);
26
                 logger.error(e.getMessage(), e);
28
                 idleBeatResult = new ReturnT<String>(ReturnT.FAIL_CODE, "" + e);
27
                 idleBeatResult = new ReturnT<String>(ReturnT.FAIL_CODE, "" + e);
29
             }
28
             }
30
             idleBeatResultSB.append((idleBeatResultSB.length() > 0) ? "<br><br>" : "")
29
             idleBeatResultSB.append((idleBeatResultSB.length() > 0) ? "<br><br>" : "")
31
-                    .append(I18nUtil.getString("jobconf_idleBeat") + ":")
30
+                    .append(I18nUtil.getString("jobconf_idleBeat")).append(":")
32
                     .append("<br>address:").append(address)
31
                     .append("<br>address:").append(address)
33
                     .append("<br>code:").append(idleBeatResult.getCode())
32
                     .append("<br>code:").append(idleBeatResult.getCode())
34
                     .append("<br>msg:").append(idleBeatResult.getMsg());
33
                     .append("<br>msg:").append(idleBeatResult.getMsg());

+ 1 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java Parādīt failu

1
 package com.xxl.job.admin.core.route.strategy;
1
 package com.xxl.job.admin.core.route.strategy;
2
 
2
 
3
 import com.xxl.job.admin.core.route.ExecutorRouter;
3
 import com.xxl.job.admin.core.route.ExecutorRouter;
4
-import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
5
 import com.xxl.job.admin.core.util.I18nUtil;
4
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.core.biz.ExecutorBiz;
5
 import com.xxl.job.core.biz.ExecutorBiz;
7
 import com.xxl.job.core.biz.model.ReturnT;
6
 import com.xxl.job.core.biz.model.ReturnT;
22
             // beat
21
             // beat
23
             ReturnT<String> beatResult = null;
22
             ReturnT<String> beatResult = null;
24
             try {
23
             try {
25
-                ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
24
+                ExecutorBiz executorBiz = xxlJobScheduler.getExecutorBiz(address);
26
                 beatResult = executorBiz.beat();
25
                 beatResult = executorBiz.beat();
27
             } catch (Exception e) {
26
             } catch (Exception e) {
28
                 logger.error(e.getMessage(), e);
27
                 logger.error(e.getMessage(), e);

+ 18 - 49
xxl-job-admin/src/main/java/com/xxl/job/admin/core/scheduler/XxlJobScheduler.java Parādīt failu

1
 package com.xxl.job.admin.core.scheduler;
1
 package com.xxl.job.admin.core.scheduler;
2
 
2
 
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
-import com.xxl.job.admin.core.thread.*;
5
 import com.xxl.job.admin.core.util.I18nUtil;
3
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.core.biz.ExecutorBiz;
4
 import com.xxl.job.core.biz.ExecutorBiz;
7
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
5
 import com.xxl.job.core.enums.ExecutorBlockStrategyEnum;
12
 import com.xxl.rpc.serialize.impl.HessianSerializer;
10
 import com.xxl.rpc.serialize.impl.HessianSerializer;
13
 import org.slf4j.Logger;
11
 import org.slf4j.Logger;
14
 import org.slf4j.LoggerFactory;
12
 import org.slf4j.LoggerFactory;
13
+import org.springframework.beans.factory.InitializingBean;
14
+import org.springframework.beans.factory.annotation.Value;
15
+import org.springframework.stereotype.Component;
15
 
16
 
17
+import javax.annotation.PostConstruct;
16
 import java.util.concurrent.ConcurrentHashMap;
18
 import java.util.concurrent.ConcurrentHashMap;
17
 import java.util.concurrent.ConcurrentMap;
19
 import java.util.concurrent.ConcurrentMap;
18
 
20
 
20
  * @author xuxueli 2018-10-28 00:18:17
22
  * @author xuxueli 2018-10-28 00:18:17
21
  */
23
  */
22
 
24
 
23
-public class XxlJobScheduler {
25
+@Component
26
+public class XxlJobScheduler implements InitializingBean {
24
     private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
27
     private static final Logger logger = LoggerFactory.getLogger(XxlJobScheduler.class);
25
 
28
 
29
+    @Value("${xxl.job.accessToken}")
30
+    private String accessToken;
26
 
31
 
27
-    public void init() throws Exception {
28
-        // init i18n
29
-        initI18n();
30
-
31
-        // admin registry monitor run
32
-        JobRegistryMonitorHelper.getInstance().start();
33
-
34
-        // admin monitor run
35
-        JobFailMonitorHelper.getInstance().start();
36
-
37
-        // admin trigger pool start
38
-        JobTriggerPoolHelper.toStart();
39
-
40
-        // admin log report start
41
-        JobLogReportHelper.getInstance().start();
42
-
43
-        // start-schedule
44
-        JobScheduleHelper.getInstance().start();
45
-
46
-        logger.info(">>>>>>>>> init xxl-job admin success.");
47
-    }
48
-
49
-
50
-    public void destroy() throws Exception {
51
-
52
-        // stop-schedule
53
-        JobScheduleHelper.getInstance().toStop();
54
-
55
-        // admin log report stop
56
-        JobLogReportHelper.getInstance().toStop();
57
-
58
-        // admin trigger pool stop
59
-        JobTriggerPoolHelper.toStop();
60
-
61
-        // admin monitor stop
62
-        JobFailMonitorHelper.getInstance().toStop();
63
-
64
-        // admin registry stop
65
-        JobRegistryMonitorHelper.getInstance().toStop();
66
-
67
-    }
68
-
69
-    // ---------------------- I18n ----------------------
70
-
32
+    /**
33
+     * I18n
34
+     */
35
+    @PostConstruct
71
     private void initI18n() {
36
     private void initI18n() {
72
         for (ExecutorBlockStrategyEnum item : ExecutorBlockStrategyEnum.values()) {
37
         for (ExecutorBlockStrategyEnum item : ExecutorBlockStrategyEnum.values()) {
73
             item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
38
             item.setTitle(I18nUtil.getString("jobconf_block_".concat(item.name())));
77
     // ---------------------- executor-client ----------------------
42
     // ---------------------- executor-client ----------------------
78
     private static ConcurrentMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
43
     private static ConcurrentMap<String, ExecutorBiz> executorBizRepository = new ConcurrentHashMap<String, ExecutorBiz>();
79
 
44
 
80
-    public static ExecutorBiz getExecutorBiz(String address) throws Exception {
45
+    public ExecutorBiz getExecutorBiz(String address) throws Exception {
81
         // valid
46
         // valid
82
         if (address == null || address.trim().length() == 0) {
47
         if (address == null || address.trim().length() == 0) {
83
             return null;
48
             return null;
100
         referenceBean.setVersion(null);
65
         referenceBean.setVersion(null);
101
         referenceBean.setTimeout(3000);
66
         referenceBean.setTimeout(3000);
102
         referenceBean.setAddress(address);
67
         referenceBean.setAddress(address);
103
-        referenceBean.setAccessToken(XxlJobAdminConfig.getAdminConfig().getAccessToken());
68
+        referenceBean.setAccessToken(accessToken);
104
         referenceBean.setInvokeCallback(null);
69
         referenceBean.setInvokeCallback(null);
105
         referenceBean.setInvokerFactory(null);
70
         referenceBean.setInvokerFactory(null);
106
 
71
 
110
         return executorBiz;
75
         return executorBiz;
111
     }
76
     }
112
 
77
 
78
+    @Override
79
+    public void afterPropertiesSet() throws Exception {
80
+
81
+    }
113
 }
82
 }

+ 35 - 172
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java Parādīt failu

1
 package com.xxl.job.admin.core.thread;
1
 package com.xxl.job.admin.core.thread;
2
 
2
 
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
-import com.xxl.job.admin.core.model.XxlJobGroup;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
3
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
4
 import com.xxl.job.admin.core.model.XxlJobLog;
7
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
5
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
8
 import com.xxl.job.admin.core.util.I18nUtil;
6
 import com.xxl.job.admin.core.util.I18nUtil;
9
-import com.xxl.job.core.biz.model.ReturnT;
7
+import com.xxl.job.admin.dao.XxlJobInfoDao;
8
+import com.xxl.job.admin.dao.XxlJobLogDao;
9
+import com.xxl.job.admin.service.AlarmService;
10
 import org.slf4j.Logger;
10
 import org.slf4j.Logger;
11
 import org.slf4j.LoggerFactory;
11
 import org.slf4j.LoggerFactory;
12
-import org.springframework.mail.javamail.MimeMessageHelper;
13
-import org.springframework.web.client.RestTemplate;
12
+import org.springframework.stereotype.Component;
14
 
13
 
15
-import javax.mail.internet.MimeMessage;
16
-import java.text.MessageFormat;
17
-import java.text.SimpleDateFormat;
18
-import java.util.*;
14
+import javax.annotation.PostConstruct;
15
+import javax.annotation.PreDestroy;
16
+import java.util.List;
19
 import java.util.concurrent.TimeUnit;
17
 import java.util.concurrent.TimeUnit;
20
 
18
 
21
 /**
19
 /**
23
  *
21
  *
24
  * @author xuxueli 2015-9-1 18:05:56
22
  * @author xuxueli 2015-9-1 18:05:56
25
  */
23
  */
24
+@Component
26
 public class JobFailMonitorHelper {
25
 public class JobFailMonitorHelper {
27
     private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);
26
     private static Logger logger = LoggerFactory.getLogger(JobFailMonitorHelper.class);
28
 
27
 
29
-    private static JobFailMonitorHelper instance = new JobFailMonitorHelper();
30
-
31
-    public static JobFailMonitorHelper getInstance() {
32
-        return instance;
33
-    }
34
-
35
     // ---------------------- monitor ----------------------
28
     // ---------------------- monitor ----------------------
36
 
29
 
37
     private Thread monitorThread;
30
     private Thread monitorThread;
38
     private volatile boolean toStop = false;
31
     private volatile boolean toStop = false;
39
 
32
 
33
+
34
+    private final JobTriggerPoolHelper jobTriggerPoolHelper;
35
+    private final AlarmService alarmService;
36
+    private final XxlJobInfoDao xxlJobInfoDao;
37
+    private final XxlJobLogDao xxlJobLogDao;
38
+
39
+    public JobFailMonitorHelper(JobTriggerPoolHelper jobTriggerPoolHelper, XxlJobLogDao xxlJobLogDao, AlarmService alarmService, XxlJobInfoDao xxlJobInfoDao) {
40
+        this.jobTriggerPoolHelper = jobTriggerPoolHelper;
41
+        this.xxlJobLogDao = xxlJobLogDao;
42
+        this.alarmService = alarmService;
43
+        this.xxlJobInfoDao = xxlJobInfoDao;
44
+    }
45
+
46
+
47
+    /**
48
+     * admin monitor run
49
+     */
50
+    @PostConstruct
40
     public void start() {
51
     public void start() {
41
         monitorThread = new Thread(new Runnable() {
52
         monitorThread = new Thread(new Runnable() {
42
 
53
 
47
                 while (!toStop) {
58
                 while (!toStop) {
48
                     try {
59
                     try {
49
 
60
 
50
-                        List<Long> failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findFailJobLogIds(1000);
61
+                        List<Long> failLogIds = xxlJobLogDao.findFailJobLogIds(1000);
51
                         if (failLogIds != null && !failLogIds.isEmpty()) {
62
                         if (failLogIds != null && !failLogIds.isEmpty()) {
52
                             for (long failLogId : failLogIds) {
63
                             for (long failLogId : failLogIds) {
53
 
64
 
54
                                 // lock log
65
                                 // lock log
55
-                                int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, 0, -1);
66
+                                int lockRet = xxlJobLogDao.updateAlarmStatus(failLogId, 0, -1);
56
                                 if (lockRet < 1) {
67
                                 if (lockRet < 1) {
57
                                     continue;
68
                                     continue;
58
                                 }
69
                                 }
59
-                                XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId);
60
-                                XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(log.getJobId());
70
+                                XxlJobLog log = xxlJobLogDao.load(failLogId);
71
+                                XxlJobInfo info = xxlJobInfoDao.loadById(log.getJobId());
61
 
72
 
62
                                 // 1、fail retry monitor
73
                                 // 1、fail retry monitor
63
                                 if (log.getExecutorFailRetryCount() > 0) {
74
                                 if (log.getExecutorFailRetryCount() > 0) {
64
-                                    JobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount() - 1), log.getExecutorShardingParam(), log.getExecutorParam());
75
+                                    jobTriggerPoolHelper.trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount() - 1), log.getExecutorShardingParam(), log.getExecutorParam());
65
                                     String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_type_retry") + "<<<<<<<<<<< </span><br>";
76
                                     String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_type_retry") + "<<<<<<<<<<< </span><br>";
66
                                     log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
77
                                     log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
67
-                                    XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(log);
78
+                                    xxlJobLogDao.updateTriggerInfo(log);
68
                                 }
79
                                 }
69
 
80
 
70
                                 // 2、fail alarm monitor
81
                                 // 2、fail alarm monitor
82
                                     newAlarmStatus = 1;
93
                                     newAlarmStatus = 1;
83
                                 }
94
                                 }
84
 
95
 
85
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, newAlarmStatus);
96
+                                xxlJobLogDao.updateAlarmStatus(failLogId, -1, newAlarmStatus);
86
                             }
97
                             }
87
                         }
98
                         }
88
 
99
 
111
         monitorThread.start();
122
         monitorThread.start();
112
     }
123
     }
113
 
124
 
125
+    @PreDestroy
114
     public void toStop() {
126
     public void toStop() {
115
         toStop = true;
127
         toStop = true;
116
         // interrupt and wait
128
         // interrupt and wait
133
         if (info == null || info.getAlarmEmail() == null || info.getAlarmEmail().trim().length() == 0) {
145
         if (info == null || info.getAlarmEmail() == null || info.getAlarmEmail().trim().length() == 0) {
134
             return false;
146
             return false;
135
         }
147
         }
136
-        boolean alarmResult = true;
137
-
138
-        // email info
139
-        XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(info.getJobGroup());
140
-        String personal = I18nUtil.getString("admin_name_full");
141
-        String title = I18nUtil.getString("jobconf_monitor");
142
-
143
-        Set<String> alarmAddressSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
144
-
145
-        for (String email : alarmAddressSet) {
146
-            try {
147
-                email = email.trim();
148
-                if (email.startsWith("http://") || email.startsWith("https://")) {
149
-                    final String content = textContent(group, info, jobLog, personal);
150
-                    alarmResult = failAlarmHttp(email, title, content, jobLog.getId());
151
-                } else if (email.startsWith("sms://")) {
152
-                    // sms 短信
153
-                } else {
154
-                    String content = emailContent(group, info, jobLog);
155
-                    alarmResult = failAlarmEmail(email, title, content, jobLog.getId(), personal);
156
-                }
157
-            } catch (Exception e) {
158
-                alarmResult = false;
159
-            }
160
-        }
161
-
162
-
163
-        // do something, custom alarm strategy, such as sms
164
-
165
-        return alarmResult;
148
+        return alarmService.alarmNotify(info, jobLog);
166
     }
149
     }
167
 
150
 
168
-    // ---------------------- email alarm ----------------------
169
-
170
-    // email alarm template
171
-    private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
172
-            "<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
173
-            "   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
174
-            "      <tr>\n" +
175
-            "         <td width=\"20%\" >" + I18nUtil.getString("jobinfo_field_jobgroup") + "</td>\n" +
176
-            "         <td width=\"10%\" >" + I18nUtil.getString("jobinfo_field_id") + "</td>\n" +
177
-            "         <td width=\"20%\" >" + I18nUtil.getString("jobinfo_field_jobdesc") + "</td>\n" +
178
-            "         <td width=\"10%\" >" + I18nUtil.getString("jobconf_monitor_alarm_title") + "</td>\n" +
179
-            "         <td width=\"40%\" >" + I18nUtil.getString("jobconf_monitor_alarm_content") + "</td>\n" +
180
-            "      </tr>\n" +
181
-            "   </thead>\n" +
182
-            "   <tbody>\n" +
183
-            "      <tr>\n" +
184
-            "         <td>{0}</td>\n" +
185
-            "         <td>{1}</td>\n" +
186
-            "         <td>{2}</td>\n" +
187
-            "         <td>" + I18nUtil.getString("jobconf_monitor_alarm_type") + "</td>\n" +
188
-            "         <td>{3}</td>\n" +
189
-            "      </tr>\n" +
190
-            "   </tbody>\n" +
191
-            "</table>";
192
-
193
-    private String emailContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog) {
194
-        // alarmContent
195
-        String alarmContent = "Alarm Job LogId=" + jobLog.getId();
196
-        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
197
-            alarmContent += "<br>TriggerMsg=<br>" + jobLog.getTriggerMsg();
198
-        }
199
-        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
200
-            alarmContent += "<br>HandleCode=" + jobLog.getHandleMsg();
201
-        }
202
-        return MessageFormat.format(mailBodyTemplate,
203
-                group != null ? group.getTitle() : "null",
204
-                info.getId(),
205
-                info.getJobDesc(),
206
-                alarmContent);
207
-    }
208
-
209
-    /**
210
-     * Email
211
-     *
212
-     * @param email
213
-     * @param title
214
-     * @param content
215
-     * @param jobLogId for error
216
-     * @return
217
-     */
218
-    private boolean failAlarmEmail(String email, String title, String content, Long jobLogId, String personal) throws Exception {
219
-        // make mail
220
-        try {
221
-            MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();
222
-            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
223
-            helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal);
224
-            helper.setTo(email);
225
-            helper.setSubject(title);
226
-            helper.setText(content, true);
227
-            XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage);
228
-            return true;
229
-        } catch (Exception e) {
230
-            logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLogId, e);
231
-            throw e;
232
-        }
233
-    }
234
-
235
-    private static final String TEXT_TEMPLATE = "{0} \n\n" +
236
-            I18nUtil.getString("jobconf_monitor_detail") + ": \n\n" +
237
-            I18nUtil.getString("jobinfo_field_jobgroup") + " : {1}" + " \n\n" +
238
-            I18nUtil.getString("jobinfo_field_id") + " : {2}" + " \n\n" +
239
-            I18nUtil.getString("jobinfo_field_jobdesc") + " : {3}" + " \n\n" +
240
-            I18nUtil.getString("jobconf_monitor_alarm_title") + " : " + I18nUtil.getString("jobconf_monitor_alarm_type") + " \n\n" +
241
-            I18nUtil.getString("jobconf_monitor_alarm_content") + " : {4}" + " \n\n";
242
-
243
-
244
-    private String textContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog, String personal) {
245
-        // alarmContent
246
-        String alarmContent = "Alarm Job LogId=" + jobLog.getId() + ".";
247
-        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
248
-            alarmContent += "TriggerMsg=" + jobLog.getTriggerMsg() + ".";
249
-        }
250
-        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
251
-            alarmContent += "HandleCode=" + jobLog.getHandleMsg() + ".";
252
-        }
253
-        return MessageFormat.format(TEXT_TEMPLATE,
254
-                personal,
255
-                group != null ? group.getTitle() : "null",
256
-                info.getId(),
257
-                info.getJobDesc(),
258
-                alarmContent);
259
-    }
260
-
261
-    /**
262
-     * todo only support ftqq
263
-     *
264
-     * @param url
265
-     * @param title
266
-     * @param content
267
-     * @param jobLogId
268
-     * @return
269
-     * @throws Exception
270
-     */
271
-    private boolean failAlarmHttp(String url, String title, String content, Long jobLogId) throws Exception {
272
-
273
-        try {
274
-            final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
275
-            final String format = simpleDateFormat.format(new Date());
276
-            title = title + "[" + format + "]";
277
-            final RestTemplate restTemplate = XxlJobAdminConfig.getAdminConfig().getRestTemplate();
278
-            final String forObject = restTemplate.getForObject(url, String.class, title, content);
279
-            logger.debug(">>>>>>>>>>> xxl-job, job result:{}, JobLogId:{}", forObject, jobLogId);
280
-            return true;
281
-        } catch (Exception e) {
282
-            logger.error(">>>>>>>>>>> xxl-job, job fail alarm http send error, JobLogId:{}", jobLogId, e);
283
-            throw e;
284
-        }
285
-    }
286
-
287
-
288
 }
151
 }

+ 29 - 14
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java Parādīt failu

2
 
2
 
3
 import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
3
 import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
 import com.xxl.job.admin.core.model.XxlJobLogReport;
4
 import com.xxl.job.admin.core.model.XxlJobLogReport;
5
+import com.xxl.job.admin.dao.XxlJobLogDao;
6
+import com.xxl.job.admin.dao.XxlJobLogReportDao;
5
 import org.slf4j.Logger;
7
 import org.slf4j.Logger;
6
 import org.slf4j.LoggerFactory;
8
 import org.slf4j.LoggerFactory;
9
+import org.springframework.stereotype.Component;
7
 
10
 
11
+import javax.annotation.PostConstruct;
12
+import javax.annotation.PreDestroy;
8
 import java.util.Calendar;
13
 import java.util.Calendar;
9
 import java.util.Date;
14
 import java.util.Date;
10
 import java.util.List;
15
 import java.util.List;
16
  *
21
  *
17
  * @author xuxueli 2019-11-22
22
  * @author xuxueli 2019-11-22
18
  */
23
  */
24
+@Component
19
 public class JobLogReportHelper {
25
 public class JobLogReportHelper {
20
     private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
26
     private static Logger logger = LoggerFactory.getLogger(JobLogReportHelper.class);
21
 
27
 
22
-    private static JobLogReportHelper instance = new JobLogReportHelper();
23
-
24
-    public static JobLogReportHelper getInstance() {
25
-        return instance;
26
-    }
27
-
28
 
28
 
29
     private Thread logrThread;
29
     private Thread logrThread;
30
     private volatile boolean toStop = false;
30
     private volatile boolean toStop = false;
31
 
31
 
32
+    private final XxlJobLogDao xxlJobLogDao;
33
+    private final XxlJobLogReportDao xxlJobLogReportDao;
34
+    private final XxlJobAdminConfig xxlJobAdminConfig;
35
+
36
+
37
+    public JobLogReportHelper(XxlJobLogDao xxlJobLogDao, XxlJobLogReportDao xxlJobLogReportDao, XxlJobAdminConfig xxlJobAdminConfig) {
38
+        this.xxlJobLogDao = xxlJobLogDao;
39
+        this.xxlJobLogReportDao = xxlJobLogReportDao;
40
+        this.xxlJobAdminConfig = xxlJobAdminConfig;
41
+    }
42
+
43
+    /**
44
+     * admin log report start
45
+     */
46
+    @PostConstruct
32
     public void start() {
47
     public void start() {
33
         logrThread = new Thread(new Runnable() {
48
         logrThread = new Thread(new Runnable() {
34
 
49
 
70
                             xxlJobLogReport.setSucCount(0);
85
                             xxlJobLogReport.setSucCount(0);
71
                             xxlJobLogReport.setFailCount(0);
86
                             xxlJobLogReport.setFailCount(0);
72
 
87
 
73
-                            Map<String, Object> triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findLogReport(todayFrom, todayTo);
88
+                            Map<String, Object> triggerCountMap = xxlJobLogDao.findLogReport(todayFrom, todayTo);
74
                             if (triggerCountMap != null && triggerCountMap.size() > 0) {
89
                             if (triggerCountMap != null && triggerCountMap.size() > 0) {
75
                                 int triggerDayCount = triggerCountMap.containsKey("triggerDayCount") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))) : 0;
90
                                 int triggerDayCount = triggerCountMap.containsKey("triggerDayCount") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))) : 0;
76
                                 int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))) : 0;
91
                                 int triggerDayCountRunning = triggerCountMap.containsKey("triggerDayCountRunning") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCountRunning"))) : 0;
83
                             }
98
                             }
84
 
99
 
85
                             // do refresh
100
                             // do refresh
86
-                            int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().update(xxlJobLogReport);
101
+                            int ret = xxlJobLogReportDao.update(xxlJobLogReport);
87
                             if (ret < 1) {
102
                             if (ret < 1) {
88
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport);
103
+                                xxlJobLogReportDao.save(xxlJobLogReport);
89
                             }
104
                             }
90
                         }
105
                         }
91
 
106
 
96
                     }
111
                     }
97
 
112
 
98
                     // 2、log-clean: switch open & once each day
113
                     // 2、log-clean: switch open & once each day
99
-                    if (XxlJobAdminConfig.getAdminConfig().getLogretentiondays() > 0
100
-                            && System.currentTimeMillis() - lastCleanLogTime > 24 * 60 * 60 * 1000) {
114
+                    if (xxlJobAdminConfig.getLogRetentionDays() > 0 && System.currentTimeMillis() - lastCleanLogTime > 24 * 60 * 60 * 1000) {
101
 
115
 
102
                         // expire-time
116
                         // expire-time
103
                         Calendar expiredDay = Calendar.getInstance();
117
                         Calendar expiredDay = Calendar.getInstance();
104
-                        expiredDay.add(Calendar.DAY_OF_MONTH, -1 * XxlJobAdminConfig.getAdminConfig().getLogretentiondays());
118
+                        expiredDay.add(Calendar.DAY_OF_MONTH, -1 * xxlJobAdminConfig.getLogRetentionDays());
105
                         expiredDay.set(Calendar.HOUR_OF_DAY, 0);
119
                         expiredDay.set(Calendar.HOUR_OF_DAY, 0);
106
                         expiredDay.set(Calendar.MINUTE, 0);
120
                         expiredDay.set(Calendar.MINUTE, 0);
107
                         expiredDay.set(Calendar.SECOND, 0);
121
                         expiredDay.set(Calendar.SECOND, 0);
111
                         // clean expired log
125
                         // clean expired log
112
                         List<Long> logIds = null;
126
                         List<Long> logIds = null;
113
                         do {
127
                         do {
114
-                            logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
128
+                            logIds = xxlJobLogDao.findClearLogIds(0, 0, clearBeforeTime, 0, 1000);
115
                             if (logIds != null && logIds.size() > 0) {
129
                             if (logIds != null && logIds.size() > 0) {
116
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds);
130
+                                xxlJobLogDao.clearLog(logIds);
117
                             }
131
                             }
118
                         } while (logIds != null && logIds.size() > 0);
132
                         } while (logIds != null && logIds.size() > 0);
119
 
133
 
140
         logrThread.start();
154
         logrThread.start();
141
     }
155
     }
142
 
156
 
157
+    @PreDestroy
143
     public void toStop() {
158
     public void toStop() {
144
         toStop = true;
159
         toStop = true;
145
         // interrupt and wait
160
         // interrupt and wait

+ 27 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryMonitorHelper.java Parādīt failu

1
 package com.xxl.job.admin.core.thread;
1
 package com.xxl.job.admin.core.thread;
2
 
2
 
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
 import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5
 import com.xxl.job.admin.core.model.XxlJobRegistry;
4
 import com.xxl.job.admin.core.model.XxlJobRegistry;
5
+import com.xxl.job.admin.dao.XxlJobGroupDao;
6
+import com.xxl.job.admin.dao.XxlJobRegistryDao;
6
 import com.xxl.job.core.enums.RegistryConfig;
7
 import com.xxl.job.core.enums.RegistryConfig;
7
 import org.slf4j.Logger;
8
 import org.slf4j.Logger;
8
 import org.slf4j.LoggerFactory;
9
 import org.slf4j.LoggerFactory;
10
+import org.springframework.stereotype.Component;
9
 
11
 
12
+import javax.annotation.PostConstruct;
13
+import javax.annotation.PreDestroy;
10
 import java.util.*;
14
 import java.util.*;
11
 import java.util.concurrent.TimeUnit;
15
 import java.util.concurrent.TimeUnit;
12
 
16
 
15
  *
19
  *
16
  * @author xuxueli 2016-10-02 19:10:24
20
  * @author xuxueli 2016-10-02 19:10:24
17
  */
21
  */
22
+
23
+@Component
18
 public class JobRegistryMonitorHelper {
24
 public class JobRegistryMonitorHelper {
19
     private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);
25
     private static Logger logger = LoggerFactory.getLogger(JobRegistryMonitorHelper.class);
20
 
26
 
21
-    private static JobRegistryMonitorHelper instance = new JobRegistryMonitorHelper();
22
-
23
-    public static JobRegistryMonitorHelper getInstance() {
24
-        return instance;
25
-    }
26
 
27
 
27
     private Thread registryThread;
28
     private Thread registryThread;
28
     private volatile boolean toStop = false;
29
     private volatile boolean toStop = false;
29
 
30
 
31
+
32
+    private final XxlJobGroupDao xxlJobGroupDao;
33
+    private final XxlJobRegistryDao xxlJobRegistryDao;
34
+
35
+    public JobRegistryMonitorHelper(XxlJobGroupDao xxlJobGroupDao, XxlJobRegistryDao xxlJobRegistryDao) {
36
+        this.xxlJobGroupDao = xxlJobGroupDao;
37
+        this.xxlJobRegistryDao = xxlJobRegistryDao;
38
+    }
39
+
40
+    /**
41
+     * admin registry monitor run
42
+     */
43
+    @PostConstruct
30
     public void start() {
44
     public void start() {
31
         registryThread = new Thread(new Runnable() {
45
         registryThread = new Thread(new Runnable() {
32
             @Override
46
             @Override
34
                 while (!toStop) {
48
                 while (!toStop) {
35
                     try {
49
                     try {
36
                         // auto registry group
50
                         // auto registry group
37
-                        List<XxlJobGroup> groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().findByAddressType(0);
51
+                        List<XxlJobGroup> groupList = xxlJobGroupDao.findByAddressType(0);
38
                         if (groupList != null && !groupList.isEmpty()) {
52
                         if (groupList != null && !groupList.isEmpty()) {
39
 
53
 
40
                             // remove dead address (admin/executor)
54
                             // remove dead address (admin/executor)
41
-                            List<Integer> ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
55
+                            List<Integer> ids = xxlJobRegistryDao.findDead(RegistryConfig.DEAD_TIMEOUT, new Date());
42
                             if (ids != null && ids.size() > 0) {
56
                             if (ids != null && ids.size() > 0) {
43
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids);
57
+                                xxlJobRegistryDao.removeDead(ids);
44
                             }
58
                             }
45
 
59
 
46
                             // fresh online address (admin/executor)
60
                             // fresh online address (admin/executor)
47
                             HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
61
                             HashMap<String, List<String>> appAddressMap = new HashMap<String, List<String>>();
48
-                            List<XxlJobRegistry> list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
62
+                            List<XxlJobRegistry> list = xxlJobRegistryDao.findAll(RegistryConfig.DEAD_TIMEOUT, new Date());
49
                             if (list != null) {
63
                             if (list != null) {
50
                                 for (XxlJobRegistry item : list) {
64
                                 for (XxlJobRegistry item : list) {
51
                                     if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
65
                                     if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) {
76
                                     addressListStr = addressListStr.substring(0, addressListStr.length() - 1);
90
                                     addressListStr = addressListStr.substring(0, addressListStr.length() - 1);
77
                                 }
91
                                 }
78
                                 group.setAddressList(addressListStr);
92
                                 group.setAddressList(addressListStr);
79
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().update(group);
93
+                                xxlJobGroupDao.update(group);
80
                             }
94
                             }
81
                         }
95
                         }
82
                     } catch (Exception e) {
96
                     } catch (Exception e) {
100
         registryThread.start();
114
         registryThread.start();
101
     }
115
     }
102
 
116
 
117
+
118
+    @PreDestroy
103
     public void toStop() {
119
     public void toStop() {
104
         toStop = true;
120
         toStop = true;
105
         // interrupt and wait
121
         // interrupt and wait

+ 31 - 12
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java Parādīt failu

4
 import com.xxl.job.admin.core.cron.CronExpression;
4
 import com.xxl.job.admin.core.cron.CronExpression;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
6
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
7
+import com.xxl.job.admin.dao.XxlJobInfoDao;
7
 import org.slf4j.Logger;
8
 import org.slf4j.Logger;
8
 import org.slf4j.LoggerFactory;
9
 import org.slf4j.LoggerFactory;
10
+import org.springframework.stereotype.Component;
9
 
11
 
12
+import javax.annotation.PostConstruct;
13
+import javax.annotation.PreDestroy;
14
+import javax.sql.DataSource;
10
 import java.sql.Connection;
15
 import java.sql.Connection;
11
 import java.sql.PreparedStatement;
16
 import java.sql.PreparedStatement;
12
 import java.sql.SQLException;
17
 import java.sql.SQLException;
18
 /**
23
 /**
19
  * @author xuxueli 2019-05-21
24
  * @author xuxueli 2019-05-21
20
  */
25
  */
26
+
27
+@Component
21
 public class JobScheduleHelper {
28
 public class JobScheduleHelper {
22
     private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);
29
     private static Logger logger = LoggerFactory.getLogger(JobScheduleHelper.class);
23
 
30
 
24
-    private static JobScheduleHelper instance = new JobScheduleHelper();
25
-
26
-    public static JobScheduleHelper getInstance() {
27
-        return instance;
28
-    }
29
-
30
     public static final long PRE_READ_MS = 5000;    // pre read
31
     public static final long PRE_READ_MS = 5000;    // pre read
31
 
32
 
32
     private Thread scheduleThread;
33
     private Thread scheduleThread;
35
     private volatile boolean ringThreadToStop = false;
36
     private volatile boolean ringThreadToStop = false;
36
     private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();
37
     private volatile static Map<Integer, List<Integer>> ringData = new ConcurrentHashMap<>();
37
 
38
 
39
+    private final JobTriggerPoolHelper jobTriggerPoolHelper;
40
+    private final XxlJobInfoDao xxlJobInfoDao;
41
+    private final DataSource dataSource;
42
+    private final XxlJobAdminConfig xxlJobAdminConfig;
43
+
44
+    public JobScheduleHelper(JobTriggerPoolHelper jobTriggerPoolHelper, XxlJobInfoDao xxlJobInfoDao, DataSource dataSource, XxlJobAdminConfig xxlJobAdminConfig) {
45
+        this.jobTriggerPoolHelper = jobTriggerPoolHelper;
46
+        this.xxlJobInfoDao = xxlJobInfoDao;
47
+        this.dataSource = dataSource;
48
+        this.xxlJobAdminConfig = xxlJobAdminConfig;
49
+    }
50
+
51
+
52
+    /**
53
+     * start-schedule
54
+     */
55
+    @PostConstruct
38
     public void start() {
56
     public void start() {
39
 
57
 
40
         // schedule thread
58
         // schedule thread
52
                 logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
70
                 logger.info(">>>>>>>>> init xxl-job admin scheduler success.");
53
 
71
 
54
                 // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
72
                 // pre-read count: treadpool-size * trigger-qps (each trigger cost 50ms, qps = 1000/50 = 20)
55
-                int preReadCount = (XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax() + XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax()) * 20;
73
+                int preReadCount = (xxlJobAdminConfig.getTriggerPoolFastMax() + xxlJobAdminConfig.getTriggerPoolSlowMax()) * 20;
56
 
74
 
57
                 while (!scheduleThreadToStop) {
75
                 while (!scheduleThreadToStop) {
58
 
76
 
66
                     boolean preReadSuc = true;
84
                     boolean preReadSuc = true;
67
                     try {
85
                     try {
68
 
86
 
69
-                        conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();
87
+                        conn = dataSource.getConnection();
70
                         connAutoCommit = conn.getAutoCommit();
88
                         connAutoCommit = conn.getAutoCommit();
71
                         conn.setAutoCommit(false);
89
                         conn.setAutoCommit(false);
72
 
90
 
77
 
95
 
78
                         // 1、pre read
96
                         // 1、pre read
79
                         long nowTime = System.currentTimeMillis();
97
                         long nowTime = System.currentTimeMillis();
80
-                        List<XxlJobInfo> scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
98
+                        List<XxlJobInfo> scheduleList = xxlJobInfoDao.scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount);
81
                         if (scheduleList != null && scheduleList.size() > 0) {
99
                         if (scheduleList != null && scheduleList.size() > 0) {
82
                             // 2、push time-ring
100
                             // 2、push time-ring
83
                             for (XxlJobInfo jobInfo : scheduleList) {
101
                             for (XxlJobInfo jobInfo : scheduleList) {
94
                                     // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
112
                                     // 2.2、trigger-expire < 5s:direct-trigger && make next-trigger-time
95
 
113
 
96
                                     // 1、trigger
114
                                     // 1、trigger
97
-                                    JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null);
115
+                                    jobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.CRON, -1, null, null);
98
                                     logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId());
116
                                     logger.debug(">>>>>>>>>>> xxl-job, schedule push trigger : jobId = " + jobInfo.getId());
99
 
117
 
100
                                     // 2、fresh next
118
                                     // 2、fresh next
132
 
150
 
133
                             // 3、update trigger info
151
                             // 3、update trigger info
134
                             for (XxlJobInfo jobInfo : scheduleList) {
152
                             for (XxlJobInfo jobInfo : scheduleList) {
135
-                                XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().scheduleUpdate(jobInfo);
153
+                                xxlJobInfoDao.scheduleUpdate(jobInfo);
136
                             }
154
                             }
137
 
155
 
138
                         } else {
156
                         } else {
242
                             // do trigger
260
                             // do trigger
243
                             for (int jobId : ringItemData) {
261
                             for (int jobId : ringItemData) {
244
                                 // do trigger
262
                                 // do trigger
245
-                                JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null);
263
+                                jobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.CRON, -1, null, null);
246
                             }
264
                             }
247
                             // clear
265
                             // clear
248
                             ringItemData.clear();
266
                             ringItemData.clear();
294
         logger.debug(">>>>>>>>>>> xxl-job, schedule push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData));
312
         logger.debug(">>>>>>>>>>> xxl-job, schedule push time-ring : " + ringSecond + " = " + Arrays.asList(ringItemData));
295
     }
313
     }
296
 
314
 
315
+    @PreDestroy
297
     public void toStop() {
316
     public void toStop() {
298
 
317
 
299
         // 1、stop schedule
318
         // 1、stop schedule

+ 25 - 17
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobTriggerPoolHelper.java Parādīt failu

5
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
5
 import com.xxl.job.admin.core.trigger.XxlJobTrigger;
6
 import org.slf4j.Logger;
6
 import org.slf4j.Logger;
7
 import org.slf4j.LoggerFactory;
7
 import org.slf4j.LoggerFactory;
8
+import org.springframework.stereotype.Component;
8
 
9
 
10
+import javax.annotation.PostConstruct;
11
+import javax.annotation.PreDestroy;
9
 import java.util.concurrent.*;
12
 import java.util.concurrent.*;
10
 import java.util.concurrent.atomic.AtomicInteger;
13
 import java.util.concurrent.atomic.AtomicInteger;
11
 
14
 
14
  *
17
  *
15
  * @author xuxueli 2018-07-03 21:08:07
18
  * @author xuxueli 2018-07-03 21:08:07
16
  */
19
  */
20
+
21
+@Component
17
 public class JobTriggerPoolHelper {
22
 public class JobTriggerPoolHelper {
18
     private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
23
     private static Logger logger = LoggerFactory.getLogger(JobTriggerPoolHelper.class);
19
 
24
 
24
     private ThreadPoolExecutor fastTriggerPool = null;
29
     private ThreadPoolExecutor fastTriggerPool = null;
25
     private ThreadPoolExecutor slowTriggerPool = null;
30
     private ThreadPoolExecutor slowTriggerPool = null;
26
 
31
 
32
+
33
+    private final XxlJobTrigger xxlJobTrigger;
34
+    private final XxlJobAdminConfig xxlJobAdminConfig;
35
+
36
+    public JobTriggerPoolHelper(XxlJobTrigger xxlJobTrigger, XxlJobAdminConfig xxlJobAdminConfig) {
37
+
38
+        this.xxlJobTrigger = xxlJobTrigger;
39
+        this.xxlJobAdminConfig = xxlJobAdminConfig;
40
+    }
41
+
42
+    /**
43
+     * admin trigger pool start
44
+     */
45
+    @PostConstruct
27
     public void start() {
46
     public void start() {
28
         fastTriggerPool = new ThreadPoolExecutor(
47
         fastTriggerPool = new ThreadPoolExecutor(
29
                 10,
48
                 10,
30
-                XxlJobAdminConfig.getAdminConfig().getTriggerPoolFastMax(),
49
+                xxlJobAdminConfig.getTriggerPoolFastMax(),
31
                 60L,
50
                 60L,
32
                 TimeUnit.SECONDS,
51
                 TimeUnit.SECONDS,
33
                 new LinkedBlockingQueue<Runnable>(1000),
52
                 new LinkedBlockingQueue<Runnable>(1000),
40
 
59
 
41
         slowTriggerPool = new ThreadPoolExecutor(
60
         slowTriggerPool = new ThreadPoolExecutor(
42
                 10,
61
                 10,
43
-                XxlJobAdminConfig.getAdminConfig().getTriggerPoolSlowMax(),
62
+                xxlJobAdminConfig.getTriggerPoolSlowMax(),
44
                 60L,
63
                 60L,
45
                 TimeUnit.SECONDS,
64
                 TimeUnit.SECONDS,
46
                 new LinkedBlockingQueue<Runnable>(2000),
65
                 new LinkedBlockingQueue<Runnable>(2000),
53
     }
72
     }
54
 
73
 
55
 
74
 
75
+    @PreDestroy
56
     public void stop() {
76
     public void stop() {
57
         //triggerPool.shutdown();
77
         //triggerPool.shutdown();
58
         fastTriggerPool.shutdownNow();
78
         fastTriggerPool.shutdownNow();
87
 
107
 
88
                 try {
108
                 try {
89
                     // do trigger
109
                     // do trigger
90
-                    XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
110
+                    xxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
91
                 } catch (Exception e) {
111
                 } catch (Exception e) {
92
                     logger.error(e.getMessage(), e);
112
                     logger.error(e.getMessage(), e);
93
                 } finally {
113
                 } finally {
115
     }
135
     }
116
 
136
 
117
 
137
 
118
-    // ---------------------- helper ----------------------
119
-
120
-    private static JobTriggerPoolHelper helper = new JobTriggerPoolHelper();
121
-
122
-    public static void toStart() {
123
-        helper.start();
124
-    }
125
-
126
-    public static void toStop() {
127
-        helper.stop();
128
-    }
129
-
130
     /**
138
     /**
131
      * @param jobId
139
      * @param jobId
132
      * @param triggerType
140
      * @param triggerType
136
      * @param executorParam         null: use job param
144
      * @param executorParam         null: use job param
137
      *                              not null: cover job param
145
      *                              not null: cover job param
138
      */
146
      */
139
-    public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
140
-        helper.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
147
+    public void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
148
+        this.addTrigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam);
141
     }
149
     }
142
 
150
 
143
 }
151
 }

+ 30 - 11
xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java Parādīt failu

1
 package com.xxl.job.admin.core.trigger;
1
 package com.xxl.job.admin.core.trigger;
2
 
2
 
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
 import com.xxl.job.admin.core.model.XxlJobGroup;
3
 import com.xxl.job.admin.core.model.XxlJobGroup;
5
 import com.xxl.job.admin.core.model.XxlJobInfo;
4
 import com.xxl.job.admin.core.model.XxlJobInfo;
6
 import com.xxl.job.admin.core.model.XxlJobLog;
5
 import com.xxl.job.admin.core.model.XxlJobLog;
7
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
6
 import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
8
 import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
7
 import com.xxl.job.admin.core.scheduler.XxlJobScheduler;
9
 import com.xxl.job.admin.core.util.I18nUtil;
8
 import com.xxl.job.admin.core.util.I18nUtil;
9
+import com.xxl.job.admin.dao.XxlJobGroupDao;
10
+import com.xxl.job.admin.dao.XxlJobInfoDao;
11
+import com.xxl.job.admin.dao.XxlJobLogDao;
10
 import com.xxl.job.core.biz.ExecutorBiz;
12
 import com.xxl.job.core.biz.ExecutorBiz;
11
 import com.xxl.job.core.biz.model.ReturnT;
13
 import com.xxl.job.core.biz.model.ReturnT;
12
 import com.xxl.job.core.biz.model.TriggerParam;
14
 import com.xxl.job.core.biz.model.TriggerParam;
15
 import com.xxl.rpc.util.ThrowableUtil;
17
 import com.xxl.rpc.util.ThrowableUtil;
16
 import org.slf4j.Logger;
18
 import org.slf4j.Logger;
17
 import org.slf4j.LoggerFactory;
19
 import org.slf4j.LoggerFactory;
20
+import org.springframework.stereotype.Component;
18
 
21
 
19
 import java.util.Date;
22
 import java.util.Date;
20
 
23
 
22
  * xxl-job trigger
25
  * xxl-job trigger
23
  * Created by xuxueli on 17/7/13.
26
  * Created by xuxueli on 17/7/13.
24
  */
27
  */
28
+
29
+@Component
25
 public class XxlJobTrigger {
30
 public class XxlJobTrigger {
26
     private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);
31
     private static Logger logger = LoggerFactory.getLogger(XxlJobTrigger.class);
27
 
32
 
33
+
34
+    private final XxlJobScheduler xxlJobScheduler;
35
+    private final XxlJobGroupDao xxlJobGroupDao;
36
+    private final XxlJobInfoDao xxlJobInfoDao;
37
+    private final XxlJobLogDao xxlJobLogDao;
38
+
39
+    public XxlJobTrigger(XxlJobScheduler xxlJobScheduler, XxlJobGroupDao xxlJobGroupDao, XxlJobInfoDao xxlJobInfoDao, XxlJobLogDao xxlJobLogDao) {
40
+
41
+        this.xxlJobScheduler = xxlJobScheduler;
42
+        this.xxlJobGroupDao = xxlJobGroupDao;
43
+        this.xxlJobInfoDao = xxlJobInfoDao;
44
+        this.xxlJobLogDao = xxlJobLogDao;
45
+    }
46
+
28
     /**
47
     /**
29
      * trigger job
48
      * trigger job
30
      *
49
      *
36
      * @param executorParam         null: use job param
55
      * @param executorParam         null: use job param
37
      *                              not null: cover job param
56
      *                              not null: cover job param
38
      */
57
      */
39
-    public static void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
58
+    public void trigger(int jobId, TriggerTypeEnum triggerType, int failRetryCount, String executorShardingParam, String executorParam) {
40
         // load data
59
         // load data
41
-        XxlJobInfo jobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao().loadById(jobId);
60
+        XxlJobInfo jobInfo = xxlJobInfoDao.loadById(jobId);
42
         if (jobInfo == null) {
61
         if (jobInfo == null) {
43
             logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
62
             logger.warn(">>>>>>>>>>>> trigger fail, jobId invalid,jobId={}", jobId);
44
             return;
63
             return;
47
             jobInfo.setExecutorParam(executorParam);
66
             jobInfo.setExecutorParam(executorParam);
48
         }
67
         }
49
         int finalFailRetryCount = failRetryCount >= 0 ? failRetryCount : jobInfo.getExecutorFailRetryCount();
68
         int finalFailRetryCount = failRetryCount >= 0 ? failRetryCount : jobInfo.getExecutorFailRetryCount();
50
-        XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(jobInfo.getJobGroup());
69
+        XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
51
 
70
 
52
         // sharding param
71
         // sharding param
53
         int[] shardingParam = null;
72
         int[] shardingParam = null;
55
             String[] shardingArr = executorShardingParam.split("/");
74
             String[] shardingArr = executorShardingParam.split("/");
56
             if (shardingArr.length == 2 && isNumeric(shardingArr[0]) && isNumeric(shardingArr[1])) {
75
             if (shardingArr.length == 2 && isNumeric(shardingArr[0]) && isNumeric(shardingArr[1])) {
57
                 shardingParam = new int[2];
76
                 shardingParam = new int[2];
58
-                shardingParam[0] = Integer.valueOf(shardingArr[0]);
59
-                shardingParam[1] = Integer.valueOf(shardingArr[1]);
77
+                shardingParam[0] = Integer.parseInt(shardingArr[0]);
78
+                shardingParam[1] = Integer.parseInt(shardingArr[1]);
60
             }
79
             }
61
         }
80
         }
62
         if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)
81
         if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null)
91
      * @param index               sharding index
110
      * @param index               sharding index
92
      * @param total               sharding index
111
      * @param total               sharding index
93
      */
112
      */
94
-    private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total) {
113
+    private void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total) {
95
 
114
 
96
         // param
115
         // param
97
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
116
         ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);  // block strategy
103
         jobLog.setJobGroup(jobInfo.getJobGroup());
122
         jobLog.setJobGroup(jobInfo.getJobGroup());
104
         jobLog.setJobId(jobInfo.getId());
123
         jobLog.setJobId(jobInfo.getId());
105
         jobLog.setTriggerTime(new Date());
124
         jobLog.setTriggerTime(new Date());
106
-        XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);
125
+        xxlJobLogDao.save(jobLog);
107
         logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
126
         logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());
108
 
127
 
109
         // 2、init trigger-param
128
         // 2、init trigger-param
176
         //jobLog.setTriggerTime();
195
         //jobLog.setTriggerTime();
177
         jobLog.setTriggerCode(triggerResult.getCode());
196
         jobLog.setTriggerCode(triggerResult.getCode());
178
         jobLog.setTriggerMsg(triggerMsgSb.toString());
197
         jobLog.setTriggerMsg(triggerMsgSb.toString());
179
-        XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateTriggerInfo(jobLog);
198
+        xxlJobLogDao.updateTriggerInfo(jobLog);
180
 
199
 
181
         logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId());
200
         logger.debug(">>>>>>>>>>> xxl-job trigger end, jobId:{}", jobLog.getId());
182
     }
201
     }
188
      * @param address
207
      * @param address
189
      * @return
208
      * @return
190
      */
209
      */
191
-    public static ReturnT<String> runExecutor(TriggerParam triggerParam, String address) {
210
+    public ReturnT<String> runExecutor(TriggerParam triggerParam, String address) {
192
         ReturnT<String> runResult = null;
211
         ReturnT<String> runResult = null;
193
         try {
212
         try {
194
-            ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(address);
213
+            ExecutorBiz executorBiz = xxlJobScheduler.getExecutorBiz(address);
195
             runResult = executorBiz.run(triggerParam);
214
             runResult = executorBiz.run(triggerParam);
196
         } catch (Exception e) {
215
         } catch (Exception e) {
197
             logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);
216
             logger.error(">>>>>>>>>>> xxl-job trigger error, please check if the executor[{}] is running.", address, e);

+ 43 - 24
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java Parādīt failu

1
 package com.xxl.job.admin.core.util;
1
 package com.xxl.job.admin.core.util;
2
 
2
 
3
-import com.xxl.job.admin.core.conf.XxlJobAdminConfig;
4
 import org.slf4j.Logger;
3
 import org.slf4j.Logger;
5
 import org.slf4j.LoggerFactory;
4
 import org.slf4j.LoggerFactory;
6
 import org.springframework.core.io.ClassPathResource;
5
 import org.springframework.core.io.ClassPathResource;
19
  *
18
  *
20
  * @author xuxueli 2018-01-17 20:39:06
19
  * @author xuxueli 2018-01-17 20:39:06
21
  */
20
  */
21
+
22
+
22
 public class I18nUtil {
23
 public class I18nUtil {
23
     private static Logger logger = LoggerFactory.getLogger(I18nUtil.class);
24
     private static Logger logger = LoggerFactory.getLogger(I18nUtil.class);
24
 
25
 
25
     private static Properties prop = null;
26
     private static Properties prop = null;
26
 
27
 
28
+    private static String i18n = null;
29
+
30
+    public static void setI18n(String i18n) {
31
+        I18nUtil.i18n = i18n;
32
+    }
33
+
27
     public static Properties loadI18nProp() {
34
     public static Properties loadI18nProp() {
28
-        if (prop != null) {
29
-            return prop;
30
-        }
31
-        try {
32
-            // build i18n prop
33
-            String i18n = XxlJobAdminConfig.getAdminConfig().getI18n();
34
-            i18n = (i18n != null && i18n.trim().length() > 0) ? ("_" + i18n) : i18n;
35
-            String i18nFile = MessageFormat.format("i18n/message{0}.properties", i18n);
36
-
37
-            // load prop
38
-            Resource resource = new ClassPathResource(i18nFile);
39
-            EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
40
-            prop = PropertiesLoaderUtils.loadProperties(encodedResource);
41
-        } catch (IOException e) {
42
-            logger.error(e.getMessage(), e);
35
+        if (prop == null) {
36
+            synchronized (I18nUtil.class) {
37
+                if (prop == null) {
38
+                    try {
39
+                        // build i18n prop
40
+                        if (i18n == null) {
41
+                            i18n = "";
42
+                        } else {
43
+                            i18n = i18n.trim().length() > 0 ? "_" + i18n : i18n;
44
+                        }
45
+                        String i18nFile = MessageFormat.format("i18n/message{0}.properties", i18n);
46
+
47
+                        // load prop
48
+                        Resource resource = new ClassPathResource(i18nFile);
49
+                        EncodedResource encodedResource = new EncodedResource(resource, "UTF-8");
50
+                        prop = PropertiesLoaderUtils.loadProperties(encodedResource);
51
+                    } catch (IOException e) {
52
+                        logger.error(e.getMessage(), e);
53
+                    }
54
+                }
55
+            }
43
         }
56
         }
44
         return prop;
57
         return prop;
45
     }
58
     }
54
         return loadI18nProp().getProperty(key);
67
         return loadI18nProp().getProperty(key);
55
     }
68
     }
56
 
69
 
70
+
71
+    private static Map<String, String> PROPERTIES_CACHE = new HashMap<String, String>();
72
+
57
     /**
73
     /**
58
-     * get mult val of i18n mult key, as json
74
+     * get multi val of i18n mult key, as json
59
      *
75
      *
60
      * @param keys
76
      * @param keys
61
      * @return
77
      * @return
62
      */
78
      */
63
-    public static String getMultString(String... keys) {
64
-        Map<String, String> map = new HashMap<String, String>();
79
+    public static String getMultiString(String... keys) {
80
+        Map<String, String> map;
65
 
81
 
66
         Properties prop = loadI18nProp();
82
         Properties prop = loadI18nProp();
67
         if (keys != null && keys.length > 0) {
83
         if (keys != null && keys.length > 0) {
84
+            map = new HashMap<String, String>(keys.length);
68
             for (String key : keys) {
85
             for (String key : keys) {
69
                 map.put(key, prop.getProperty(key));
86
                 map.put(key, prop.getProperty(key));
70
             }
87
             }
71
         } else {
88
         } else {
72
-            for (String key : prop.stringPropertyNames()) {
73
-                map.put(key, prop.getProperty(key));
89
+            if (PROPERTIES_CACHE.isEmpty()) {
90
+                for (String key : prop.stringPropertyNames()) {
91
+                    PROPERTIES_CACHE.put(key, prop.getProperty(key));
92
+                }
74
             }
93
             }
94
+            map = PROPERTIES_CACHE;
75
         }
95
         }
76
-
77
-        String json = JacksonUtil.writeValueAsString(map);
78
-        return json;
96
+        return JacksonUtil.writeValueAsString(map);
79
     }
97
     }
80
 
98
 
99
+
81
 }
100
 }

+ 21 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/service/AlarmService.java Parādīt failu

1
+package com.xxl.job.admin.service;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobInfo;
4
+import com.xxl.job.admin.core.model.XxlJobLog;
5
+
6
+/**
7
+ * @author VcKerry on 2020/1/6
8
+ */
9
+
10
+public interface AlarmService {
11
+
12
+    /**
13
+     * 告警通知
14
+     *
15
+     * @param info
16
+     * @param jobLog
17
+     * @return
18
+     */
19
+    boolean alarmNotify(XxlJobInfo info, XxlJobLog jobLog);
20
+
21
+}

+ 2 - 3
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AdminBizImpl.java Parādīt failu

5
 import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
5
 import com.xxl.job.admin.core.thread.JobTriggerPoolHelper;
6
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
6
 import com.xxl.job.admin.core.trigger.TriggerTypeEnum;
7
 import com.xxl.job.admin.core.util.I18nUtil;
7
 import com.xxl.job.admin.core.util.I18nUtil;
8
-import com.xxl.job.admin.dao.XxlJobGroupDao;
9
 import com.xxl.job.admin.dao.XxlJobInfoDao;
8
 import com.xxl.job.admin.dao.XxlJobInfoDao;
10
 import com.xxl.job.admin.dao.XxlJobLogDao;
9
 import com.xxl.job.admin.dao.XxlJobLogDao;
11
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
10
 import com.xxl.job.admin.dao.XxlJobRegistryDao;
38
     @Resource
37
     @Resource
39
     private XxlJobRegistryDao xxlJobRegistryDao;
38
     private XxlJobRegistryDao xxlJobRegistryDao;
40
     @Resource
39
     @Resource
41
-    private XxlJobGroupDao xxlJobGroupDao;
40
+    private JobTriggerPoolHelper jobTriggerPoolHelper;
42
 
41
 
43
 
42
 
44
     @Override
43
     @Override
74
                     int childJobId = (childJobIds[i] != null && childJobIds[i].trim().length() > 0 && isNumeric(childJobIds[i])) ? Integer.valueOf(childJobIds[i]) : -1;
73
                     int childJobId = (childJobIds[i] != null && childJobIds[i].trim().length() > 0 && isNumeric(childJobIds[i])) ? Integer.valueOf(childJobIds[i]) : -1;
75
                     if (childJobId > 0) {
74
                     if (childJobId > 0) {
76
 
75
 
77
-                        JobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null);
76
+                        jobTriggerPoolHelper.trigger(childJobId, TriggerTypeEnum.PARENT, -1, null, null);
78
                         ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
77
                         ReturnT<String> triggerChildResult = ReturnT.SUCCESS;
79
 
78
 
80
                         // add msg
79
                         // add msg

+ 200 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/AlarmServiceImpl.java Parādīt failu

1
+package com.xxl.job.admin.service.impl;
2
+
3
+import com.xxl.job.admin.core.model.XxlJobGroup;
4
+import com.xxl.job.admin.core.model.XxlJobInfo;
5
+import com.xxl.job.admin.core.model.XxlJobLog;
6
+import com.xxl.job.admin.core.util.I18nUtil;
7
+import com.xxl.job.admin.dao.XxlJobGroupDao;
8
+import com.xxl.job.admin.service.AlarmService;
9
+import com.xxl.job.core.biz.model.ReturnT;
10
+import org.slf4j.Logger;
11
+import org.slf4j.LoggerFactory;
12
+import org.springframework.beans.factory.annotation.Value;
13
+import org.springframework.mail.javamail.JavaMailSender;
14
+import org.springframework.mail.javamail.MimeMessageHelper;
15
+import org.springframework.stereotype.Service;
16
+import org.springframework.web.client.RestTemplate;
17
+
18
+import javax.mail.internet.MimeMessage;
19
+import java.text.MessageFormat;
20
+import java.text.SimpleDateFormat;
21
+import java.util.Arrays;
22
+import java.util.Date;
23
+import java.util.HashSet;
24
+import java.util.Set;
25
+
26
+/**
27
+ * @author VcKerry on 2020/1/6
28
+ */
29
+
30
+@Service
31
+public class AlarmServiceImpl implements AlarmService {
32
+
33
+    private static Logger logger = LoggerFactory.getLogger(AlarmServiceImpl.class);
34
+
35
+
36
+    @Value("${spring.mail.username}")
37
+    private String emailUserName;
38
+
39
+
40
+    private final XxlJobGroupDao xxlJobGroupDao;
41
+    private final JavaMailSender mailSender;
42
+    private final RestTemplate restTemplate;
43
+
44
+    public AlarmServiceImpl(XxlJobGroupDao xxlJobGroupDao, JavaMailSender mailSender, RestTemplate restTemplate) {
45
+        this.xxlJobGroupDao = xxlJobGroupDao;
46
+        this.mailSender = mailSender;
47
+        this.restTemplate = restTemplate;
48
+    }
49
+
50
+    @Override
51
+    public boolean alarmNotify(XxlJobInfo info, XxlJobLog jobLog) {
52
+
53
+        boolean alarmResult = true;
54
+
55
+        // email info
56
+        XxlJobGroup group = xxlJobGroupDao.load(info.getJobGroup());
57
+        String personal = I18nUtil.getString("admin_name_full");
58
+        String title = I18nUtil.getString("jobconf_monitor");
59
+
60
+        Set<String> alarmAddressSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
61
+
62
+        for (String email : alarmAddressSet) {
63
+            try {
64
+                email = email.trim();
65
+                if (email.startsWith("http://") || email.startsWith("https://")) {
66
+                    final String content = textContent(group, info, jobLog, personal);
67
+                    alarmResult = failAlarmHttp(email, title, content, jobLog.getId());
68
+                } else if (email.startsWith("sms://")) {
69
+                    // sms 短信
70
+                } else {
71
+                    String content = emailContent(group, info, jobLog);
72
+                    alarmResult = failAlarmEmail(email, title, content, jobLog.getId(), personal);
73
+                }
74
+            } catch (Exception e) {
75
+                alarmResult = false;
76
+            }
77
+        }
78
+        // do something, custom alarm strategy, such as sms
79
+        return alarmResult;
80
+    }
81
+
82
+    // ---------------------- email alarm ----------------------
83
+
84
+    // email alarm template
85
+    private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
86
+            "<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
87
+            "   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
88
+            "      <tr>\n" +
89
+            "         <td width=\"20%\" >" + I18nUtil.getString("jobinfo_field_jobgroup") + "</td>\n" +
90
+            "         <td width=\"10%\" >" + I18nUtil.getString("jobinfo_field_id") + "</td>\n" +
91
+            "         <td width=\"20%\" >" + I18nUtil.getString("jobinfo_field_jobdesc") + "</td>\n" +
92
+            "         <td width=\"10%\" >" + I18nUtil.getString("jobconf_monitor_alarm_title") + "</td>\n" +
93
+            "         <td width=\"40%\" >" + I18nUtil.getString("jobconf_monitor_alarm_content") + "</td>\n" +
94
+            "      </tr>\n" +
95
+            "   </thead>\n" +
96
+            "   <tbody>\n" +
97
+            "      <tr>\n" +
98
+            "         <td>{0}</td>\n" +
99
+            "         <td>{1}</td>\n" +
100
+            "         <td>{2}</td>\n" +
101
+            "         <td>" + I18nUtil.getString("jobconf_monitor_alarm_type") + "</td>\n" +
102
+            "         <td>{3}</td>\n" +
103
+            "      </tr>\n" +
104
+            "   </tbody>\n" +
105
+            "</table>";
106
+
107
+    private String emailContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog) {
108
+        // alarmContent
109
+        String alarmContent = "Alarm Job LogId=" + jobLog.getId();
110
+        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
111
+            alarmContent += "<br>TriggerMsg=<br>" + jobLog.getTriggerMsg();
112
+        }
113
+        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
114
+            alarmContent += "<br>HandleCode=" + jobLog.getHandleMsg();
115
+        }
116
+        return MessageFormat.format(mailBodyTemplate,
117
+                group != null ? group.getTitle() : "null",
118
+                info.getId(),
119
+                info.getJobDesc(),
120
+                alarmContent);
121
+    }
122
+
123
+    /**
124
+     * Email
125
+     *
126
+     * @param email
127
+     * @param title
128
+     * @param content
129
+     * @param jobLogId for error
130
+     * @return
131
+     */
132
+    private boolean failAlarmEmail(String email, String title, String content, Long jobLogId, String personal) throws Exception {
133
+        // make mail
134
+        try {
135
+            MimeMessage mimeMessage = mailSender.createMimeMessage();
136
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
137
+            helper.setFrom(emailUserName, personal);
138
+            helper.setTo(email);
139
+            helper.setSubject(title);
140
+            helper.setText(content, true);
141
+            mailSender.send(mimeMessage);
142
+            return true;
143
+        } catch (Exception e) {
144
+            logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLogId, e);
145
+            throw e;
146
+        }
147
+    }
148
+
149
+    private static final String TEXT_TEMPLATE = "{0} \n\n" +
150
+            I18nUtil.getString("jobconf_monitor_detail") + ": \n\n" +
151
+            I18nUtil.getString("jobinfo_field_jobgroup") + " : {1}" + " \n\n" +
152
+            I18nUtil.getString("jobinfo_field_id") + " : {2}" + " \n\n" +
153
+            I18nUtil.getString("jobinfo_field_jobdesc") + " : {3}" + " \n\n" +
154
+            I18nUtil.getString("jobconf_monitor_alarm_title") + " : " + I18nUtil.getString("jobconf_monitor_alarm_type") + " \n\n" +
155
+            I18nUtil.getString("jobconf_monitor_alarm_content") + " : {4}" + " \n\n";
156
+
157
+
158
+    private String textContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog, String personal) {
159
+        // alarmContent
160
+        String alarmContent = "Alarm Job LogId=" + jobLog.getId() + ".";
161
+        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
162
+            alarmContent += "TriggerMsg=" + jobLog.getTriggerMsg() + ".";
163
+        }
164
+        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
165
+            alarmContent += "HandleCode=" + jobLog.getHandleMsg() + ".";
166
+        }
167
+        return MessageFormat.format(TEXT_TEMPLATE,
168
+                personal,
169
+                group != null ? group.getTitle() : "null",
170
+                info.getId(),
171
+                info.getJobDesc(),
172
+                alarmContent);
173
+    }
174
+
175
+    /**
176
+     * todo only support ftqq
177
+     *
178
+     * @param url
179
+     * @param title
180
+     * @param content
181
+     * @param jobLogId
182
+     * @return
183
+     * @throws Exception
184
+     */
185
+    private boolean failAlarmHttp(String url, String title, String content, Long jobLogId) throws Exception {
186
+
187
+        try {
188
+            final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
189
+            final String format = simpleDateFormat.format(new Date());
190
+            title = title + "[" + format + "]";
191
+            final String forObject = restTemplate.getForObject(url, String.class, title, content);
192
+            logger.debug(">>>>>>>>>>> xxl-job, job result:{}, JobLogId:{}", forObject, jobLogId);
193
+            return true;
194
+        } catch (Exception e) {
195
+            logger.error(">>>>>>>>>>> xxl-job, job fail alarm http send error, JobLogId:{}", jobLogId, e);
196
+            throw e;
197
+        }
198
+    }
199
+
200
+}

+ 13 - 28
xxl-job-admin/src/main/resources/application-dev1.properties Parādīt failu

1
 ### web
1
 ### web
2
 server.port=8081
2
 server.port=8081
3
-server.context-path=/xxl-job-admin
4
-
3
+server.servlet.context-path=/xxl-job-admin
4
+### xxl-job, datasource
5
+spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&useSSL=false&characterEncoding=UTF-8
6
+spring.datasource.username=xxl_job
7
+spring.datasource.password=E_wsq@163.com
8
+spring.datasource.hikari.connection-test-query=SELECT 1
9
+spring.datasource.hikari.maximum-pool-size=20
10
+spring.datasource.hikari.minimum-idle=10
5
 ### actuator
11
 ### actuator
6
-management.context-path=/actuator
12
+management.server.servlet.context-path=/actuator
7
 management.health.mail.enabled=false
13
 management.health.mail.enabled=false
8
-
9
 ### resources
14
 ### resources
10
 spring.mvc.servlet.load-on-startup=0
15
 spring.mvc.servlet.load-on-startup=0
11
 spring.mvc.static-path-pattern=/static/**
16
 spring.mvc.static-path-pattern=/static/**
12
 spring.resources.static-locations=classpath:/static/
17
 spring.resources.static-locations=classpath:/static/
13
-
14
 ### freemarker
18
 ### freemarker
15
 spring.freemarker.templateLoaderPath=classpath:/templates/
19
 spring.freemarker.templateLoaderPath=classpath:/templates/
16
 spring.freemarker.suffix=.ftl
20
 spring.freemarker.suffix=.ftl
17
 spring.freemarker.charset=UTF-8
21
 spring.freemarker.charset=UTF-8
18
 spring.freemarker.request-context-attribute=request
22
 spring.freemarker.request-context-attribute=request
19
 spring.freemarker.settings.number_format=0.##########
23
 spring.freemarker.settings.number_format=0.##########
20
-
21
 ### mybatis
24
 ### mybatis
22
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
25
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
23
-
24
-### xxl-job, datasource
25
-spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&characterEncoding=UTF-8
26
-spring.datasource.username=xxl_job
27
-spring.datasource.password=E_wsq@163.com
28
-spring.datasource.driver-class-name=com.mysql.jdbc.Driver
29
-
30
-spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
31
-spring.datasource.tomcat.max-wait=10000
32
-spring.datasource.tomcat.max-active=30
33
-spring.datasource.tomcat.test-on-borrow=true
34
-spring.datasource.tomcat.validation-query=SELECT 1
35
-spring.datasource.tomcat.validation-interval=30000
36
-
37
 ### xxl-job email
26
 ### xxl-job email
38
-spring.mail.host=smtp.qq.com
39
-spring.mail.port=25
40
-spring.mail.username=xxx@qq.com
41
-spring.mail.password=xxx
27
+spring.mail.host=smtp.exmail.qq.com
28
+spring.mail.port=465
29
+spring.mail.username=system@vcarecity.com
30
+spring.mail.password=123Abc
42
 spring.mail.properties.mail.smtp.auth=true
31
 spring.mail.properties.mail.smtp.auth=true
43
 spring.mail.properties.mail.smtp.starttls.enable=true
32
 spring.mail.properties.mail.smtp.starttls.enable=true
44
 spring.mail.properties.mail.smtp.starttls.required=true
33
 spring.mail.properties.mail.smtp.starttls.required=true
45
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
34
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
46
-
47
 ### xxl-job, access token
35
 ### xxl-job, access token
48
 xxl.job.accessToken=
36
 xxl.job.accessToken=
49
-
50
 ### xxl-job, i18n (default empty as chinese, "en" as english)
37
 ### xxl-job, i18n (default empty as chinese, "en" as english)
51
 xxl.job.i18n=
38
 xxl.job.i18n=
52
-
53
 ## xxl-job, triggerpool max size
39
 ## xxl-job, triggerpool max size
54
 xxl.job.triggerpool.fast.max=200
40
 xxl.job.triggerpool.fast.max=200
55
 xxl.job.triggerpool.slow.max=100
41
 xxl.job.triggerpool.slow.max=100
56
-
57
 ### xxl-job, log retention days
42
 ### xxl-job, log retention days
58
 xxl.job.logretentiondays=30
43
 xxl.job.logretentiondays=30

+ 14 - 29
xxl-job-admin/src/main/resources/application-dev2.properties Parādīt failu

1
 ### web
1
 ### web
2
-server.port=8081
3
-server.context-path=/xxl-job-admin
4
-
2
+server.port=8082
3
+server.servlet.context-path=/xxl-job-admin
4
+### xxl-job, datasource
5
+spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&useSSL=false&characterEncoding=UTF-8
6
+spring.datasource.username=xxl_job
7
+spring.datasource.password=E_wsq@163.com
8
+spring.datasource.hikari.connection-test-query=SELECT 1
9
+spring.datasource.hikari.maximum-pool-size=20
10
+spring.datasource.hikari.minimum-idle=10
5
 ### actuator
11
 ### actuator
6
-management.context-path=/actuator
12
+management.server.servlet.context-path=/actuator
7
 management.health.mail.enabled=false
13
 management.health.mail.enabled=false
8
-
9
 ### resources
14
 ### resources
10
 spring.mvc.servlet.load-on-startup=0
15
 spring.mvc.servlet.load-on-startup=0
11
 spring.mvc.static-path-pattern=/static/**
16
 spring.mvc.static-path-pattern=/static/**
12
 spring.resources.static-locations=classpath:/static/
17
 spring.resources.static-locations=classpath:/static/
13
-
14
 ### freemarker
18
 ### freemarker
15
 spring.freemarker.templateLoaderPath=classpath:/templates/
19
 spring.freemarker.templateLoaderPath=classpath:/templates/
16
 spring.freemarker.suffix=.ftl
20
 spring.freemarker.suffix=.ftl
17
 spring.freemarker.charset=UTF-8
21
 spring.freemarker.charset=UTF-8
18
 spring.freemarker.request-context-attribute=request
22
 spring.freemarker.request-context-attribute=request
19
 spring.freemarker.settings.number_format=0.##########
23
 spring.freemarker.settings.number_format=0.##########
20
-
21
 ### mybatis
24
 ### mybatis
22
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
25
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
23
-
24
-### xxl-job, datasource
25
-spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&characterEncoding=UTF-8
26
-spring.datasource.username=xxl_job
27
-spring.datasource.password=E_wsq@163.com
28
-spring.datasource.driver-class-name=com.mysql.jdbc.Driver
29
-
30
-spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
31
-spring.datasource.tomcat.max-wait=10000
32
-spring.datasource.tomcat.max-active=30
33
-spring.datasource.tomcat.test-on-borrow=true
34
-spring.datasource.tomcat.validation-query=SELECT 1
35
-spring.datasource.tomcat.validation-interval=30000
36
-
37
 ### xxl-job email
26
 ### xxl-job email
38
-spring.mail.host=smtp.qq.com
39
-spring.mail.port=25
40
-spring.mail.username=xxx@qq.com
41
-spring.mail.password=xxx
27
+spring.mail.host=smtp.exmail.qq.com
28
+spring.mail.port=465
29
+spring.mail.username=system@vcarecity.com
30
+spring.mail.password=123Abc
42
 spring.mail.properties.mail.smtp.auth=true
31
 spring.mail.properties.mail.smtp.auth=true
43
 spring.mail.properties.mail.smtp.starttls.enable=true
32
 spring.mail.properties.mail.smtp.starttls.enable=true
44
 spring.mail.properties.mail.smtp.starttls.required=true
33
 spring.mail.properties.mail.smtp.starttls.required=true
45
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
34
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
46
-
47
 ### xxl-job, access token
35
 ### xxl-job, access token
48
 xxl.job.accessToken=
36
 xxl.job.accessToken=
49
-
50
 ### xxl-job, i18n (default empty as chinese, "en" as english)
37
 ### xxl-job, i18n (default empty as chinese, "en" as english)
51
 xxl.job.i18n=
38
 xxl.job.i18n=
52
-
53
 ## xxl-job, triggerpool max size
39
 ## xxl-job, triggerpool max size
54
 xxl.job.triggerpool.fast.max=200
40
 xxl.job.triggerpool.fast.max=200
55
 xxl.job.triggerpool.slow.max=100
41
 xxl.job.triggerpool.slow.max=100
56
-
57
 ### xxl-job, log retention days
42
 ### xxl-job, log retention days
58
 xxl.job.logretentiondays=30
43
 xxl.job.logretentiondays=30

+ 12 - 26
xxl-job-admin/src/main/resources/application.properties Parādīt failu

1
 ### web
1
 ### web
2
 server.port=8080
2
 server.port=8080
3
-server.context-path=/xxl-job-admin
4
-
3
+server.servlet.context-path=/xxl-job-admin
4
+### xxl-job, datasource
5
+spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&useSSL=false&characterEncoding=UTF-8
6
+spring.datasource.username=xxl_job
7
+spring.datasource.password=E_wsq@163.com
8
+spring.datasource.hikari.connection-test-query=SELECT 1
9
+spring.datasource.hikari.maximum-pool-size=20
10
+spring.datasource.hikari.minimum-idle=10
5
 ### actuator
11
 ### actuator
6
-management.context-path=/actuator
12
+management.server.servlet.context-path=/actuator
7
 management.health.mail.enabled=false
13
 management.health.mail.enabled=false
8
-
9
 ### resources
14
 ### resources
10
 spring.mvc.servlet.load-on-startup=0
15
 spring.mvc.servlet.load-on-startup=0
11
 spring.mvc.static-path-pattern=/static/**
16
 spring.mvc.static-path-pattern=/static/**
12
 spring.resources.static-locations=classpath:/static/
17
 spring.resources.static-locations=classpath:/static/
13
-
14
 ### freemarker
18
 ### freemarker
15
 spring.freemarker.templateLoaderPath=classpath:/templates/
19
 spring.freemarker.templateLoaderPath=classpath:/templates/
16
 spring.freemarker.suffix=.ftl
20
 spring.freemarker.suffix=.ftl
17
 spring.freemarker.charset=UTF-8
21
 spring.freemarker.charset=UTF-8
18
 spring.freemarker.request-context-attribute=request
22
 spring.freemarker.request-context-attribute=request
19
 spring.freemarker.settings.number_format=0.##########
23
 spring.freemarker.settings.number_format=0.##########
20
-
21
 ### mybatis
24
 ### mybatis
22
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
25
 mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
23
-
24
-### xxl-job, datasource
25
-spring.datasource.url=jdbc:mysql://192.168.10.210:6446/xxl_job?Unicode=true&useSSL=false&characterEncoding=UTF-8
26
-spring.datasource.username=xxl_job
27
-spring.datasource.password=E_wsq@163.com
28
-spring.datasource.driver-class-name=com.mysql.jdbc.Driver
29
-
30
-spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
31
-spring.datasource.tomcat.max-wait=10000
32
-spring.datasource.tomcat.max-active=30
33
-spring.datasource.tomcat.test-on-borrow=true
34
-spring.datasource.tomcat.validation-query=SELECT 1
35
-spring.datasource.tomcat.validation-interval=30000
36
-
37
 ### xxl-job email
26
 ### xxl-job email
38
 spring.mail.host=smtp.exmail.qq.com
27
 spring.mail.host=smtp.exmail.qq.com
39
 spring.mail.port=465
28
 spring.mail.port=465
40
-spring.mail.username=xxx.11.com
41
-spring.mail.password=pass
29
+spring.mail.username=system@vcarecity.com
30
+spring.mail.password=123Abc
42
 spring.mail.properties.mail.smtp.auth=true
31
 spring.mail.properties.mail.smtp.auth=true
43
 spring.mail.properties.mail.smtp.starttls.enable=true
32
 spring.mail.properties.mail.smtp.starttls.enable=true
44
 spring.mail.properties.mail.smtp.starttls.required=true
33
 spring.mail.properties.mail.smtp.starttls.required=true
45
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
34
 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
46
-
47
 ### xxl-job, access token
35
 ### xxl-job, access token
48
 xxl.job.accessToken=
36
 xxl.job.accessToken=
49
-
50
 ### xxl-job, i18n (default empty as chinese, "en" as english)
37
 ### xxl-job, i18n (default empty as chinese, "en" as english)
51
 xxl.job.i18n=
38
 xxl.job.i18n=
52
-
53
 ## xxl-job, triggerpool max size
39
 ## xxl-job, triggerpool max size
54
 xxl.job.triggerpool.fast.max=200
40
 xxl.job.triggerpool.fast.max=200
55
 xxl.job.triggerpool.slow.max=100
41
 xxl.job.triggerpool.slow.max=100
56
-
57
 ### xxl-job, log retention days
42
 ### xxl-job, log retention days
58
 xxl.job.logretentiondays=30
43
 xxl.job.logretentiondays=30
44
+

+ 2 - 2
xxl-job-admin/src/main/resources/templates/common/common.macro.ftl Parādīt failu

29
 	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css">
29
 	<link rel="stylesheet" href="${request.contextPath}/static/adminlte/bower_components/PACE/themes/blue/pace-theme-flash.css">
30
 
30
 
31
 	<#-- i18n -->
31
 	<#-- i18n -->
32
-	<#global I18n = I18nUtil.getMultString()?eval />
32
+	<#global I18n = I18nUtil.getMultiString()?eval />
33
 
33
 
34
 </#macro>
34
 </#macro>
35
 
35
 
59
     <script src="${request.contextPath}/static/js/common.1.js"></script>
59
     <script src="${request.contextPath}/static/js/common.1.js"></script>
60
     <script>
60
     <script>
61
 		var base_url = '${request.contextPath}';
61
 		var base_url = '${request.contextPath}';
62
-        var I18n = ${I18nUtil.getMultString()};
62
+        var I18n = ${I18nUtil.getMultiString()};
63
 	</script>
63
 	</script>
64
 
64
 
65
 </#macro>
65
 </#macro>

+ 2 - 2
xxl-job-admin/src/test/java/com/xxl/job/admin/util/I18nUtilTest.java Parādīt failu

18
     @Test
18
     @Test
19
     public void test() {
19
     public void test() {
20
         System.out.println(I18nUtil.getString("admin_name"));
20
         System.out.println(I18nUtil.getString("admin_name"));
21
-        System.out.println(I18nUtil.getMultString("admin_name", "admin_name_full"));
22
-        System.out.println(I18nUtil.getMultString());
21
+        System.out.println(I18nUtil.getMultiString("admin_name", "admin_name_full"));
22
+        System.out.println(I18nUtil.getMultiString());
23
     }
23
     }
24
 
24
 
25
 }
25
 }

+ 4 - 0
xxl-job-core/src/main/java/com/xxl/job/core/util/XxlJobRemotingUtil.java Parādīt failu

35
             logger.error(e.getMessage(), e);
35
             logger.error(e.getMessage(), e);
36
         }
36
         }
37
         connection.setHostnameVerifier(new HostnameVerifier() {
37
         connection.setHostnameVerifier(new HostnameVerifier() {
38
+            @Override
38
             public boolean verify(String hostname, SSLSession session) {
39
             public boolean verify(String hostname, SSLSession session) {
39
                 return true;
40
                 return true;
40
             }
41
             }
42
     }
43
     }
43
 
44
 
44
     private static final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
45
     private static final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
46
+        @Override
45
         public java.security.cert.X509Certificate[] getAcceptedIssuers() {
47
         public java.security.cert.X509Certificate[] getAcceptedIssuers() {
46
             return new java.security.cert.X509Certificate[]{};
48
             return new java.security.cert.X509Certificate[]{};
47
         }
49
         }
48
 
50
 
51
+        @Override
49
         public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
52
         public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
50
         }
53
         }
51
 
54
 
55
+        @Override
52
         public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
56
         public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
53
         }
57
         }
54
     }};
58
     }};