news 2026/5/1 8:47:23

手把手封装Utils - 钉钉消息工具类实战教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手封装Utils - 钉钉消息工具类实战教程

手把手封装Utils - 钉钉消息工具类实战教程

前言

在日常开发中,我们经常需要集成各种第三方服务,比如钉钉消息推送。今天我们来手把手封装一个实用的钉钉消息工具类,让你的代码更加优雅和可维护。

完整代码展示

先上完整代码,一睹为快:

importcn.hutool.http.HttpRequest;importcn.hutool.json.JSONUtil;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;importjava.util.HashMap;importjava.util.Map;/** * 钉钉消息工具 */@Slf4j@ComponentpublicclassDingTalkUtils{@Value("${dingtalk.platformOperateUrl}")privateStringplatfromOperateUrl;/** * 群里面发送消息 * @param title 消息标题 * @param content 消息内容 */@AsyncpublicvoidsendTextMsg(Stringtitle,Stringcontent){// 组装请求内容StringreqStr=buildReqTextStr(title,content);// 推送消息(http请求)Stringresult=HttpRequest.post(platfromOperateUrl).body(reqStr).execute().body();log.info("钉钉请求发送成功,返回结果:{}",result);}/** * 组装请求报文-text类型 * * @param content 消息内容 * @return */publicstaticStringbuildReqTextStr(Stringtitle,Stringcontent){Map<String,String>contentMap=newHashMap<>();content="【"+title+"】"+"\n"+content;contentMap.put("content",content);Map<String,Object>reqMap=newHashMap<>();reqMap.put("msgtype","text");reqMap.put("text",contentMap);returnJSONUtil.toJsonStr(reqMap);}publicstaticvoidmain(String[]args){DingTalkUtilsdingTalkUtils=newDingTalkUtils();dingTalkUtils.sendTextMsg("测试标题","测试内容");}}

详细解析

1. 依赖引入

首先,我们需要在pom.xml中引入相关依赖:

<!-- Hutool工具包 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

2. 配置说明

application.ymlapplication.properties中添加钉钉配置:

dingtalk:platformOperateUrl:https://oapi.dingtalk.com/robot/send?access_token=你的token

3. 核心功能解析

@Slf4j注解

使用Lombok的@Slf4j注解,自动生成日志对象,简化日志记录代码。

@Component注解

将工具类注册为Spring组件,方便依赖注入。

@Async注解

实现异步消息发送,避免阻塞主线程,提升系统性能。

@Value注解

从配置文件中读取钉钉Webhook地址,实现配置与代码分离。

4. 方法详解

sendTextMsg方法
@AsyncpublicvoidsendTextMsg(Stringtitle,Stringcontent)
  • 功能:发送文本消息到钉钉群
  • 参数
    • title:消息标题,会被格式化为【标题】格式
    • content:消息内容
  • 特性:异步执行,不会阻塞调用线程
buildReqTextStr方法
publicstaticStringbuildReqTextStr(Stringtitle,Stringcontent)
  • 功能:构建钉钉文本消息的请求体
  • 返回值:JSON格式的请求字符串
  • 格式化:自动将标题和内容拼接成钉钉支持的格式

5. 使用示例

基本使用
@AutowiredprivateDingTalkUtilsdingTalkUtils;// 发送消息dingTalkUtils.sendTextMsg("系统告警","服务器CPU使用率超过90%");
在异常处理中使用
@ControllerAdvicepublicclassGlobalExceptionHandler{@AutowiredprivateDingTalkUtilsdingTalkUtils;@ExceptionHandler(Exception.class)publicvoidhandleException(Exceptione){log.error("系统异常",e);dingTalkUtils.sendTextMsg("系统异常",e.getMessage());}}

6. 扩展功能

支持Markdown消息
publicvoidsendMarkdownMsg(Stringtitle,Stringcontent){Map<String,String>markdownMap=newHashMap<>();markdownMap.put("title",title);markdownMap.put("text",content);Map<String,Object>reqMap=newHashMap<>();reqMap.put("msgtype","markdown");reqMap.put("markdown",markdownMap);StringreqStr=JSONUtil.toJsonStr(reqMap);Stringresult=HttpRequest.post(platfromOperateUrl).body(reqStr).execute().body();log.info("钉钉Markdown消息发送成功,返回结果:{}",result);}
支持@指定用户
publicvoidsendTextMsgAt(Stringtitle,Stringcontent,List<String>atMobiles){Map<String,Object>reqMap=buildReqTextMap(title,content);Map<String,Object>atMap=newHashMap<>();atMap.put("atMobiles",atMobiles);atMap.put("isAtAll",false);reqMap.put("at",atMap);StringreqStr=JSONUtil.toJsonStr(reqMap);Stringresult=HttpRequest.post(platfromOperateUrl).body(reqStr).execute().body();log.info("钉钉@消息发送成功,返回结果:{}",result);}

7. 最佳实践

1. 错误处理增强
@AsyncpublicvoidsendTextMsg(Stringtitle,Stringcontent){try{StringreqStr=buildReqTextStr(title,content);Stringresult=HttpRequest.post(platfromOperateUrl).body(reqStr).timeout(5000)// 设置超时时间.execute().body();log.info("钉钉消息发送成功,返回结果:{}",result);}catch(Exceptione){log.error("钉钉消息发送失败",e);// 可以在这里实现重试机制或降级处理}}
2. 消息队列解耦
@ServicepublicclassDingTalkService{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;privatestaticfinalStringDINGTALK_QUEUE="dingtalk:queue";publicvoidsendMessageAsync(Stringtitle,Stringcontent){Map<String,String>message=newHashMap<>();message.put("title",title);message.put("content",content);redisTemplate.opsForList().rightPush(DINGTALK_QUEUE,message);}// 通过定时任务或消息监听器处理队列@Scheduled(fixedDelay=1000)publicvoidprocessMessageQueue(){// 处理消息队列}}

总结

通过这个实战案例,我们学习了如何:

  1. 优雅地封装第三方API调用
  2. 使用Spring注解简化开发
  3. 实现异步处理提升性能
  4. 合理设计工具类结构
  5. 考虑扩展性和可维护性

这个钉钉消息工具类不仅功能完善,而且易于扩展。你可以根据实际需求添加更多的消息类型支持,比如链接消息、卡片消息等。

希望这篇文章对你有所帮助,如果有任何问题,欢迎在评论区留言讨论!


更多精彩内容,请关注我的CSDN博客!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:05:21

Q#调用Python模块时代码导航失效?资深工程师教你4步快速排查

第一章&#xff1a;Q#-Python 的代码导航概述在量子计算与经典编程语言融合的背景下&#xff0c;Q# 与 Python 的协同开发模式逐渐成为主流。通过 Q# 编写的量子算法可以借助 Python 进行控制流管理、数据预处理和结果可视化&#xff0c;而高效的代码导航能力是实现这一协作的关…

作者头像 李华
网站建设 2026/4/21 15:36:11

【高级运维技巧】:如何用Docker Compose打造高可用Agent集群?

第一章&#xff1a;高可用Agent集群的核心概念 在分布式系统架构中&#xff0c;Agent 集群承担着数据采集、任务执行与状态上报等关键职责。构建高可用的 Agent 集群&#xff0c;意味着系统能够在部分节点故障时仍保持服务连续性&#xff0c;确保业务不受中断。 高可用性的核心…

作者头像 李华
网站建设 2026/5/1 5:31:45

Docker容器化测试全流程解析,掌握多模态Agent用例执行的黄金标准

第一章&#xff1a;多模态 Agent 的 Docker 测试用例在构建多模态 Agent 系统时&#xff0c;使用 Docker 容器化技术可有效隔离运行环境&#xff0c;确保测试的一致性与可复现性。通过定义标准化的镜像配置&#xff0c;开发者能够在不同平台上快速部署并验证 Agent 对文本、图像…

作者头像 李华
网站建设 2026/4/23 15:57:42

从新手到专家:掌握Cirq函数提示的6个关键阶段

第一章&#xff1a;Cirq函数提示的初识与环境搭建Cirq 是由 Google 开发的开源量子计算框架&#xff0c;专为在经典计算机上模拟和设计量子电路而设计。它允许开发者以高精度控制量子门操作&#xff0c;并支持与真实量子硬件的对接。本章将引导读者完成 Cirq 的基础认知与开发环…

作者头像 李华
网站建设 2026/4/25 12:46:14

Photoshop图层批量导出工具:高效自动化解决方案的技术解析

Photoshop图层批量导出工具&#xff1a;高效自动化解决方案的技术解析 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目地址:…

作者头像 李华
网站建设 2026/4/30 17:00:24

41、系统编程知识与技巧深度解析

系统编程知识与技巧深度解析 在系统编程领域,掌握各类关键技术和工具是提升编程能力的关键。本文将深入探讨系统编程中的多个重要方面,包括GCC扩展、文件操作、内存管理、线程与进程管理以及时间处理等内容。 1. GCC扩展特性 GCC编译器提供了一些实用的扩展特性,能增强代…

作者头像 李华