背景:
随着业务的发展,有些数据或逻辑会交由定时任务处理,开发会(在第二天)通过看日志或DB数据后再通知相关同学定时任务已跑,可以验收或继续做其它后续事情。
越多越多的公司内部工作交流开始使用钉钉或飞书
告警邮件太多没人看、短信容易被淹没
缺点
业务方有时候会过来催,让开发看一下定时任务是否跑完
开发会被中断当前的思路,导致灵感丧失
翻日志查数据后发现正在处理,时间被浪费
……
好奇
想到曾经使用过 钉钉告警机器人;转换思路,基于当前公司使用飞书进行工作交流,查一下飞书是否有类似的功能,结论:有
如何接入
确定需要通知的群组(通常来说包含需求提出人的群主)
通过群组->设置->创建机器人
在群组设置中心获取到webhook地址 Hello World 成果展示
总结一下
每一个黎明的早上,你也想发一条消息通知业务方任务跑完了。
跟着上面的步骤,一定可以模仿成功么?1000%可以
消息太长支持换行么?支持 \n \r之类的操作符。
{
"receive_id": "oc_xxx",
"content": " {\"text\":\"firstline \\n second line \"}",
"msg_type": "text"
}
可以支持@操作么?可以。参考如下
<!-- @ 单个用户 -->
<at user_id="ou_xxx">名字</at>
<!-- @ 所有人 -->
<at user_id="all">所有人</at>
支持更复杂的消息类型么,比如 邮件中的附件?支持。
<!--step1: maven 引用 http; 项目中有就不用管这步了 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.0.M2</version>
</dependency
package xxx.api.model.vo;
import java.io.Serializable;
import java.util.Map;
/**
*
* @Title:
* @Package
* @Description: step2.参考消息休定义对象
* {
* "msg_type":"text",
* "content":{
* "text":"this is test by siri"
* }
* @author: siri
* @date:
* @version: V1.0
* /
public class Robot implements Serializable {
private String msg_type="text";
private Map<String,String> content;
public Robot() {
super();
}
public Robot(Map<String, String> content) {
super();
this.content = content;
}
//ignore setter getter
}
#step 3:增加一些配置,更灵活的控制:是否启用机器人、要at的同学
robot:
true :
上述获取到的webhook 地址(为了公司群组安全,我这里省略) :
同学A,同学B :
// step4:在你业务代码块合理的地方 拼接提示文本,调用webhook地址发消息
this.sendTipsByRobot("系统已向TMS完成LaneId删除位同步操作,请留意!!! ");
private void sendTipsByRobot(String text){
Map<String,String> content = new HashMap<>(1<<1);
content.put("text",this.at_append(ROBOT_AT)+text);
Robot robot = new Robot(content);
HttpUtil.post(ROBOT_URL, JSON.toJSONString(robot));
}
private String at_append(String users){
StringBuilder at = new StringBuilder();
for (String a : users.split(",")) {
at.append("<at user_id=\"ou_").append(a).append("\">").append(a).append("</at>");
}
return at.toString();
}
P.S. 你以为我在教你做业务通知,举一反三,每日测试报告或其它想即时通知到同学的地方都可以哦!!!