XXL-JOB 集成钉钉发送消息

本文档详细介绍了XXL-JOB中EmailJobAlarm和DingJobAlarm的实现,用于任务失败时发送告警。EmailJobAlarm实现了对邮箱格式的验证,并通过Spring Mail发送告警邮件。DingJobAlarm则实现了钉钉告警,通过RestTemplate发送钉钉消息。同时,提到了页面设置中负责人格式和报警邮件的格式要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集成版本号
2.3.0

修改原文件EmailJobAlarm 进行邮箱格式验证

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;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * job alarm by email
 *
 * @author xuxueli 2020-01-19
 */
@Component
public class EmailJobAlarm implements JobAlarm {
    private static Logger logger = LoggerFactory.getLogger(EmailJobAlarm.class);

    private static Pattern patten = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+");
    /**
     * 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 += "<br>TriggerMsg=<br>" + jobLog.getTriggerMsg();
            }
            if (jobLog.getHandleCode()>0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
                alarmContent += "<br>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<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
            for (String email: emailSet) {

                // make mail
                try {
                    Matcher matcher = patten.matcher(email);
                    if (!matcher.matches()){
                        logger.info(">>>>>>>>>>> xxl-job, job fail alarm email {} send error, JobLogId:{}", email, jobLog.getId());
                        continue;
                    }
                    MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();

                    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
                    helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailFrom(), 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 = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
                "<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
                "   <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
                "      <tr>\n" +
                "         <td width=\"20%\" >"+ I18nUtil.getString("jobinfo_field_jobgroup") +"</td>\n" +
                "         <td width=\"10%\" >"+ I18nUtil.getString("jobinfo_field_id") +"</td>\n" +
                "         <td width=\"20%\" >"+ I18nUtil.getString("jobinfo_field_jobdesc") +"</td>\n" +
                "         <td width=\"10%\" >"+ I18nUtil.getString("jobconf_monitor_alarm_title") +"</td>\n" +
                "         <td width=\"40%\" >"+ I18nUtil.getString("jobconf_monitor_alarm_content") +"</td>\n" +
                "      </tr>\n" +
                "   </thead>\n" +
                "   <tbody>\n" +
                "      <tr>\n" +
                "         <td>{0}</td>\n" +
                "         <td>{1}</td>\n" +
                "         <td>{2}</td>\n" +
                "         <td>"+ I18nUtil.getString("jobconf_monitor_alarm_type") +"</td>\n" +
                "         <td>{3}</td>\n" +
                "      </tr>\n" +
                "   </tbody>\n" +
                "</table>";

        return mailBodyTemplate;
    }

}

实现一个钉钉的JobAlarm

package com.xxl.job.admin.core.alarm.impl;

import com.xxl.job.admin.core.alarm.JobAlarm;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * job alarm by ding
 *
 * @author wzg
 */
@Component
public class DingJobAlarm implements JobAlarm {
    private static Logger logger = LoggerFactory.getLogger(DingJobAlarm.class);

    private final RestTemplate restTemplate = new RestTemplate();

    private String baseDingWebhook = "https://oapi.dingtalk.com/robot/send?";
    /**
     * fail alarm
     *
     * @param jobLog
     */

    @Override
    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog){
        boolean alarmResult = true;
        // send monitor email
        if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {

            if (!info.getAlarmEmail().contains("access_token")){
                return alarmResult;
            }
            Set<String> dingWebhookSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));

            Map<String, Object> map = loadEmailJobAlarmTemplate(info,jobLog);
            // 发送钉钉消息
            for (String dingWebhook: dingWebhookSet) {

                try {

                    restTemplate.postForEntity(baseDingWebhook + dingWebhook, map, Object.class);

                } catch (Exception e) {
                    logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e);

                    alarmResult = false;
                }

            }

        }

        return alarmResult;
    }


    private static final Map<String, Object> loadEmailJobAlarmTemplate(XxlJobInfo info, XxlJobLog jobLog){
        HashMap<String, Object> map = new HashMap<>(2);
        /** 设置消息类型 **/
        map.put("msgtype", "text");

        /** 设置消息内容 -- start **/
        String content =
                "【告警信息】 \t\n" +
                "负责人 : \t" + info.getAuthor() + "\t\n" +
                "任务id : \t" + info.getId() + "\t\n" +
                "任务名称 : \t" + info.getJobDesc() + "\t\n" +
                "执行器名称 : \t" + info.getExecutorHandler() + "\t\n" +
                "执行器ip : \t" + jobLog.getExecutorAddress() + "\t\n" +
                "任务参数 : \t" + jobLog.getExecutorParam() + "\t\n" +
                "LogId : \t" + jobLog.getId() + "\t\n" +
                "TriggerMsg : \t" + jobLog.getTriggerMsg().replace("<br>","\n") + "\t\n" +
                "HandleCode : \t" + jobLog.getHandleMsg() + "\t\n" +
                "报警时间 : \t" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\t\n";
        HashMap<String, String> cmap = new HashMap<>(1);
        cmap.put("content",content);
        map.put("text", cmap);
        /** 设置消息内容 -- stop **/


        /** 设置是否@指定人 --start **/
        Map<String, Object> atmap = new HashMap<String, Object>();
        String[] authorList = info.getAuthor().split(",");
        ArrayList arrayList = new ArrayList();
        for (String author : authorList){
            if ("".equals(author) || author.split("-").length<2){
                continue;
            }
            arrayList.add(author.split("-")[1]);
        }
        if (arrayList.size() > 0){
            atmap.put("atMobiles",arrayList.toArray());
            map.put("at",atmap);
        }
        /** 设置是否@指定人 --stop **/

        return map;
    }


}

页面设置
在这里插入图片描述
负责人格式为 姓名-手机号 即 李四-151XXXX1234
报警邮件为 access_token=26c54 机器人的地址

报警信息展示
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值