浏览代码

调度报表新增"运行中"中状态项,数据加载SQL优化

xuxueli 7 年前
父节点
当前提交
0169d537ef

+ 3 - 1
doc/XXL-JOB官方文档.md 查看文件

1144
 - 1、修复打包部署时资源文件乱码问题;
1144
 - 1、修复打包部署时资源文件乱码问题;
1145
 - 2、修复新版本chrome滚动到顶部失效问题;
1145
 - 2、修复新版本chrome滚动到顶部失效问题;
1146
 - 3、国际化:调度中心实现国际化,支持中文、英文两种语言,默认为中文。
1146
 - 3、国际化:调度中心实现国际化,支持中文、英文两种语言,默认为中文。
1147
+- 4、调度报表新增"运行中"中状态项,数据加载SQL优化;
1148
+- 5、调度报表缓存优化,修复大数据量执行日志加载缓慢的问题;
1147
 
1149
 
1148
 ### TODO LIST
1150
 ### TODO LIST
1149
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
1151
 - 1、任务权限管理:执行器为粒度分配权限,核心操作校验权限;
1161
 - 13、任务依赖增强,新增任务类型 "流程任务",流程节点可挂载普通类型任务,承担任务依赖功能。现有子任务模型取消;需要考虑任务依赖死循环问题;
1163
 - 13、任务依赖增强,新增任务类型 "流程任务",流程节点可挂载普通类型任务,承担任务依赖功能。现有子任务模型取消;需要考虑任务依赖死循环问题;
1162
 - 14、分片任务某一分片失败,支持分片转移;
1164
 - 14、分片任务某一分片失败,支持分片转移;
1163
 - 15、调度中心触发任务后,先推送触发队列,异步触发,然后立即返回。降低quartz线程占用时长。
1165
 - 15、调度中心触发任务后,先推送触发队列,异步触发,然后立即返回。降低quartz线程占用时长。
1164
-- 16、调度报表加载速度慢问题;
1166
+
1165
 
1167
 
1166
 ## 七、其他
1168
 ## 七、其他
1167
 
1169
 

+ 1 - 1
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/I18nUtil.java 查看文件

28
 
28
 
29
     public static Properties loadI18nProp(){
29
     public static Properties loadI18nProp(){
30
         if (prop != null && (System.currentTimeMillis()-lastCacheTim)<60*1000) {
30
         if (prop != null && (System.currentTimeMillis()-lastCacheTim)<60*1000) {
31
-            return prop;
31
+            //return prop;
32
         }
32
         }
33
         try {
33
         try {
34
             // bild i18n prop
34
             // bild i18n prop

+ 1 - 2
xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java 查看文件

41
 	public int triggerCountByHandleCode(@Param("handleCode") int handleCode);
41
 	public int triggerCountByHandleCode(@Param("handleCode") int handleCode);
42
 
42
 
43
 	public List<Map<String, Object>> triggerCountByDay(@Param("from") Date from,
43
 	public List<Map<String, Object>> triggerCountByDay(@Param("from") Date from,
44
-													   @Param("to") Date to,
45
-													   @Param("handleCode") int handleCode);
44
+													   @Param("to") Date to);
46
 
45
 
47
 	public int clearLog(@Param("jobGroup") int jobGroup,
46
 	public int clearLog(@Param("jobGroup") int jobGroup,
48
 						@Param("jobId") int jobId,
47
 						@Param("jobId") int jobId,

+ 17 - 19
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java 查看文件

323
 	@Override
323
 	@Override
324
 	public ReturnT<Map<String, Object>> triggerChartDate(Date startDate, Date endDate) {
324
 	public ReturnT<Map<String, Object>> triggerChartDate(Date startDate, Date endDate) {
325
 		List<String> triggerDayList = new ArrayList<String>();
325
 		List<String> triggerDayList = new ArrayList<String>();
326
+		List<Integer> triggerDayCountRunningList = new ArrayList<Integer>();
326
 		List<Integer> triggerDayCountSucList = new ArrayList<Integer>();
327
 		List<Integer> triggerDayCountSucList = new ArrayList<Integer>();
327
 		List<Integer> triggerDayCountFailList = new ArrayList<Integer>();
328
 		List<Integer> triggerDayCountFailList = new ArrayList<Integer>();
329
+		int triggerCountRunningTotal = 0;
328
 		int triggerCountSucTotal = 0;
330
 		int triggerCountSucTotal = 0;
329
 		int triggerCountFailTotal = 0;
331
 		int triggerCountFailTotal = 0;
330
 
332
 
331
-		List<Map<String, Object>> triggerCountMapAll = xxlJobLogDao.triggerCountByDay(startDate, endDate, -1);
332
-		List<Map<String, Object>> triggerCountMapSuc = xxlJobLogDao.triggerCountByDay(startDate, endDate, ReturnT.SUCCESS_CODE);
333
+		List<Map<String, Object>> triggerCountMapAll = xxlJobLogDao.triggerCountByDay(startDate, endDate);
333
 		if (CollectionUtils.isNotEmpty(triggerCountMapAll)) {
334
 		if (CollectionUtils.isNotEmpty(triggerCountMapAll)) {
334
 			for (Map<String, Object> item: triggerCountMapAll) {
335
 			for (Map<String, Object> item: triggerCountMapAll) {
335
 				String day = String.valueOf(item.get("triggerDay"));
336
 				String day = String.valueOf(item.get("triggerDay"));
336
-				int dayAllCount = Integer.valueOf(String.valueOf(item.get("triggerCount")));
337
-				int daySucCount = 0;
338
-				int dayFailCount = dayAllCount - daySucCount;
339
-
340
-				if (CollectionUtils.isNotEmpty(triggerCountMapSuc)) {
341
-					for (Map<String, Object> sucItem: triggerCountMapSuc) {
342
-						String daySuc = String.valueOf(sucItem.get("triggerDay"));
343
-						if (day.equals(daySuc)) {
344
-							daySucCount = Integer.valueOf(String.valueOf(sucItem.get("triggerCount")));
345
-							dayFailCount = dayAllCount - daySucCount;
346
-						}
347
-					}
348
-				}
337
+				int triggerDayCount = Integer.valueOf(String.valueOf(item.get("triggerDayCount")));
338
+				int triggerDayCountRunning = Integer.valueOf(String.valueOf(item.get("triggerDayCountRunning")));
339
+				int triggerDayCountSuc = Integer.valueOf(String.valueOf(item.get("triggerDayCountSuc")));
340
+				int triggerDayCountFail = triggerDayCount - triggerDayCountRunning - triggerDayCountSuc;
349
 
341
 
350
 				triggerDayList.add(day);
342
 				triggerDayList.add(day);
351
-				triggerDayCountSucList.add(daySucCount);
352
-				triggerDayCountFailList.add(dayFailCount);
353
-				triggerCountSucTotal += daySucCount;
354
-				triggerCountFailTotal += dayFailCount;
343
+				triggerDayCountRunningList.add(triggerDayCountRunning);
344
+				triggerDayCountSucList.add(triggerDayCountSuc);
345
+				triggerDayCountFailList.add(triggerDayCountFail);
346
+
347
+				triggerCountRunningTotal += triggerDayCountRunning;
348
+				triggerCountSucTotal += triggerDayCountSuc;
349
+				triggerCountFailTotal += triggerDayCountFail;
355
 			}
350
 			}
356
 		} else {
351
 		} else {
357
             for (int i = 4; i > -1; i--) {
352
             for (int i = 4; i > -1; i--) {
363
 
358
 
364
 		Map<String, Object> result = new HashMap<String, Object>();
359
 		Map<String, Object> result = new HashMap<String, Object>();
365
 		result.put("triggerDayList", triggerDayList);
360
 		result.put("triggerDayList", triggerDayList);
361
+		result.put("triggerDayCountRunningList", triggerDayCountRunningList);
366
 		result.put("triggerDayCountSucList", triggerDayCountSucList);
362
 		result.put("triggerDayCountSucList", triggerDayCountSucList);
367
 		result.put("triggerDayCountFailList", triggerDayCountFailList);
363
 		result.put("triggerDayCountFailList", triggerDayCountFailList);
364
+
365
+		result.put("triggerCountRunningTotal", triggerCountRunningTotal);
368
 		result.put("triggerCountSucTotal", triggerCountSucTotal);
366
 		result.put("triggerCountSucTotal", triggerCountSucTotal);
369
 		result.put("triggerCountFailTotal", triggerCountFailTotal);
367
 		result.put("triggerCountFailTotal", triggerCountFailTotal);
370
 		return new ReturnT<Map<String, Object>>(result);
368
 		return new ReturnT<Map<String, Object>>(result);

+ 0 - 4
xxl-job-admin/src/main/resources/i18n/message.properties 查看文件

93
 job_dashboard_report=调度报表
93
 job_dashboard_report=调度报表
94
 job_dashboard_report_loaddata_fail=调度报表数据加载异常
94
 job_dashboard_report_loaddata_fail=调度报表数据加载异常
95
 job_dashboard_date_report=日期分布图
95
 job_dashboard_date_report=日期分布图
96
-job_dashboard_date_report_suc_count=成功调度次数
97
-job_dashboard_date_report_fail_count=失败调度次数
98
 job_dashboard_rate_report=成功比例图
96
 job_dashboard_rate_report=成功比例图
99
-job_dashboard_rate_report_suc_count=成功调度次数
100
-job_dashboard_rate_report_fail_count=失败调度次数
101
 
97
 
102
 ## job info
98
 ## job info
103
 jobinfo_name=任务管理
99
 jobinfo_name=任务管理

+ 0 - 4
xxl-job-admin/src/main/resources/i18n/message_en.properties 查看文件

93
 job_dashboard_report=Scheduling report
93
 job_dashboard_report=Scheduling report
94
 job_dashboard_report_loaddata_fail=Scheduling report load data error
94
 job_dashboard_report_loaddata_fail=Scheduling report load data error
95
 job_dashboard_date_report=Date distribution
95
 job_dashboard_date_report=Date distribution
96
-job_dashboard_date_report_suc_count=Successful scheduling number
97
-job_dashboard_date_report_fail_count=Fail scheduling number
98
 job_dashboard_rate_report=Percentage distribution
96
 job_dashboard_rate_report=Percentage distribution
99
-job_dashboard_rate_report_suc_count=Successful scheduling percentage
100
-job_dashboard_rate_report_fail_count=Fail scheduling percentage
101
 
97
 
102
 ## job info
98
 ## job info
103
 jobinfo_name=Job Manage
99
 jobinfo_name=Job Manage

+ 8 - 7
xxl-job-admin/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml 查看文件

163
 	</select>
163
 	</select>
164
 
164
 
165
     <select id="triggerCountByDay" resultType="java.util.Map" >
165
     <select id="triggerCountByDay" resultType="java.util.Map" >
166
-        SELECT DATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay, COUNT(id) triggerCount
167
-        FROM XXL_JOB_QRTZ_TRIGGER_LOG
168
-        WHERE trigger_time BETWEEN #{from} and #{to}
169
-		<if test="handleCode gt 0">
170
-			AND handle_code = #{handleCode}
171
-		</if>
172
-        GROUP BY triggerDay;
166
+		SELECT
167
+			DATE_FORMAT(trigger_time,'%Y-%m-%d') triggerDay,
168
+			COUNT(handle_code) triggerDayCount,
169
+			SUM(CASE WHEN handle_code = 0 then 1 else 0 end) as triggerDayCountRunning,
170
+			SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
171
+		FROM XXL_JOB_QRTZ_TRIGGER_LOG
172
+		WHERE trigger_time BETWEEN #{from} and #{to}
173
+		GROUP BY triggerDay;
173
     </select>
174
     </select>
174
 
175
 
175
 	<delete id="clearLog" >
176
 	<delete id="clearLog" >

+ 23 - 12
xxl-job-admin/src/main/webapp/static/js/index.js 查看文件

89
                    }
89
                    }
90
                },
90
                },
91
                legend: {
91
                legend: {
92
-                   data:[I18n.job_dashboard_date_report_suc_count, I18n.job_dashboard_date_report_fail_count]
92
+                   data:[I18n.joblog_status_suc, I18n.joblog_status_fail, I18n.joblog_status_running]
93
                },
93
                },
94
                toolbox: {
94
                toolbox: {
95
                    feature: {
95
                    feature: {
116
                ],
116
                ],
117
                series : [
117
                series : [
118
                    {
118
                    {
119
-                       name:I18n.job_dashboard_date_report_suc_count,
119
+                       name:I18n.joblog_status_suc,
120
                        type:'line',
120
                        type:'line',
121
                        stack: 'Total',
121
                        stack: 'Total',
122
                        areaStyle: {normal: {}},
122
                        areaStyle: {normal: {}},
123
                        data: data.content.triggerDayCountSucList
123
                        data: data.content.triggerDayCountSucList
124
                    },
124
                    },
125
                    {
125
                    {
126
-                       name:I18n.job_dashboard_date_report_fail_count,
126
+                       name:I18n.joblog_status_fail,
127
                        type:'line',
127
                        type:'line',
128
                        stack: 'Total',
128
                        stack: 'Total',
129
                        label: {
129
                        label: {
134
                        },
134
                        },
135
                        areaStyle: {normal: {}},
135
                        areaStyle: {normal: {}},
136
                        data: data.content.triggerDayCountFailList
136
                        data: data.content.triggerDayCountFailList
137
+                   },
138
+                   {
139
+                       name:I18n.joblog_status_running,
140
+                       type:'line',
141
+                       stack: 'Total',
142
+                       areaStyle: {normal: {}},
143
+                       data: data.content.triggerDayCountRunningList
137
                    }
144
                    }
138
                ],
145
                ],
139
-                color:['#00A65A', '#F39C12']
146
+                color:['#00A65A', '#c23632', '#F39C12']
140
         };
147
         };
141
 
148
 
142
         var lineChart = echarts.init(document.getElementById('lineChart'));
149
         var lineChart = echarts.init(document.getElementById('lineChart'));
155
             },
162
             },
156
             tooltip : {
163
             tooltip : {
157
                 trigger: 'item',
164
                 trigger: 'item',
158
-                formatter: "{a} <br/>{b} : {c} ({d}%)"
165
+                formatter: "{b} : {c} ({d}%)"
159
             },
166
             },
160
             legend: {
167
             legend: {
161
                 orient: 'vertical',
168
                 orient: 'vertical',
162
                 left: 'left',
169
                 left: 'left',
163
-                data: [I18n.job_dashboard_rate_report_suc_count, I18n.job_dashboard_rate_report_fail_count ]
170
+                data: [I18n.joblog_status_suc, I18n.joblog_status_fail, I18n.joblog_status_running ]
164
             },
171
             },
165
             series : [
172
             series : [
166
                 {
173
                 {
167
-                    name: '分布比例',
174
+                    //name: '分布比例',
168
                     type: 'pie',
175
                     type: 'pie',
169
                     radius : '55%',
176
                     radius : '55%',
170
                     center: ['50%', '60%'],
177
                     center: ['50%', '60%'],
171
                     data:[
178
                     data:[
172
                         {
179
                         {
173
-                            value:data.content.triggerCountSucTotal,
174
-                            name:I18n.job_dashboard_rate_report_suc_count
180
+                            name:I18n.joblog_status_suc,
181
+                            value:data.content.triggerCountSucTotal
182
+                        },
183
+                        {
184
+                            name:I18n.joblog_status_fail,
185
+                            value:data.content.triggerCountFailTotal
175
                         },
186
                         },
176
                         {
187
                         {
177
-                            value:data.content.triggerCountFailTotal,
178
-                            name:I18n.job_dashboard_rate_report_fail_count
188
+                            name:I18n.joblog_status_running,
189
+                            value:data.content.triggerCountRunningTotal
179
                         }
190
                         }
180
                     ],
191
                     ],
181
                     itemStyle: {
192
                     itemStyle: {
187
                     }
198
                     }
188
                 }
199
                 }
189
             ],
200
             ],
190
-            color:['#00A65A', '#F39C12']
201
+            color:['#00A65A', '#c23632', '#F39C12']
191
         };
202
         };
192
         var pieChart = echarts.init(document.getElementById('pieChart'));
203
         var pieChart = echarts.init(document.getElementById('pieChart'));
193
         pieChart.setOption(option);
204
         pieChart.setOption(option);

+ 1 - 1
xxl-job-admin/src/test/java/com/xxl/job/admin/dao/XxlJobLogDaoTest.java 查看文件

50
         dto = xxlJobLogDao.load(log.getId());
50
         dto = xxlJobLogDao.load(log.getId());
51
 
51
 
52
 
52
 
53
-        List<Map<String, Object>> list2 = xxlJobLogDao.triggerCountByDay(DateUtils.addDays(new Date(), 30), new Date(), 200);
53
+        List<Map<String, Object>> list2 = xxlJobLogDao.triggerCountByDay(DateUtils.addDays(new Date(), 30), new Date());
54
 
54
 
55
         int ret4 = xxlJobLogDao.clearLog(1, 1, new Date(), 100);
55
         int ret4 = xxlJobLogDao.clearLog(1, 1, new Date(), 100);
56
 
56