一、前言
服务器上有时 定时任务、重要接口 等出现异常,导致数据不正常,不能及时通知到服务负责人,及时处理问题。所以引入“钉钉”作为通知工具,当服务出现异常便可立即收到通知,及时处理!
二、使用方式
1、客户端配置机器人
1、首先需要有阿里巴巴的“钉钉”客户端
2、建立群聊(如果只想通知给自己,不想通知其他人,也可以与他们创建群聊之后再将他们踢出)
3、点击“群设置”里面的“智能群助手”
4、“添加机器人”
5、“添加机器人”
6、选择“自定义”
7、给机器人取个名字,注意:后续的消息体中必须要包含设置的“自定义关键词”,消息才能发送成功。
8、点击“完成”后会得到一个webhook,把这个webhook复制出来,一会儿代码中要用,
类似这样的:https://oapi.dingtalk.com/robot/send?access_token=880e6b7********************************************97d5e
9、点击“完成”之后会收到这样一条消息,说明机器人配置完成了,接下来就是代码了
2、通过代码使用机器人发送钉钉消息
代码如下:
package com.common.util;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 钉钉-工具类
*/
@Slf4j
public class DingTalkUtil {
/**
* 钉钉机器人发消息地址(配置机器人的webhook)
* 此处大家可以配置到配置文件等等方式
*/
private static final String MSG_URL = "https://oapi.dingtalk.com/robot/send?access_token=880e6b7********************************************97d5e";
/**
* 通知具体人
*
* @param content 通知内容
* @param mobileList 通知具体人的手机号码列表
*/
public static void sendDingTalkMsg(List<String> mobileList, String content) {
sendDingTalkMsg(false, mobileList, content);
}
/**
* 通知所有人
*
* @param content 通知内容
*/
public static void sendDingTalkMsg(String content) {
sendDingTalkMsg(true, null, content);
}
/**
* 发送消息
*
* @param content 通知内容
* @param isAtAll 是否@所有人
* @param mobileList 通知具体人的手机号码列表
*/
private static void sendDingTalkMsg(boolean isAtAll, List<String> mobileList, String content) {
try {
if (!CollectionUtils.isEmpty(mobileList)) {
isAtAll = false;
}
//消息内容
Map<String, String> contentMap = new HashMap<>();
contentMap.put("content", content);
//通知人
Map<String, Object> atMap = new HashMap<>();
//1.是否通知所有人
atMap.put("isAtAll", isAtAll);
//2.通知具体人的手机号码列表
atMap.put("atMobiles", mobileList);
Map<String, Object> parameter = new HashMap<>();
parameter.put("msgtype", "text");
parameter.put("at", atMap);
parameter.put("text", contentMap);
//推送消息(http请求)
String result = HttpUtils.post(MSG_URL, JSON.toJSONString(parameter));
log.info("发送钉钉消息-result:{}", result);
} catch (Exception e) {
log.error("发送钉钉消息异常", e);
}
}
public static void main(String[] args) {
// sendDingTalkMsg("服务通知:测试消息");
sendDingTalkMsg(Collections.singletonList("189********"), "服务通知:测试消息");
}
}
另附代码中使用到的HttpUtils
package com.common.util;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import java.io.Closeable;
import java.nio.charset.Charset;
import java.util.Map;
/**
* http请求-工具类
*
* @author xiehongwei
* @date 2020/11/03
*/
@Slf4j
public class HttpUtils {
private static final String UTF_8 = "utf-8";
private static RequestConfig requestConfig;
static {
requestConfig = RequestConfig.custom()
.setConnectTimeout(1000)//连接超时时间
.setSocketTimeout(3000)//读超时时间
.build();
}
/**
* post请求(无参/参数在url上)
*/
public static String post(String url) throws Exception {
return post(url, "");
}
/**
* post请求
*/
public static String post(String url, String body) throws Exception {
CloseableHttpClient httpClient = null;
CloseableHttpResponse httpResponse = null;
try {
httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
if (StringUtils.isNotBlank(body)) {
StringEntity se = new StringEntity(body, Charset.forName(UTF_8));
se.setContentType("text/json");
se.setContentEncoding(new BasicHeader("Content-Type", "application/json"));
httpPost.setEntity(se);
}
httpPost.setConfig(requestConfig);
httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
httpResponse = httpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), UTF_8);
} else {
log.error("post请求其它服务失败,statusCode:{}", httpResponse.getStatusLine().getStatusCode());
}
} catch (Exception e) {
log.error("post请求其它服务异常", e);
throw e;
} finally {
close(httpClient);
close(httpResponse);
}
return null;
}
/**
* post请求
*/
public static String post(String url, Map<String, String> parameter) throws Exception {
return post(url, JSON.toJSONString(parameter));
}
/**
* 关闭流
*/
private static <T extends Closeable> void close(T io) {
if (io == null) {
return;
}
try {
io.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
3、测试
使用main方法发送消息测试