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());
        }
    }
}

Spring Boot整合RocketMQ进行定时/延时消息处理是一个常见的实践场景,它允许你在Spring应用程序中轻松地发送和接收延迟送达的消息。以下是基本步骤: 1. 添加依赖:首先,在你的`pom.xml`文件中添加RocketMQ和Spring Cloud Stream的相关依赖。 ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rocketmq</artifactId> </dependency> <dependency> <groupId>com.alibaba.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> </dependency> ``` 2. 配置 RocketMQ:在`application.yml`或其他配置文件中,配置生产者和消费者的连接信息。 ```yaml spring: cloud: stream: bindings: input-topic: destination: your-delayed-topic group: your-consumer-group output-topic: destination: your-timed-message-topic binder: rocketmq retryCount: 0 # 设置重试次数 ``` 3. 创建定时任务:通过Spring的`@Scheduled`注解创建一个定时任务,用于发送延时消息。 ```java @Service public class TimedMessageService { @Autowired private RabbitTemplate rabbitTemplate; @Scheduled(cron = "0 0/5 * * * ?") // 每五分钟执行一次 public void sendDelayedMessages() { for (int i = 0; i < 10; i++) { String message = "This is a delayed message " + i; Message msg = new DefaultMQProducer("producerGroup").createMessage("your-timed-message-topic", message.getBytes(StandardCharsets.UTF_8), "", null); msg.setDelayTimeLevel(MessageQueue延时时间单位); msg.setDelayTimeSeconds(60); // 设置消息延时60秒 rabbitTemplate.convertAndSend(msg); } } } ``` 4. 接收延迟消息:对于消费者,你可以创建一个消费者类,监听指定主题并处理接收到的延时消息。 ```java @Service @EnableRabbitListeners(queues = "your-input-topic") public class DelayedMessageListener { @RabbitHandler public void handle(String message) { System.out.println("Received delayed message: " + message); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值