共计 2733 个字符,预计需要花费 7 分钟才能阅读完成。
XXL-JOB 实现钉钉报警
原生的 xxl-job 并没有钉钉报警性能,然而官网文档有写:能够很不便的集成钉钉报警性能,即新增一个实现 “com.xxl.job.admin.core.alarm.JobAlarm” 接口的告警实现即可
1. 代码构造
2. 批改 JobFailMonitorHelper
如果不配置邮箱的话,是不会触发报警的。所以要批改下 com.xxl.job.admin/core/thread 下的 JobFailMonitorHelper
3.DingJobAlarm 钉钉报警实现
如果在定时工作配置页面。负责人一项配置的是手机号,那么报警音讯推送的时候就会有 @艾特性能。
package com.xxl.job.admin.core.alarm.impl; | |
import cn.hutool.http.HttpRequest; | |
import cn.hutool.http.HttpUtil; | |
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.springframework.beans.factory.annotation.Value; | |
import org.springframework.stereotype.Component; | |
import org.springframework.web.client.RestTemplate; | |
import java.text.SimpleDateFormat; | |
import java.util.*; | |
import com.alibaba.fastjson.JSON; | |
@Component | |
public class DingJobAlarm implements JobAlarm { | |
private static final int timeout = 10000; | |
@Value("${alarm.dingWebhook}") | |
private String dingWebhook; | |
@Override | |
public boolean doAlarm(XxlJobInfo info, XxlJobLog jobLog) { | |
boolean dingResult = true; | |
// System.out.println("ding ---------------------"); | |
try {StringBuilder content = new StringBuilder("工作失败!\n"); | |
content.append("工作名称城市数据:").append(info.getJobDesc()).append("\n"); | |
content.append("负责人:").append(info.getAuthor()).append("\n"); | |
content.append("执行器名称:").append(info.getExecutorHandler()).append("\n"); | |
content.append("执行器 ip:").append(jobLog.getExecutorAddress()).append("\n"); | |
content.append("工作参数:").append(jobLog.getExecutorParam()).append("\n"); | |
String msg = jobLog.getTriggerMsg(); | |
if(null != msg && !"".equals(msg.trim())){int start = msg.lastIndexOf("</span><br>")+11; | |
int end = msg.lastIndexOf("<br><br>"); | |
if (end <= start){end = msg.lastIndexOf("<br>"); | |
} | |
msg = msg.substring(start, end); | |
} | |
content.append(msg).append("\n"); | |
content.append("执行工作工夫:").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append("\n"); | |
List<String> mobileList = new ArrayList<>(); | |
mobileList.add(info.getAuthor()); | |
String reqStr = buildReqStr(content.toString(), false, mobileList); | |
// 推送音讯(http 申请)String result = postJson(dingWebhook, reqStr); | |
// System.out.println("result ==" + result); | |
} catch (Exception e) {e.printStackTrace(); | |
dingResult = false; | |
} | |
return dingResult; | |
} | |
private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) { | |
// 音讯内容 | |
HashMap<String, String> contentMap = new HashMap<>(); | |
contentMap.put("content", content); | |
// 告诉人 | |
HashMap<String, Object> atMap = new HashMap<>(); | |
//1. 是否告诉所有人 | |
atMap.put("isAtAll", isAtAll); | |
//2. 告诉具体人的手机号码列表 | |
atMap.put("atMobiles", mobileList); | |
HashMap<String, Object> reqMap = new HashMap<>(); | |
reqMap.put("msgtype", "text"); | |
reqMap.put("text", contentMap); | |
reqMap.put("at", atMap); | |
return JSON.toJSONString(reqMap); | |
} | |
private static String postJson(String url, String content){ | |
String body = null; | |
try {body = HttpUtil.post(url, content); | |
} catch (Exception e) {e.printStackTrace(); | |
} | |
return body; | |
} | |
} |
正文完