RocketMQ 事务的使用

依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-common</artifactId>
    <version>4.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
	<version>4.9.1</version>
</dependency>

发送消息

/**
 * 使用事务
 * @throws Exception
 */
public void sendMessageUseTransaction() throws Exception {
    TransactionMQProducer producer = new TransactionMQProducer("mygroup");
    //设置nameserver
    producer.setNamesrvAddr("127.0.0.1:9876");
    //设置线程池
    //producer.setExecutorService(ExecutorService);
    producer.setTransactionListener(new TransactionListener() {
        long time = 0;
        //执行本地事务
        @Override
        public LocalTransactionState executeLocalTransaction(Message message, Object o) {
            time = System.currentTimeMillis();
            System.out.println("开始事务");
            try {
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("结束事务");
            //COMMIT_MESSAGE -- 提交;ROLLBACK_MESSAGE -- 回滚;UNKNOW -- 未知
            return LocalTransactionState.COMMIT_MESSAGE;
        }
        //broker端回调,检查事务
        @Override
        public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
            long temp = System.currentTimeMillis() - time;
            temp /= 1000;
            System.out.println("事务执行" + temp + "s后检查事务:" + messageExt.getTransactionId());
            return LocalTransactionState.UNKNOW;
        }
    });
    producer.start();
    String body = UUID.randomUUID().toString();
    Message message = new Message("mytopic", body.getBytes());
    TransactionSendResult sendResult = producer.sendMessageInTransaction(message, null);
    System.out.println("发送完成");
    //不能关闭连接
    //producer.shutdown();
}

接收消息

/**
 * 接收消息
 * @throws Exception
 */
public void receiveMessage() throws Exception {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("mygroupp");
    //设置nameserver
    consumer.setNamesrvAddr("127.0.0.1:9876");
    //topic -- 关注的消息地址; * -- 不过滤
    consumer.subscribe("mytopic", "*");
    //只消费Tag=mytag的消息
    //defaultMQPushConsumer.subscribe("mytopic", "mytag");
    //设置最大线程数
    consumer.setConsumeThreadMax(2);
    //设置最小线程数
    consumer.setConsumeThreadMin(2);
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(
                List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
            for (MessageExt messageExt : list) {
                byte[] body = messageExt.getBody();
                String s = new String(body);
                String name = Thread.currentThread().getName();
                System.out.println(s + "\t" + name);
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    //设置消费模式;BROADCASTING -- 广播模式;CLUSTERING -- 集群模式
    consumer.setMessageModel(MessageModel.CLUSTERING);
    consumer.start();
}
posted @   叕叕666  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示