SpringBoot集成DingTalk钉钉机器人实现消息同步/异步预警推送1.0版本_Jaemon-CSDN博客

V2.0版本新增支持以下功能

  • 新增Dinger层对消息对象配置指定钉钉机器人
  • 新增Dinger层统一管理消息对象,仅支持text和markdown格式

    • 支持xml方式配置
    • 支持注解方式配置
  • 新增关闭指定消息体和XXXDinger内定义的所有消息体
SpringBoot集成DingTalk钉钉机器人实现消息同步/异步预警推送 2.0版本

开发环境说明

  • JDK1.8
  • springboot版本: 2.0.3.RELEASE

快速入门

V1.0快速使用文档

    • *

1.X版本使用文档

    • *

引入maven依赖

<dependency>
    <groupId>com.github.answerail</groupId>
    <artifactId>dingtalk-spring-boot-starter</artifactId>
    <version>1.0.5-RELEASE</version>
</dependency>

<!-- okhttp3依赖 -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.10.0</version>
</dependency>

YAML配置

spring:
  dingtalk:
      # 必填, 项目ID, 推荐值: ${spring.application.name}
    project-id: ${spring.application.name}
    # 必填
    token-id: c60d4824e0ba4a30544e81212256789331d68b0085ed1a5b2279715741355fbc
    # 选填, 自定义关键字
    title: 消息推送
token-id获取方式: token-id的值就是机器人的Webhook地址中access_token的值。

SpringBoot中使用

text消息类型

public class Demo {
        @Autowired
        private DingTalkRobot dingTalkRobot;
        
        public void test() {
            String keyword = "DYZ3AALTRBD2AIDLL0Y3EQ4TYGLJDUM";
            String subTitle = "服务启动通知";
            String content = "服务启动异常啦。。。";

            // 方式1-text类型
            dingTalkRobot.send(MsgTypeEnum.TEXT, keyword, subTitle, content);

            // 方式2-text类型带@指定群成员
            dingTalkRobot.send(MsgTypeEnum.TEXT, keyword, subTitle, content,
                    Lists.newArrayList("135XXXXXXXX"));

            // 方式3-text类型带@全部群成员
            dingTalkRobot.sendAll(MsgTypeEnum.TEXT, keyword, subTitle, content);
        }      
    }

markdown消息类型

    public class Demo {
        @Autowired
        private DingTalkRobot dingTalkRobot;
        
        public void test() {
            String keyword = "DYZ3AALTRBD2AIDLL0Y3EQ4TYGLJDUM";
            String subTitle = "服务启动通知";
            String content = "服务启动异常啦。。。";

            // 方式1-markdown类型
            dingTalkRobot.send(MsgTypeEnum.MARKDOWN, keyword, subTitle, content);

            // 方式2-markdown类型带@指定群成员
            dingTalkRobot.send(MsgTypeEnum.MARKDOWN, keyword, subTitle, content,
                    Lists.newArrayList("135XXXXXXXX"));
        }      
    }
markdown消息体暂时不支持@全部
    • *
以下为个性化配置部分
    • *

定制化配置

如果只是简单的往钉钉群推动消息的, 以上内容可以满足你的需求。如果有需要考虑定制化配置的, 可继续往下阅读, 以下内容为独立配置文档说明, 如需进行整体配置请参考个性化整体配置

自定义消息体

    @Configuration
    public class MyConfiguration {
        // 自定义text类型消息体
        @Bean
        public CustomMessage textMessage() {
            return (dingTalkProperties, subTitle, keyword, content, phones) -> {
                String message = null;
                // ...
                return message;
            };
        }
    
        // 自定义markdown类型消息体
        @Bean
        public CustomMessage markDownMessage() {
            return (dingTalkProperties, subTitle, keyword, content, phones) -> {
                String message = null;
                // ...
                return message;
            };
        }
    }
在默认设置的消息体中可以根据keyword字段的值快速定位到系统日志信息

默认text消息格式

【通知】 服务启动通知
- 项目名称: oms
- 检索关键字: DYZ3AALTRBD2AIDLL0Y3EQ4TYGLJDUM
- 内容: 服务启动异常啦。。。.

默认markdown消息格式

    • *
【通知】 服务启动通知
  • 项目名称: oms
  • 检索关键字: DYZ3AALTRBD2AIDLL0Y3EQ4TYGLJDUM
  • 内容: 服务启动异常啦。。。
    • *

自定义异常回调

    @Configuration
    public class MyConfiguration {
        // 自定义异常回调函数
        @Bean
        public Notice notice() {
            return (dkExCallable) -> {
                // ...
            };
        }
    }
调用消息推送时出现异常时回调处理

自定义签名体

  • 更改前: URL_PREV&sign=XXX×tamp=XXX
  • 更改后: URL_PREV×tamp=XXX&sign=XXX
    @Data
    @AllArgsConstructor
    public class SignDTO extends SignBase {
        private String sign;
        private Long timestamp;
    
        @Override
        public String transfer() {
            StringBuilder signStr = new StringBuilder(SEPERATOR);
            signStr
                    .append("timestamp=").append(this.timestamp).append(SEPERATOR)
                    .append("sign=").append(this.sign);
            return signStr.toString();
        }
    }
    @Configuration
    public class MyConfiguration {
        @Bean
        public DkSignAlgorithm<SignDTO> dkSignAlgorithm() {
            return new DkSignAlgorithm<SignDTO>() {
                @Override
                public SignDTO sign(String secret) throws Exception {
                    Long timestamp = System.currentTimeMillis();
                    // TODO 使用默认算法, 如果后期算法改变, 可在此更变签名算法
                    String sign = algorithm(timestamp, secret);
                    return new SignDTO(sign, timestamp);
                }
            };
        }
    }
该功能只针对后期版本变更进行扩展, 当前版本没有使用的必要

自定义处理ID生成器

    @Configuration
    public class MyConfiguration {
        @Bean
        public DkIdGenerator dkIdGenerator() {
            return () -> {
                String dkid = null;
                // ...
                return dkid;
            };
        }  
    }
注意ID最好保证全局唯一, 同步调用直接返回响应结果,异步操作返回处理id(dkid)

自定义异步执行结果回调处理器

    @Configuration
    public class MyConfiguration {
        @Bean
        public DkCallable dkCallable() {
            return (dkid, result) -> {
                // ...
            };
        }    
    }

此处方法形参(dkid, result),其中: dkid也就是异步通知的返回结果, result为请求实际的响应报文字符串。

注意开启异步处理时使用内置线程池, 如果项目中有定义其他线程池配置, 注入线程池对象时请指定线程池名称。 如: @Qualifier("executor")

自定义线程池(可选)

    @Configuration
    public class MyConfiguration {
        @Bean
        public Executor dingTalkExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // ...
            return executor;
        }
    }

自定义http客户端(可选)

    @Configuration
    public class MyConfiguration {
        @Bean
        public OkHttpClient okHttpClient() {
            // ...
        }
    }

相关链接


原网址: 访问
创建于: 2021-02-02 14:06:34
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论