RocketMQ定时消息&延时消息

参考rockemq官方文档:https://help.aliyun.com/document_detail/43349.html?spm=a2c4g.11174283.6.555.64fc347dRoDkZy

限制:定时和延时消息的msg.setStartDeliverTime参数可设置40天内的任何时刻(单位毫秒),超过40天消息发送将失败。

生产消息:

/**
     * 消息生产
     *
     * @param scheduleDto 消息体
     */
    @Override
    public void messageProducer(AssWorkScheduleDto scheduleDto) {
        logger.info("AssWorkScheduleProducerImpl 生产的消息:{}", scheduleDto);
        if (null == scheduleDto) {
            logger.error("AssWorkScheduleProducerImpl 请求参数为空.");
            return;
        }
        Long executeTime = scheduleDto.getExecuteTime();
        if (null == executeTime) {
            logger.error("AssWorkScheduleProducerImpl executeTime为空.");
            return;
        }
        if (System.currentTimeMillis() >= executeTime) {
            logger.error("AssWorkScheduleProducerImpl executeTime小于当前时间.");
            return;
        }
        Message<AssWorkScheduleDto> message = new Message<>();
        message.setData(scheduleDto);
        message.setStartDeliverTime(executeTime);
        logger.info("msg body: {}", JSON.toJSONString(message));
        super.send(message);
    }

消费消息:

    @Override
    public ConsumeResult consume(Message<AssWorkScheduleDto> message) {
        logger.error("AssWorkScheduleListener 接受的消息:{}", JSON.toJSONString(message));
        AssWorkScheduleDto data = message.getData();
        if (null == data) {
            //直接提交
            return ConsumeResult.CommitMessage;
        }
        try {
            switch (data.getBusinessTag()) {
                case AssWorkScheduleTypeConstant
                        .MP_AUTO_COMPLETE:
                    assWorkScheduleService.updateAssWorkComplete4Mp(data);
                    break;
                case AssWorkScheduleTypeConstant.MP_IS_OVERTIME:
                    assWorkScheduleService.updateAssWorkOvertime4Mp(data);
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            logger.error("AssWorkScheduleListener 消费失败", e);
            //消费失败,重新消费
            return ConsumeResult.ReconsumeLater;
        }

        return ConsumeResult.CommitMessage;
    }

Dto:

@Data
public class AssWorkScheduleDto implements Serializable {
    /**
     * 执行时间-单位:ms
     */
    private Long executeTime;

    /**
     * 业务标识
     */
    private int businessTag;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ支持消息,可以通过设置消息级别(Delay Level)来指定消息间。级别是通过设置消息的属性来实现的。 在RocketMQ中,消息的实现原理是通过将消息发送到消息队列(Delay Queue)中,在指定的间后再将消息消息队列中取出,发送到目标消息队列中。 消息可以用于各种场景,比如定时任务、订单超提醒等。 下面是使用RocketMQ发送消息的示例代码: ``` // 创建生产者实例 DefaultMQProducer producer = new DefaultMQProducer(&quot;producer_group&quot;); // 设置NameServer地址 producer.setNamesrvAddr(&quot;localhost:9876&quot;); // 启动生产者实例 producer.start(); // 创建消息实例,设置消息内容 Message msg = new Message(&quot;topic_name&quot;, &quot;tag_name&quot;, &quot;Hello RocketMQ&quot;.getBytes()); // 设置消息级别为3,表示10s发送 msg.setDelayTimeLevel(3); // 发送消息 SendResult result = producer.send(msg); // 输出发送结果 System.out.println(result); // 关闭生产者实例 producer.shutdown(); ``` 在这个示例中,我们创建了一个生产者实例,并设置了NameServer地址。然后创建一个消息实例,设置消息内容,并将级别设置为3。最后发送消息,并输出发送结果。 需要注意的是,消息间是在消息发送后计算的,而不是在消息创建计算的。因此,如果需要精确控制间,需要考虑网络迟等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值