RocketMQ+Springboot整合及简单原理

话不多说,直接主题

pom文件新增:

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.3</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.5.2</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-common</artifactId>
    <version>4.5.2</version>
</dependency>

生产消息:

@Slf4j
@Service
public class MQServiceImpl implements MQService {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    @Override
    public SendResult sendMsg(String topic, String tags,String keys, String body, int delayTimeLevel) {
        SendResult sendResult = null;
        //消息体
        Message message = new Message(topic, tags, keys, body.getBytes());
        message.setDelayTimeLevel(delayTimeLevel);
        try {
            sendResult = rocketMQTemplate.getProducer().send(message);
            if (!sendResult.getSendStatus().equals(SendStatus.SEND_OK)){
//            失败重试一次
                sendResult = rocketMQTemplate.getProducer().send(message);
            }
           log.info("发送结果:{}", JSONObject.toJSONString(sendResult));
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       return sendResult;
    }
}

消费消息:

/**
 * 消息监听
 */
@Slf4j
@Component
@RocketMQMessageListener(topic = "${mq.order.closeOrder.topic}", consumerGroup = "${mq.order.closeOrder.consumer.group.name}",
        messageModel = MessageModel.CLUSTERING, consumeMode = ConsumeMode.ORDERLY, consumeThreadMax = 20)
public class CloseOrderListener implements RocketMQListener<MessageExt> {
    @Autowired
    private TbEmbeddedSingleService tbEmbeddedSingleService;
    @Value("${mq.order.closeOrder.topic}")
    private String topic;

    @Value("${mq.order.closeOrder.failed.tag}")
    private String failedTag;

    @Autowired
    private MQService mqService;

    @Override
    public void onMessage(MessageExt message) {
        TbEmbeddedSingle tbEmbeddedSingle = null;
        try {
            String body = new String(message.getBody(), StandardCharsets.UTF_8);
            tbEmbeddedSingle = JSON.parseObject(body, TbEmbeddedSingle.class);
            log.info("收到消息:{}", JSONObject.toJSONString(tbEmbeddedSingle));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

原理解析:消费端是有线程池去拿消息消费的,定义了线程池数量及队列类型

只看到消息的拿,消息失败怎么处理呢?,下图,会打印出每次消息消费时间,如果消费失败,会从0级别延迟开始试,重试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值