前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自定义钉钉机器人报警

自定义钉钉机器人报警

作者头像
LiosWong
发布于 2018-10-29 09:43:35
发布于 2018-10-29 09:43:35
1.6K00
代码可运行
举报
文章被收录于专栏:后端沉思录后端沉思录
运行总次数:0
代码可运行

为了埋点实时监控业务,简单的实现了钉钉机器人报警,钉钉开发官方文档点击

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface AlarmService {

    Response<Boolean> orderSuccessAlarm(CompanyAppIdEnum companyAppIdEnum, String orderNo, OrderStatusEnum orderStatusEnum);

    Response<Boolean> orderFilterAlarm(CompanyAppIdEnum companyAppIdEnum,Long userId);

}

public class AlarmServcieImpl implements AlarmService {
    @Autowired
    RedisClient RedisClient;

    @Autowired
    ConfigUtil configUtil;

    private static final Log logger = LogFactory.getLog(AlarmServcieImpl.class);

    private static final Long expireTime = 24 * 60 * 60L;

    //创建机器人可获取
    private static final String requestUrl = "https://oapi.dingtalk.com/robot/send?access_token=xxxx";

    @Override
    public Response<Boolean> orderSuccessAlarm(CompanyAppIdEnum companyAppIdEnum, String orderNo, OrderStatusEnum orderStatusEnum) {
        try {
            if (configUtil.isServerTest()) {
                return new Response<>(Boolean.FALSE);
            }
            String count = RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            if (Objects.isNull(count)) {
                RedisClient.setString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, "0", expireTime, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            }
            dispatcher(companyAppIdEnum, Number.getNumber(Long.valueOf(RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date())))), AlarmTypeEnum.ORDER_ALARM);
            RedisClient.incrBy(SystemConstants.ORDER_STATUS_ALARM_ROBOT, 1L, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
        return new Response<>(Boolean.TRUE);
    }

    @Override
    public Response<Boolean> orderFilterAlarm(CompanyAppIdEnum companyAppIdEnum,Long userId) {
        try {
            if (configUtil.isServerTest()) {
                return new Response<>(Boolean.FALSE);
            }
            String count = RedisClient.getString(SystemConstants.ORDER_FILTER_USER_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            if (Objects.isNull(count)) {
                RedisClient.setString(SystemConstants.ORDER_FILTER_USER_ALARM_ROBOT, "0", expireTime, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
            }
            dispatcher(companyAppIdEnum, Number.getNumber(Long.valueOf(RedisClient.getString(SystemConstants.ORDER_STATUS_ALARM_ROBOT, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date())))), AlarmTypeEnum.ORDER_USER_FILTER);
            RedisClient.incrBy(SystemConstants.ORDER_STATUS_ALARM_ROBOT, 1L, companyAppIdEnum.getCompanyId().toString(), DateUtils.getDateStr(new Date()));
        } catch (Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(), e);
        }
        return new Response<>(Boolean.TRUE);
    }

    protected void dispatcher(CompanyAppIdEnum companyAppIdEnum, Number number, AlarmTypeEnum alarmTypeEnum) {
        Arrays.asList(Number.values()).forEach(
                p -> {
                    if (p.equals(number) && !Number.INIT_NUMBER.equals(number)) {
                        try {
                            sendNotice(companyAppIdEnum, number, alarmTypeEnum);
                        } catch (IOException e) {
                            e.printStackTrace();
                            logger.error(e.getMessage(), e);
                        }
                        return;
                    }
                }
        );
    }

    public static void main(String[] args) throws IOException {
        sendNotice(CompanyAppIdEnum.WAN_KA, Number.PRELIMINARY_WARNING, AlarmTypeEnum.ORDER_ALARM);
    }

    private static void sendNotice(CompanyAppIdEnum companyAppIdEnum, Number number, AlarmTypeEnum alarmTypeEnum) throws IOException {
        HttpClient httpclient = HttpClients.createDefault();
        HttpPost httppost = new HttpPost(requestUrl);
        httppost.addHeader("Content-Type", "application/json; charset=utf-8");
        String textMsg = getNotice(number, companyAppIdEnum, alarmTypeEnum);
        StringEntity se = new StringEntity(textMsg, "utf-8");
        httppost.setEntity(se);
        HttpResponse response = httpclient.execute(httppost);
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String result = EntityUtils.toString(response.getEntity(), "utf-8");
            logger.info("报警已经成功发送,机构为:{},响应消息为:{}", companyAppIdEnum.getDesc(), result);
        }
    }

    private static String getNotice(Number number, CompanyAppIdEnum companyAppIdEnum, AlarmTypeEnum alarmTypeEnum) {
        switch (alarmTypeEnum) {
            case ORDER_ALARM:
                return "{\n" +
                        "     \"msgtype\": \"markdown\",\n" +
                        "     \"markdown\": {\"title\":\"推单失败报警\",\n" +
                        "\"text\":\"#### 推单失败报警  \\n " + companyAppIdEnum.getDesc() + "推单失败已超过" + number.getCount() + "单" + "\\n > ![screenshot](https://note.youdao.com/yws/api/personal/file/WEB77f35c865dbd286c3baed15670e8892f?method=download&shareKey=dfdd0302d114373146480ae3d4330af1)\\n  > ######" + new Date() + "发布 [警告]() \"\n" +
                        "     },\n" +
                        "    \"at\": {\n" +
                        "        \"atMobiles\": [\n" +
                        "            \"15168426462\"" +
                        "        ], \n" +
                        "        \"isAtAll\": false\n" +
                        "    }\n" +
                        " }";
            case ORDER_USER_FILTER:
                return "{\n" +
                        "     \"msgtype\": \"markdown\",\n" +
                        "     \"markdown\": {\"title\":\"机构过滤报警\",\n" +
                        "\"text\":\"#### 机构过滤报警  \\n " + companyAppIdEnum.getDesc() + "过滤失败已超过" + number.getCount() + "单" + "\\n > ![screenshot](https://note.youdao.com/yws/api/personal/file/WEB77f35c865dbd286c3baed15670e8892f?method=download&shareKey=dfdd0302d114373146480ae3d4330af1)\\n  > ######" + new Date() + "发布 [警告]() \"\n" +
                        "     },\n" +
                        "    \"at\": {\n" +
                        "        \"atMobiles\": [\n" +
                        "            \"15168426462\"" +
                        "        ], \n" +
                        "        \"isAtAll\": false\n" +
                        "    }\n" +
                        " }";
            default:
                break;
        }
        return "";
    }

    public enum Number {

        INIT_NUMBER(0L, "初始"),

        PRELIMINARY_WARNING(50L, "初步警告"),

        PRELIMINARY_WARNING_PLUS(55L, "初步警告"),

        INTERMEDIATE_WARNING(100L, "中级警告"),

        INTERMEDIATE_WARNING_PLUS(105L, "中级警告"),

        INTERMEDIATE_WARNING_PLUS_PLUS(200L, "中级++警告"),

        INTERMEDIATE_WARNING_PLUS_PLUS_PLUS(205L, "中级++警告"),

        SERIOUS_WARNING(300L, "严重警告"),

        SERIOUS_WARNING_PLUS(305L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS(350L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS_PLUS(400L, "严重警告"),

        SERIOUS_WARNING_PLUS_PLUS_PLUS_PLUS(500L, "严重警告");

        private Long count;

        private String desc;

        Number(Long count, String desc) {
            this.count = count;
            this.desc = desc;
        }

        public Long getCount() {
            return count;
        }

        public Number setCount(Long count) {
            this.count = count;
            return this;
        }

        public String getDesc() {
            return desc;
        }

        public Number setDesc(String desc) {
            this.desc = desc;
            return this;
        }

        public static Number getNumber(Long count) {
            Number[] number = {INIT_NUMBER};
            Arrays.asList(Number.values()).forEach(
                    p -> {
                        if (p.getCount().equals(count)) {
                            number[0] = p;
                            return;
                        }
                    }
            );
            return number[0];
        }
    }

    public enum AlarmTypeEnum {
        ORDER_ALARM,
        ORDER_USER_FILTER;
    }
}

按照钉钉的文档来开发,创建机器人后,即可获取Webhook地址,整个过程还是很简单的,以上只是提供了一个思路.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Servlet总结五(监听器)
生命周期监听器 生命周期就是从创建到销毁,因此顾名思义,就是在对象创建的时候会触发,销毁的时候也会触发
爱撒谎的男孩
2019/12/31
5230
动态网页(监听器)
它的作用与谍战片中的监听器相同,用来监听或监控你干了什么,只不过谍战片中监听对象是人,而动态网页中监听对象是代码。
全栈开发日记
2022/05/13
6550
java监听器从入门到放弃?
监听器就是实现一个特定接口的java程序,此程序专门用来监听另一个类方法的调用。java的awt大量的运用到了此种模式,例如可以给button对象添加一个点击事件,当鼠标点击时,就会调用事件处理程序。又如:在javascript事件中也运用到了此种模式,当用户点击鼠标时,会触发一个鼠标点击事件去调用程序员定义的事件处理程序。下面就以GUI编程来说明监听器。监听器都使用到了观察者模式,观察者模式所定义的对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都会得到通知自动更新。
好好学java
2018/09/21
2.9K0
java监听器从入门到放弃?
JavaWeb(六)Listener监听器
监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。 Servlet监听器 在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象。 Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型。 监听三个域对象创建和销毁的事件监听器 监听域对象中属性的
二十三年蝉
2018/02/28
2.2K0
JavaWeb(六)Listener监听器
JSP的Web监听器(Listener)
Listener的原理是基于观察者模式的,所谓观察者模式简单来说,就是当被观察者的特定事件被触发(一般这某些方法被调用)后,会通知观察者(调用观察者的方法),观察者可以在自己的方法中来对事件做一些处理。 在我们的JavaWeb中,观察者就是Listener,而被观察者可能有三个ServletContext、HttpSession、ServletRequest。而事件指的就是这些对象的创建、修改和删除等。
全栈程序员站长
2022/08/04
7860
JSP的Web监听器(Listener)
Listener与Filter监听器基础使用
[TOC] 1.Listener 1) 基础介绍 Q:Listener是什么?有什么用? 答:Listener监听器,用于监听某一个事件的发生。 Q:监听器的内部机制是什么? 答:实就是接口回调,事件
全栈工程师修炼指南
2020/10/23
6190
Listener与Filter监听器基础使用
Web-第十七天 监听器Listener【悟空教程】
当我们使用QQ时,在生日当天会收到QQ系统发送的祝福邮件。今天我们将实现相同的功能。
Java帮帮
2018/07/27
8110
Web-第十七天 监听器Listener【悟空教程】
javaee的OA项目(七)监听器的使用
如果对象从session中解绑的时候或者session注销的时候就会执行valueUnbound
一写代码就开心
2021/06/17
4150
javaee的OA项目(七)监听器的使用
Servlet规范中的监听器-Listener
在介绍监听器之前,先跟同学们普及一个知识,观察者设计模式。因为所有的监听器都是观察者设计模式的体现。
楠羽
2022/11/18
6700
Servlet规范中的监听器-Listener
监听器第一篇【基本概念、Servlet各个监听器】
什么是监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。 为什么我们要使用监听
Java3y
2018/03/15
9890
监听器第一篇【基本概念、Servlet各个监听器】
大数据必学Java基础(一百一十五):Session域监听器
HttpSessionListener HttpSessionAttributeListener HttpSessionBindingListener HttpSessionActivationListener
Lansonli
2022/12/23
3500
大数据必学Java基础(一百一十五):Session域监听器
web的监听器,你需要知道这些...
方志朋
2017/12/29
6560
Web监听器导图详解
  监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器   1 什么是web监听器?   web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听
用户1154259
2018/01/17
7340
Web监听器导图详解
29. Filter 过滤器 以及 Listener 监听器
从上图可以简单说明一下,Filter 过滤器就是用来拦截 请求 或者 响应 的。下面我们首先来写一个快速入门的案例,从代码的角度来认识一下。
Devops海洋的渔夫
2021/11/19
7450
29. Filter 过滤器 以及 Listener 监听器
Java监听器Listener的使用详解
监听器用于监听Web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。 分类: 按监听的对象划分 可以分为: ServletContext对象的监听器 HttpSession对象的监听器 ServletRequest对象的监听器 按监听的事件划分 可以分为: 对象自身的创建和销毁的监听器 对象中属性的创建和消除的监听器 session
nnngu
2018/04/04
2.6K0
Java监听器Listener的使用详解
【愚公系列】2023年03月 Java教学课程 098-Servlet服务器的Listener
观察者设计模式是一种行为型设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它会通知所有的观察者对象,使它们能够自动更新自己。
愚公搬代码
2023/03/27
4700
【愚公系列】2023年03月 Java教学课程 098-Servlet服务器的Listener
Listener监听器
在Servlet技术中已经定义了一些事件,并且我们可以针对这些事件来编写相关的事件监听器,从而对事件作出相应处理。Servlet事件主要有3类:Servlet上下文事件、会话事件与请求事件。下面具体讲解这3类事件的监听器实现。 1.对Servlet上下文进行监听(就是JSP中的application) 可以监听ServletContext对象的创建和删除以及属性的添加、删除和修改等操作。该监听器需要使用到如下两个接口类: ● ServletContextAttributeListener:监听对Servle
汤高
2018/01/11
1.1K0
Servlet监听器和过滤器的快速使用和配置(基于注解配置)
过滤器是一种设计模式,主要用来封装Servlet中一些通用的代码。在web.xml中配置哪些URL对应哪些过滤器。
静谧星空TEL
2021/04/27
6360
Servlet监听器和过滤器的快速使用和配置(基于注解配置)
JavaWeb - Filter 和 Listener
Filter 本意为”过滤“的含义,是 JavaWeb 的三大组件之一,三大组件为:Servlet、Filter、Listener。
RendaZhang
2020/09/08
5720
JavaWeb - Filter 和 Listener
JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)
启动tomcat,浏览器访问http://localhost:8080/springmvc/servletlifecycle,控制台打印:
Java微观世界
2025/01/21
5520
JavaWeb三大组件(Servlet程序、Filter过滤器、Listener监听器)
推荐阅读
相关推荐
Servlet总结五(监听器)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验