feat(admin): 优化任务触发日志展示与失败重试逻辑

- 修改失败重试提示颜色样式,提升视觉效果
- 完善触发失败时的错误信息返回内容
- 重构触发日志消息拼接逻辑,增加执行地址、处理器和参数显示
- 调整日志列表页面表格列宽,优化 jobId 和时间字段展示
- 移除日志列表操作列中的冗余下拉菜单选项
3.3.0-release
xuxueli 2 weeks ago
parent 640ae9a9bb
commit 2a14e68897

@ -53,7 +53,7 @@ public class JobFailAlarmMonitorHelper {
// 1、fail retry monitor // 1、fail retry monitor
if (log.getExecutorFailRetryCount() > 0) { if (log.getExecutorFailRetryCount() > 0) {
XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null); XxlJobAdminBootstrap.getInstance().getJobTriggerPoolHelper().trigger(log.getJobId(), TriggerTypeEnum.RETRY, (log.getExecutorFailRetryCount()-1), log.getExecutorShardingParam(), log.getExecutorParam(), null);
String retryMsg = "<br><br><span style=\"color:#F39C12;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<< </span><br>"; String retryMsg = "<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>"+ I18nUtil.getString("jobconf_trigger_type_retry") +"<<<<<<<<<<< </span><br>";
log.setTriggerMsg(log.getTriggerMsg() + retryMsg); log.setTriggerMsg(log.getTriggerMsg() + retryMsg);
XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().updateTriggerInfo(log); XxlJobAdminBootstrap.getInstance().getXxlJobLogMapper().updateTriggerInfo(log);
} }

@ -9,10 +9,10 @@ import com.xxl.job.admin.model.XxlJobLog;
import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap; import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap;
import com.xxl.job.admin.scheduler.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.scheduler.route.ExecutorRouteStrategyEnum;
import com.xxl.job.admin.util.I18nUtil; import com.xxl.job.admin.util.I18nUtil;
import com.xxl.job.core.constant.ExecutorBlockStrategyEnum;
import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.openapi.ExecutorBiz; import com.xxl.job.core.openapi.ExecutorBiz;
import com.xxl.job.core.openapi.model.TriggerRequest; import com.xxl.job.core.openapi.model.TriggerRequest;
import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.constant.ExecutorBlockStrategyEnum;
import com.xxl.tool.core.StringTool; import com.xxl.tool.core.StringTool;
import com.xxl.tool.exception.ThrowableTool; import com.xxl.tool.exception.ThrowableTool;
import com.xxl.tool.http.IPTool; import com.xxl.tool.http.IPTool;
@ -187,10 +187,11 @@ public class JobTrigger {
if (address != null) { if (address != null) {
triggerResult = doTrigger(triggerParam, address); triggerResult = doTrigger(triggerParam, address);
} else { } else {
triggerResult = Response.of(XxlJobContext.HANDLE_CODE_FAIL, null); triggerResult = Response.of(XxlJobContext.HANDLE_CODE_FAIL, "Address Router Fail.");
} }
// 5、collection trigger info // 5、collection trigger info
// trigger config
StringBuilder triggerMsgSb = new StringBuilder(); StringBuilder triggerMsgSb = new StringBuilder();
triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append("").append(triggerType.getTitle()); triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append("").append(triggerType.getTitle());
triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append("").append(IPTool.getIp()); triggerMsgSb.append("<br>").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append("").append(IPTool.getIp());
@ -205,9 +206,28 @@ public class JobTrigger {
triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append("").append(jobInfo.getExecutorTimeout()); triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_timeout")).append("").append(jobInfo.getExecutorTimeout());
triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append("").append(finalFailRetryCount); triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append("").append(finalFailRetryCount);
triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>").append(I18nUtil.getString("jobconf_trigger_run")).append("<<<<<<<<<<< </span><br>") // trigger data
.append((routeAddressResult!=null&&!routeAddressResult.isSuccess()&&routeAddressResult.getMsg()!=null)?routeAddressResult.getMsg()+"<br><br>":"") triggerMsgSb.append("<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>").append(I18nUtil.getString("jobconf_trigger_run")).append("<<<<<<<<<<< </span><br>");
.append((!triggerResult.isSuccess()&triggerResult.getMsg()!=null) ?triggerResult.getMsg():""); triggerMsgSb.append("<br>").append(I18nUtil.getString("joblog_field_executorAddress")).append("");
if (StringTool.isNotBlank(address)) {
triggerMsgSb.append(address);
} else if (routeAddressResult!=null && !routeAddressResult.isSuccess() && routeAddressResult.getMsg()!=null) {
triggerMsgSb.append("address route fail, ").append(routeAddressResult.getMsg());
} else {
triggerMsgSb.append("address route fail.");
}
if (StringTool.isNotBlank(jobInfo.getExecutorHandler())) {
triggerMsgSb.append("<br>").append("JobHandler").append("").append(jobInfo.getExecutorHandler());
}
triggerMsgSb.append("<br>").append(I18nUtil.getString("jobinfo_field_executorparam")).append("").append(jobInfo.getExecutorParam());
triggerMsgSb.append("<br>").append(I18nUtil.getString("joblog_field_triggerMsg")).append("");
if (triggerResult.isSuccess()) {
triggerMsgSb.append("success");
} else if (triggerResult.getMsg()!=null) {
triggerMsgSb.append(triggerResult.getMsg());
} else {
triggerMsgSb.append("fail");
}
// 6、save log trigger-info // 6、save log trigger-info
jobLog.setExecutorAddress(address); jobLog.setExecutorAddress(address);

@ -271,33 +271,26 @@
{ {
title: I18n.jobinfo_job, title: I18n.jobinfo_job,
field: 'jobId', field: 'jobId',
width: '10', width: '15',
widthUnit: '%', widthUnit: '%',
align: 'left', align: 'left',
formatter: function(value, row, index) { formatter: function(value, row, index) {
// build
// job show info let jobShow = '【'+ row.jobId +'】';
let jobDesc = $("#jobId").find("option[value='"+ row.jobId +"']").text(); let jobDesc = $("#jobId").find("option[value='"+ row.jobId +"']").text();
let jobShow = '['+ row.jobId +']' + jobDesc?jobDesc:''; if (jobDesc) {
jobShow += jobDesc;
}
if (jobShow.length > 10) { if (jobShow.length > 10) {
jobShow = jobShow.substr(0, 10) + '...'; jobShow = jobShow.substr(0, 10) + '...';
} }
// show
// job logTips return jobShow;
var temp = '';
temp += I18n.joblog_field_executorAddress + '' + (row.executorAddress?row.executorAddress:'');
if (row.executorHandler) {
temp += "<br>JobHandler" + row.executorHandler;
}
temp += '<br>'+ I18n.jobinfo_field_executorparam +'' + row.executorParam;
// build
return '<a class="logTips" href="javascript:;" >'+ jobShow +'<span style="display:none;">'+ temp +'</span></a>';
} }
},{ },{
title: I18n.joblog_field_triggerTime, title: I18n.joblog_field_triggerTime,
field: 'triggerTime', field: 'triggerTime',
width: '16', width: '15',
widthUnit: '%', widthUnit: '%',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return value?moment(value).format("YYYY-MM-DD HH:mm:ss"):""; return value?moment(value).format("YYYY-MM-DD HH:mm:ss"):"";
@ -329,7 +322,7 @@
},{ },{
title: I18n.joblog_field_handleTime, title: I18n.joblog_field_handleTime,
field: 'handleTime', field: 'handleTime',
width: '16', width: '15',
widthUnit: '%', widthUnit: '%',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return value?moment(value).format("YYYY-MM-DD HH:mm:ss"):""; return value?moment(value).format("YYYY-MM-DD HH:mm:ss"):"";
@ -360,37 +353,7 @@
formatter: function(value, row, index) { formatter: function(value, row, index) {
return value?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ value +'</span></a>':I18n.system_empty; return value?'<a class="logTips" href="javascript:;" >'+ I18n.system_show +'<span style="display:none;">'+ value +'</span></a>':I18n.system_empty;
} }
}/*,{
title: I18n.system_opt,
field: 'handleMsg',
width: '13',
widthUnit: '%',
formatter: function(value, row, index) {
if (row.triggerCode == 200 || row.handleCode != 0){
var logKillDiv = '';
if(row.handleCode == 0 || true){
logKillDiv = ' <li class="divider"></li>\n' +
' <li><a href="javascript:void(0);" class="logKill" _id="'+ row.id +'" >'+ I18n.joblog_kill_log +'</a></li>\n';
}
var html = '<div class="btn-group">\n' +
' <button type="button" class="btn btn-primary btn-sm">'+ I18n.system_opt +'</button>\n' +
' <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown">\n' +
' <span class="caret"></span>\n' +
' <span class="sr-only">Toggle Dropdown</span>\n' +
' </button>\n' +
' <ul class="dropdown-menu dropdown-menu-right " role="menu" _id="'+ row.id +'" >\n' +
' <li><a href="javascript:void(0);" class="logDetail" _id="'+ row.id +'" >'+ I18n.joblog_rolling_log +'</a></li>\n' +
logKillDiv +
' </ul>\n' +
' </div>';
return html;
}
return '';
} }
}*/
] ]
}); });

Loading…
Cancel
Save