From 882a439ef170d6ce129f4cbbe1327252aec60252 Mon Sep 17 00:00:00 2001 From: xuxueli <931591021@qq.com> Date: Sun, 19 Jan 2020 18:41:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=91=8A=E8=AD=A6=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=A8=A1=E5=9D=97=E5=8C=96=EF=BC=9A=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=96=B0=E5=A2=9E=E4=B8=80=E7=A7=8D=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=96=B9=E5=BC=8F=EF=BC=8C=E5=8F=AA=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA=E5=AE=9E=E7=8E=B0=20"com.x?= =?UTF-8?q?xl.job.admin.core.alarm.JobAlarm"=20=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=AE=9E=E7=8E=B0=E5=8D=B3=E5=8F=AF=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E5=8A=A0=E7=81=B5=E6=B4=BB=E3=80=81=E6=96=B9=E4=BE=BF?= =?UTF-8?q?=E5=AE=9A=E5=88=B6=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/XXL-JOB官方文档.md | 4 +- .../xxl/job/admin/core/alarm/JobAlarm.java | 20 +++ .../xxl/job/admin/core/alarm/JobAlarmer.java | 36 ++++++ .../admin/core/alarm/impl/EmailJobAlarm.java | 117 ++++++++++++++++++ .../admin/core/conf/XxlJobAdminConfig.java | 7 ++ .../core/thread/JobFailMonitorHelper.java | 95 +------------- 6 files changed, 184 insertions(+), 95 deletions(-) create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md index 521f1578..91e96437 100644 --- a/doc/XXL-JOB官方文档.md +++ b/doc/XXL-JOB官方文档.md @@ -1245,7 +1245,8 @@ API服务请求参考代码:com.xxl.job.executor.ExecutorBizTest - 2、提供基于HTTP的任务Handler(Bean任务,JobHandler="HttpJobHandler");业务方只需要提供HTTP链接即可,不限制语言、平台; ### 5.18 任务失败告警 -默认提供邮件失败告警,可扩展短信、钉钉等方式,扩展代码位置为 "JobFailMonitorHelper.failAlarm"; +默认提供邮件失败告警,可扩展短信、钉钉等方式,扩展代码位置为 "com.xxl.job.admin.core.alarm.JobAlarmer"。 +如果需要新增一种告警方式,只需要新增一个实现 "com.xxl.job.admin.core.alarm.JobAlarm" 接口的告警实现即可 ### 5.19 调度中心Docker镜像构建 可以通过以下命令快速构建调度中心,并启动运行; @@ -1691,6 +1692,7 @@ public ReturnT execute(String param) { - 3、SQL脚本编码默认utf8mb4执行,避免小概率下容器环境中乱码问题; - 4、多个项目依赖升级至较新稳定版本,如mybatis、groovy和mysql驱动等; - 5、默认数据库连接池调整为hikari,移除tomcat-jdbc依赖; +- 6、任务告警组件模块化:如果需要新增一种告警方式,只需要新增一个实现 "com.xxl.job.admin.core.alarm.JobAlarm" 接口的告警实现即可,更加灵活、方便定制; ### TODO LIST diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java new file mode 100644 index 00000000..4165ff3a --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarm.java @@ -0,0 +1,20 @@ +package com.xxl.job.admin.core.alarm; + +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; + +/** + * @author xuxueli 2020-01-19 + */ +public interface JobAlarm { + + /** + * job alarm + * + * @param info + * @param jobLog + * @return + */ + public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog); + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java new file mode 100644 index 00000000..28311e4a --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/JobAlarmer.java @@ -0,0 +1,36 @@ +package com.xxl.job.admin.core.alarm; + +import com.xxl.job.admin.core.alarm.impl.EmailJobAlarm; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class JobAlarmer { + + @Resource + private EmailJobAlarm emailJobAlarm; + + /** + * job alarm + * + * @param info + * @param jobLog + * @return + */ + public boolean alarm(XxlJobInfo info, XxlJobLog jobLog) { + + // alarm by email + boolean emailResult = emailJobAlarm.doAlarm(info, jobLog); + + // do something, custom alarm strategy, such as sms + // ... + + return emailResult; + } + + + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java new file mode 100644 index 00000000..fe16fbdf --- /dev/null +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -0,0 +1,117 @@ +package com.xxl.job.admin.core.alarm.impl; + +import com.xxl.job.admin.core.alarm.JobAlarm; +import com.xxl.job.admin.core.conf.XxlJobAdminConfig; +import com.xxl.job.admin.core.model.XxlJobGroup; +import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.core.util.I18nUtil; +import com.xxl.job.core.biz.model.ReturnT; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.mail.internet.MimeMessage; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * job alarm by email + * + * @author xuxueli 2020-01-19 + */ +@Component +public class EmailJobAlarm implements JobAlarm { + private static Logger logger = LoggerFactory.getLogger(EmailJobAlarm.class); + + /** + * fail alarm + * + * @param jobLog + */ + public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog){ + boolean alarmResult = true; + + // send monitor email + if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { + + // alarmContent + String alarmContent = "Alarm Job LogId=" + jobLog.getId(); + if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) { + alarmContent += "
TriggerMsg=
" + jobLog.getTriggerMsg(); + } + if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) { + alarmContent += "
HandleCode=" + jobLog.getHandleMsg(); + } + + // email info + XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup())); + String personal = I18nUtil.getString("admin_name_full"); + String title = I18nUtil.getString("jobconf_monitor"); + String content = MessageFormat.format(loadEmailJobAlarmTemplate(), + group!=null?group.getTitle():"null", + info.getId(), + info.getJobDesc(), + alarmContent); + + Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(","))); + for (String email: emailSet) { + + // make mail + try { + MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal); + helper.setTo(email); + helper.setSubject(title); + helper.setText(content, true); + + XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage); + } catch (Exception e) { + logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e); + + alarmResult = false; + } + + } + } + + return alarmResult; + } + + /** + * load email job alarm template + * + * @return + */ + private static final String loadEmailJobAlarmTemplate(){ + String mailBodyTemplate = "
" + I18nUtil.getString("jobconf_monitor_detail") + ":" + + "\n" + + " " + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
"+ I18nUtil.getString("jobinfo_field_jobgroup") +""+ I18nUtil.getString("jobinfo_field_id") +""+ I18nUtil.getString("jobinfo_field_jobdesc") +""+ I18nUtil.getString("jobconf_monitor_alarm_title") +""+ I18nUtil.getString("jobconf_monitor_alarm_content") +"
{0}{1}{2}"+ I18nUtil.getString("jobconf_monitor_alarm_type") +"{3}
"; + + return mailBodyTemplate; + } + +} diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java index 7fc26443..a9d69139 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.core.conf; +import com.xxl.job.admin.core.alarm.JobAlarmer; import com.xxl.job.admin.core.scheduler.XxlJobScheduler; import com.xxl.job.admin.dao.*; import org.springframework.beans.factory.DisposableBean; @@ -81,6 +82,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { private JavaMailSender mailSender; @Resource private DataSource dataSource; + @Resource + private JobAlarmer jobAlarmer; public String getI18n() { @@ -144,4 +147,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean { return dataSource; } + public JobAlarmer getJobAlarmer() { + return jobAlarmer; + } + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 67c6b27f..a4ec1ccc 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -1,22 +1,14 @@ package com.xxl.job.admin.core.thread; import com.xxl.job.admin.core.conf.XxlJobAdminConfig; -import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import com.xxl.job.admin.core.trigger.TriggerTypeEnum; import com.xxl.job.admin.core.util.I18nUtil; -import com.xxl.job.core.biz.model.ReturnT; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.mail.javamail.MimeMessageHelper; -import javax.mail.internet.MimeMessage; -import java.text.MessageFormat; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -71,7 +63,7 @@ public class JobFailMonitorHelper { if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { boolean alarmResult = true; try { - alarmResult = failAlarm(info, log); + alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, log); } catch (Exception e) { alarmResult = false; logger.error(e.getMessage(), e); @@ -121,89 +113,4 @@ public class JobFailMonitorHelper { } } - - // ---------------------- alarm ---------------------- - - // email alarm template - private static final String mailBodyTemplate = "
" + I18nUtil.getString("jobconf_monitor_detail") + ":" + - "\n" + - " " + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
"+ I18nUtil.getString("jobinfo_field_jobgroup") +""+ I18nUtil.getString("jobinfo_field_id") +""+ I18nUtil.getString("jobinfo_field_jobdesc") +""+ I18nUtil.getString("jobconf_monitor_alarm_title") +""+ I18nUtil.getString("jobconf_monitor_alarm_content") +"
{0}{1}{2}"+ I18nUtil.getString("jobconf_monitor_alarm_type") +"{3}
"; - - /** - * fail alarm - * - * @param jobLog - */ - private boolean failAlarm(XxlJobInfo info, XxlJobLog jobLog){ - boolean alarmResult = true; - - // send monitor email - if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) { - - // alarmContent - String alarmContent = "Alarm Job LogId=" + jobLog.getId(); - if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) { - alarmContent += "
TriggerMsg=
" + jobLog.getTriggerMsg(); - } - if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) { - alarmContent += "
HandleCode=" + jobLog.getHandleMsg(); - } - - // email info - XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup())); - String personal = I18nUtil.getString("admin_name_full"); - String title = I18nUtil.getString("jobconf_monitor"); - String content = MessageFormat.format(mailBodyTemplate, - group!=null?group.getTitle():"null", - info.getId(), - info.getJobDesc(), - alarmContent); - - Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(","))); - for (String email: emailSet) { - - // make mail - try { - MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage(); - - MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); - helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal); - helper.setTo(email); - helper.setSubject(title); - helper.setText(content, true); - - XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage); - } catch (Exception e) { - logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e); - - alarmResult = false; - } - - } - } - - // do something, custom alarm strategy, such as sms - - - return alarmResult; - } - }