RocketMq 顺序消费、分区消息、延迟发送消息、Topic、tag分类 实战 (延迟发送消息) (四)

延迟发送消息生产者配置

如下所示:@Bean注解向Spring容器注入一个名字叫delayOrderProducerBean、类型为OrderProducerBean 的对象(下文需要用到)

bash 复制代码
@Configuration
public class DelayProducerClient {

    @Autowired
    private RocketMqDelayProperties rocketMqDelayProperties;

    @Lazy
    @Bean(name = "delayOrderProducerBean",initMethod = "start", destroyMethod = "shutdown")
    public OrderProducerBean buildDelayOrderProducer() {
        OrderProducerBean orderProducerBean = new OrderProducerBean();
        orderProducerBean.setProperties(rocketMqDelayProperties.getProducerProperties());
        return orderProducerBean;
    }
}
bash 复制代码
  	@Autowired
    private RocketMqDelayProperties rocketMqDelayProperties;
	
	@Qualifier("delayOrderProducerBean")
    @Autowired
    private OrderProducerBean delayOrderProducerBean;
	
    public void sendDelayMQMessage(DelayBaseBo delayBaseBo) {

        String jsonBody = JsonLUtils.toJSon(delayBaseBo.getDelayMqSub());
        log.info("shardingKey = {},tag = {},jsonBody = {}", delayBaseBo.getShardingKey(), delayBaseBo.getTag(), jsonBody);

        // 发送消息,只要不抛异常就是成功
        try {
            Message msg = new Message(
                    // Message所属的Topic
                    rocketMqDelayProperties.getTopic(),
                    // Message Tag 可理解为Gmail中的标签,对消息进行再归类,方便Consumer指定过滤条件在MQ服务器过滤
                    delayBaseBo.getTag(),
                    // msg key  一般为业务主键
                    delayBaseBo.getShardingKey(),
                    // Message Body 可以是任何二进制形式的数据, MQ不做任何干预
                    // 需要Producer与Consumer协商好一致的序列化和反序列化方式
                    jsonBody.getBytes()
            );
            msg.setStartDeliverTime(LocalDateLUtils.getEpochMilli(delayBaseBo.getDelayTime()));
            SendResult sendResult = delayOrderProducerBean.send(msg, delayBaseBo.getShardingKey());
            assert sendResult != null;
            log.info("event消息发送成功,topic = {},key = {},messageId = {}", sendResult.getTopic(), delayBaseBo.getShardingKey(), sendResult.getMessageId());
        } catch (ONSClientException e) {
            //日志记录错误信息与入参信息
            log.error("event消息发送失败,shardingKey = {} ,jsonBody = {} , 异常信息:", delayBaseBo.getShardingKey(), jsonBody, e);
        }
    }

可以看到,延迟发送消息和实时发送消息的方法差不多,只不过多了一个msg.setStartDeliverTime()参数。

相关推荐
青山木1 天前
RocketMQ 入门到原理(六):可靠性全景
java·后端·中间件·架构·rocketmq
青山木1 天前
RocketMQ 入门到原理(五):特殊消息类型
java·后端·中间件·架构·rocketmq
青山木2 天前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq
科学熊2 天前
RocketMQ 一主两从集群搭建与 SpringBoot 集成完整方案
rocketmq
青山木3 天前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
凤山老林5 天前
RocketMQ 5.0 实战避坑与调优:事务、延迟、轨迹及高可用落地指南
spring boot·rocketmq
heimeiyingwang5 天前
【中台·技术篇】消息队列中台:Kafka/RocketMQ 统一管理与多租户隔离
kafka·rocketmq·中台
hey you~7 天前
云客服多渠道统一接入,消息队列技术实现方案
kafka·消息队列·rocketmq·系统集成·云客服·多渠道接入·接口对接
letisgo510 天前
JAVA 高级进阶10篇《消息队列实战:RocketMQ/Kafka选型与“不丢不重有序“三连解》
java·面试·kafka·消息队列·rocketmq
小楼昨夜又东风12611 天前
kafka、rocketmq、rabbitmq,有什么区别
kafka·rabbitmq·rocketmq