基于上述讨论点,封装建议基于实体类来,实体类不管是排查问题、新人熟悉系统代码、信息校验等String和JSONObject无法像实体类一样轻松胜任2.2 RocketMQTemplate封装2.2.1 封装基础实体类
- 基础消息实体类封装了除了业务消息外所有其他公共字段,主要看下面代码中的字段和注释
- 基础抽象消息实体,包含基础的消息、根据自己的业务消息设置更多的字段 其中也可以包含所有消费者可能用得到的方法等,比如做些数据的加解密
package com.codecoord.rocketmq.domain;import lombok.Data;import java.time.LocalDateTime;import java.util.UUID;/** * 基础消息实体,包含基础的消息 * 根据自己的业务消息设置更多的字段 * * @author tianxincoord@163.com * @since 2022/6/16 */@Datapublic abstract class BaseMqMessage {/*** 业务键,用于RocketMQ控制台查看消费情况*/protected String key;/*** 发送消息来源,用于排查问题*/protected String source = "";/*** 发送时间*/protected LocalDateTime sendTime = LocalDateTime.now();/*** 跟踪id,用于slf4j等日志记录跟踪id,方便查询业务链*/protected String traceId = UUID.randomUUID().toString();/*** 重试次数,用于判断重试次数,超过重试次数发送异常警告*/protected Integer retryTimes = 0;} - 有了此基础抽象实体类,那么剩下的所有业务消息实体只需要继承此基类,然后在自己业务类中包含自己需要的字段即可,因为这些公共字段不管是向上转型还是向下转型,子类和父类都可以看得到
2.2.2 RocketMQTemplate
- RocketMQTemplate发送消息的代码如果不封装,我们发送消息需要这样 String destination = topic + ":" + tag; template.syncSend(destination, message);
- 每个人发送消息都要自己处理这个冒号,直接传入topic和tag不香吗?按照抽离变化点中的变化点,只有消息是变化的,除此之外的其他规则交给封装类
- RocketMQTemplate主要封装发送消息的日志、异常的处理、消息key设置、等等其他配置
- 封装代码类如下,下面包含了主要发送方式,更多自己添加即可 这里就是消息发送的点餐机器,同时也提供了封装方法也提供原始RocketMQTemplate供使用 此处只是提供一种方式,生产中按照项目组商量决定
package com.codecoord.rocketmq.template;import com.alibaba.fastjson.JSONObject;import com.codecoord.rocketmq.constant.RocketMqSysConstant;import com.codecoord.rocketmq.domain.BaseMqMessage;import com.codecoord.rocketmq.util.JsonUtil;import org.Apache.rocketmq.client.producer.SendResult;import org.apache.rocketmq.spring.core.RocketMQTemplate;import org.apache.rocketmq.spring.support.RocketMQHeaders;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.messaging.Message;import org.springframework.messaging.support.MessageBuilder;import org.springframework.stereotype.Component;import javax.annotation.Resource;/** * RocketMQ模板类 * * @author tianxincoord@163.com * @since 2022/4/15 */@Componentpublic class RocketMqTemplate {private static final Logger LOGGER = LoggerFactory.getLogger(RocketMqTemplate.class);@Resource(name = "rocketMQTemplate")private RocketMQTemplate template;/*** 获取模板,如果封装的方法不够提供原生的使用方式*/public RocketMQTemplate getTemplate() {return template;}/*** 构建目的地*/public String buildDestination(String topic, String tag) {return topic + RocketMqSysConstant.DELIMITER + tag;}/*** 发送同步消息*/public <T extends BaseMqMessage> SendResult send(String topic, String tag, T message) {// 注意分隔符return send(topic + RocketMqSysConstant.DELIMITER + tag, message);}public <T extends BaseMqMessage> SendResult send(String destination, T message) {// 设置业务键,此处根据公共的参数进行处理// 更多的其它基础业务处理...Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build();SendResult sendResult = template.syncSend(destination, sendMessage);// 此处为了方便查看给日志转了json,根据选择选择日志记录方式,例如ELK采集LOGGER.info("[{}]同步消息[{}]发送结果[{}]", destination, JsonUtil.toJson(message), JSONObject.toJSON(sendResult));return sendResult;}/*** 发送延迟消息*/public <T extends BaseMqMessage> SendResult send(String topic, String tag, T message, int delayLevel) {return send(topic + RocketMqSysConstant.DELIMITER + tag, message, delayLevel);}public <T extends BaseMqMessage> SendResult send(String destination, T message, int delayLevel) {Message<T> sendMessage = MessageBuilder.withPayload(message).setHeader(RocketMQHeaders.KEYS, message.getKey()).build();SendResult sendResult = template.syncSend(destination, sendMessage, 3000, delayLevel);LOGGER.info("[{}]延迟等级[{}]消息[{}]发送结果[{}]", destination, delayLevel, JsonUtil.toJson(message), JsonUtil.toJson(sendResult));return sendResult;}}
推荐阅读
-
大众帕萨特|帕萨特追尾三轮车,现场一片狼藉,大众车主嫌丢人
-
星座生肖解析:收入上涨,如愿赚取很多钱财的四属相,未来五个月财运大旺
-
别叫我狗子▲大仙教你如何快乐玩好安琪拉!,状态不好来草丛蹲着!草丛三姐之一
-
-
太平洋电脑网 NASA:全美至少1030万人同时在线看SpaceX载人发射
-
新华社|世卫组织警告有关国家“清醒过来”是当头棒喝
-
-
-
平安|平安健康险董事长兼CEO杨铮:健康管理对医疗险续保、理赔有较大的正向影响
-
烹饪|色泽鲜红、又酸又辣的卷心菜煎饼,没加泡菜,却吃出了泡菜的味道
-
违规设立限高设施等影响货车通行 河北山东河南等地被通报
-
-
“春在腊月间,春无回马寒”,今年立春在腊月,有无“回马寒”?
-
-
爱的二八定律|武庚纪将开机!祝绪丹郭晓婷有望加入,粉丝诉求:拒魔改拒乱加戏
-
连衣裙|街拍是什么“神仙”裙子,比皮裙还要紧身,还是瘦“十斤”后再穿吧
-
有可能被滥用?谷歌母公司CEO支持暂禁面部识别技术
-
掌上佳人|磨皮妆效就靠它,底妆影响颜值?乘风破浪姐姐控油持妆秘诀大公开
-
-
穿搭|休闲风出街怎么穿,看明星的搭配法则,学会让你潮流感爆棚