XXL-JOB告警消息推送改造

目前JOB的調(diào)度框架非常多,由于之前一直在用XXL-JOB這個(gè)輕量級(jí)的調(diào)度框架,所以這么多年也一直用,不過(guò)對(duì)于JOB調(diào)度來(lái)說(shuō),我們很多時(shí)候需要對(duì)JOB的執(zhí)行情況進(jìn)行監(jiān)控,框架默認(rèn)帶了郵件的報(bào)警,不過(guò)由于使用習(xí)慣的問(wèn)題,郵件報(bào)警不太習(xí)慣,所以這里改造為通過(guò)釘釘?shù)臋C(jī)器人進(jìn)行告警推送。

Step1、創(chuàng)建釘釘?shù)娜旱臋C(jī)器人,這里就不截圖了,這里選擇的驗(yàn)證方式是簽名驗(yàn)證(不同的方式改動(dòng)會(huì)略有差異)

Step2、將相關(guān)配置寫(xiě)入到配置文件

找到xxl-job-admin的application.properties,在最下面增加配置:

```

dingding.accesstoken=你的釘釘機(jī)器人的token

dingding.key=機(jī)器人的SECkey,開(kāi)頭是“SEC”

dingding.url=https://oapi.dingtalk.com/robot/send?access_token=

```

application.properties

Step3、讀取application.properties的配置

找到com.xxl.job.admin.core.conf.XxlJobAdminConfig文件,讀取出剛才的配置


Step4、在JobAlarmer增加釘釘機(jī)器人告警的方法


```

/**

* job alarm 通過(guò)釘釘機(jī)器人推送job告警

*

* @param info

* @param jobLog

* @return

*/

public boolean DingRobotalarm(XxlJobInfo info, XxlJobLog jobLog) {

boolean result =false;

? ? if (jobAlarmList!=null &&jobAlarmList.size()>0) {

result =true;? // success means all-success

? ? ? ? for (JobAlarm alarm:jobAlarmList) {

boolean resultItem =false;

? ? ? ? ? ? try {

DDMsg ddMsg=new DDMsg();

? ? ? ? ? ? ? ? resultItem = ddMsg.PushRobotMsg(info, jobLog); //發(fā)送告警信息

? ? ? ? ? ? }catch (Exception e) {

logger.error(e.getMessage(), e);

? ? ? ? ? ? }

if (!resultItem) {

result =false;

? ? ? ? ? ? }

}

}

return result;

}

```

Step5、增加DDMsg.java 類

```

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

import com.xxl.job.admin.core.conf.XxlJobAdminConfig;

import com.xxl.job.admin.core.model.XxlJobInfo;

import com.xxl.job.admin.core.model.XxlJobLog;

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

import com.xxl.job.admin.core.util.HttpRequest;

import org.apache.tomcat.util.codec.binary.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.annotation.Configuration;

import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

/**

* @PROJECT xxl-job

* @ClassName DDMsg

* @Author 唐塵

* @date 2021/3/23

* @time 11:56

* @Description: TODO

* @return

*/

@Configuration

@Component

//@PropertySource({"classpath:application.properties"})

public class DDMsg {

private static Loggerlogger = LoggerFactory.getLogger(DDMsg.class);

? ? public boolean PushRobotMsg(XxlJobInfo info, XxlJobLog jobLog)throws Exception {

String dingdingaccesstoken=XxlJobAdminConfig.getAdminConfig().getDingdingaccesstoken();

? ? ? ? String url=XxlJobAdminConfig.getAdminConfig().getDingdingurl();

? ? ? ? // 獲取logid

? ? ? ? String logid = String.valueOf(jobLog.getId());

? ? ? ? // todo 根據(jù)id讀取錯(cuò)誤日志 ,這里后續(xù)再完善

? ? ? ? Long timestamp = System.currentTimeMillis();

? ? ? ? String signres =sign(timestamp);

? ? ? ? String DingDingRobotUrl = url + dingdingaccesstoken +"&timestamp=" + timestamp +"&sign=" + signres;

? ? ? ? String msgbody ="任務(wù)ID:" + jobLog.getJobId() +",任務(wù)描述:" + info.getJobDesc() +"執(zhí)行出錯(cuò),請(qǐng)及時(shí)處理!LogId:" + jobLog.getId() +",出錯(cuò)信息:" + jobLog.getHandleMsg();

? ? ? ? String msg ="{\"msgtype\": \"text\",\"text\": {\"content\": \"" + msgbody +"\"}}";

? ? ? ? logger.info(msgbody);

? ? ? ? try {

HttpRequest.postBody(DingDingRobotUrl, msg);

return true;

? ? ? ? }catch (Exception e){

return false;

? ? ? ? }

}

public static Stringsign(Long timestamp)throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {

String key=XxlJobAdminConfig.getAdminConfig().getDingdingkey();

? ? ? ? String stringToSign = timestamp +"\n" + key;

? ? ? ? Mac mac = Mac.getInstance("HmacSHA256");

? ? ? ? mac.init(new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256"));

? ? ? ? byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));

? ? ? ? String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");

? ? ? ? return sign;

? ? }

}

```

Step6、修改默認(rèn)的釘釘?shù)母婢椒?/p>

找到類文件JobFailMonitorHelper.java,修改如下:


然后重新構(gòu)建發(fā)布即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容