java连接rocketmq生产消费消息案例

1、引入依赖

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

2、生产消息

需要在console上创建好topic。

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

public class RocketMqDemo {
    public static void main(String[] args) throws Exception {
        try{
            DefaultMQProducer producer = new DefaultMQProducer("groupa");
            producer.setNamesrvAddr("10.10.102.52:31206");//MQ服务器地址
            producer.setVipChannelEnabled(false);
            producer.start();
            for (int i = 0; i < 200; i++) {
                Message msg = new Message("demo", "TagA" , ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
                System.out.println("--");
            }
            producer.shutdown();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3、消费消息

注意:首先需要在console上创建好消费者组,消费者与生产者topic需要保持一致才能消费到消息,subExpression填*表示消费所有tag的消息。

import java.util.List;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;


public class RocketMqConsumerDemo {

    public static void main(String[] args) {
        rocketMQConsumer();
    }

    public static void rocketMQConsumer() {
        try {
            System.out.println("rocketMQConsumer  开始------");
            // 消费目标
            // 声明一个消费者consumer,需要传入一个组
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("groupb");
            // 设置集群的NameServer地址,多个地址之间以分号分隔
            consumer.setNamesrvAddr("10.10.102.52:31206");
            // 设置consumer的消费策略
            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            // 集群模式消费,广播消费不会重试
            consumer.setMessageModel(MessageModel.CLUSTERING);
            // 设置最大重试次数,默认是16次
            consumer.setMaxReconsumeTimes(5);
            // 设置consumer所订阅的Topic和Tag,*代表全部的Tag
            consumer.subscribe("demo", "TagA");
            // Listener,主要进行消息的逻辑处理,监听topic,如果有消息就会立即去消费
            consumer.registerMessageListener(new MessageListenerConcurrently() {
                @Override
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                    // 获取第一条消息,进行处理
                    try {
                        if (msgs != null && msgs.size() > 0) {
                              MessageExt messageExt = msgs.get(0);
                              String msgBody = new String(messageExt.getBody(), "utf-8");
                              System.out.println(" 接收消息整体为:" + msgBody);
                        }
                    } catch (Exception e) {
                        System.out.println("消息消费失败,请尝试重试!!!");
                        e.printStackTrace();
                        // 尝试重新消费,直接第三次如果还不成功就放弃消费,进行消息消费失败补偿操作
                        if (msgs.get(0).getReconsumeTimes() == 3) {
                            System.out.println("消息记录日志:" + msgs);
                            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                        } else {
                            // 重试状态码,重试机制可配置
                            // System.out.println("消息消费失败,尝试重试!!!");
                            System.out.println("消息消费失败,请尝试重试!!!");
                            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                        }
                    }
                    System.out.println("消息消费成功!!!");
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });
            // 调用start()方法启动consumer
            consumer.start();
            System.out.println("消费者启动成功。。。");
            System.out.println("rocketMQConsumer 结束------");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("消息消费操作失败--" + e.getMessage());
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ 中,消费顺序消息时,可以使用两种方式来实现负载均衡: 1. 使用 MessageListenerOrderly 接口 RocketMQ 提供了 MessageListenerOrderly 接口,它可以让消费者按照消息的顺序依次消费。同时,它还提供了一个参数,可以让我们设置消息消费者的线程数。例如: ``` public class OrderlyMessageListener implements MessageListenerOrderly { private final AtomicInteger threadIndex = new AtomicInteger(0); @Override public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) { int index = threadIndex.getAndIncrement(); // TODO: 处理消息的业务逻辑 return ConsumeOrderlyStatus.SUCCESS; } } DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group"); consumer.setConsumeThreadMin(1); consumer.setConsumeThreadMax(10); consumer.registerMessageListener(new OrderlyMessageListener()); consumer.subscribe("topic", "*"); consumer.start(); ``` 在上面的代码中,我们通过 setConsumeThreadMin 和 setConsumeThreadMax 方法来设置消费者的线程数。当 RocketMQ 推送消息消费者时,它会根据线程数来进行负载均衡,保证每个线程都有消息可以处理。 2. 使用 MessageListenerConcurrently 接口 除了 MessageListenerOrderly 接口外,RocketMQ 还提供了 MessageListenerConcurrently 接口,它允许多个线程并发消费消息。同样,它也提供了一个参数,可以让我们设置消息消费者的线程数。例如: ``` public class ConcurrentMessageListener implements MessageListenerConcurrently { private final AtomicInteger threadIndex = new AtomicInteger(0); @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { int index = threadIndex.getAndIncrement(); // TODO: 处理消息的业务逻辑 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } } DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group"); consumer.setConsumeThreadMin(1); consumer.setConsumeThreadMax(10); consumer.registerMessageListener(new ConcurrentMessageListener()); consumer.subscribe("topic", "*"); consumer.start(); ``` 在上面的代码中,我们同样通过 setConsumeThreadMin 和 setConsumeThreadMax 方法来设置消费者的线程数。当 RocketMQ 推送消息消费者时,它会根据线程数来进行负载均衡,保证每个线程都有消息可以处理。由于使用的是并发消费,所以需要注意消息处理的顺序可能不是严格按照消息顺序的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值