XXL-JOB实现钉钉报警

1. 环境准备

Centos7.9
java 1.8
maven 3.0.5
xxl-job-admin 2.3.0

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

yum install maven -y

# vim /etc/maven/settings.xml
 <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
 </mirror>

下载安装

git clone https://gitee.com/xuxueli0323/xxl-job.git
cd xxl-job/
git checkout 2.3.0

# 初始数据库
xxl-job/doc/db/tables_xxl_job.sql

2. 修改配置

2.1 application.properties配置

path: xxl-job-admin/src/main/resources/application.properties

### web
server.port=9090

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/xxl_job_dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=xxljob_db_user
spring.datasource.password=XXLjob_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

### xxl-job, access token
xxl.job.accessToken=

# 增加钉钉配置信息
alarm.baseDingWebhook=https://oapi.dingtalk.com/robot/send?

2.2 添加DingDing通知文件

原生的xxl-job并没有钉钉报警功能,但是官方文档有写:可以很方便的集成钉钉报警功能,即新增一个实现 "com.xxl.job.admin.core.alarm.JobAlarm" 接口的告警实现即可

图片.png
图片.png

DingJobAlarm.java

路径:xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/DingJobAlarm.java

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 com.xxl.job.admin.core.scheduler.XxlJobScheduler;
import com.xxl.job.core.biz.ExecutorBiz;
import com.xxl.job.core.biz.model.LogParam;
import com.xxl.job.core.biz.model.LogResult;
import com.xxl.job.core.biz.model.ReturnT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

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

/**
 * 钉钉告警
 *
 * @author
 */
@Component
public class DingJobAlarm implements JobAlarm {

    private static Logger logger = LoggerFactory.getLogger(DingJobAlarm.class);

    @Value("${alarm.baseDingWebhook}")
    private String baseDingWebhook;

    private final RestTemplate restTemplate = new RestTemplate();

    /**
     * fail alarm
     *
     * @param info
     * @param jobLog
     * @return
     */
    @Override
    public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) {
        boolean alarmResult = true;
        logger.info("ding----------------");

        if(info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0){
            // 如果不包含access_token,则直接退出,调用email告警任务
            if (!info.getAlarmEmail().contains("access_token")){
                return alarmResult;
            }

            // 读取Webhook
            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;
    }

    /**
     * 封装消息内容
     * @param info
     * @param jobLog
     * @return
     */
    private static Map<String, Object> loadEmailJobAlarmTemplate(XxlJobInfo info, XxlJobLog jobLog) {

        HashMap<String, Object> requestMap = new HashMap<>();
        ExecutorBiz executorBiz = null;
        try {
            executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress());
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 获取执行日志信息
        ReturnT<LogResult> logResult = executorBiz.log(new LogParam(jobLog.getTriggerTime().getTime(), jobLog.getId(), 1));
        String errorMsg = logResult.getContent().getLogContent();

        // 消息类型
        requestMap.put("msgtype", "text");
        // 消息内容
        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, Object> map = new HashMap<>();
        map.put("content",content);
        requestMap.put("text", map);

        // 设置是否@指定人
        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());
            requestMap.put("at",atmap);
        }

        return requestMap;
    }
}

3. 编译运行xxl-job-admin

编译

cd xxl-job-admin
mvn -B -Dmaven.test.skip=true clean package

运行

mkdir /opt/xxl-job-2.3.0
cp xxl-job-admin/target/xxl-job-admin-2.3.0.jar /opt/xxl-job-2.3.0
cd /opt/xxl-job-2.3.0
nohup java -jar xxl-job-admin-2.3.0.jar & 

访问

# 浏览器问: 
http://localhost:9090/xxl-job-admin/
#默认用户名与口令:
admin/123456

4. 钉钉群创建自定义机器人

图片.png

安全设置自定义关键字

图片.png

5. 页面配置通知

负责人格式为 姓名-手机号 即 李四-151XXXX1234
报警邮件为 access_token=26c54 机器人的地址

图片.png

6. 报警展示

图片.png

参考:
https://www.xuxueli.com/xxl-job/
https://blog.csdn.net/qq_31021213/article/details/125763157
https://blog.csdn.net/IT_world_/article/details/120785289
https://blog.csdn.net/xiaogang_1994/article/details/117284620
https://segmentfault.com/a/1190000039236981

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容