SpringBoot整合rocketMQ

我这里是使用idea,新建spring initializr项目,选择web
(需在依赖中添加两个jar包)

		
		
			org.apache.rocketmq
			rocketmq-client
			4.3.1
		

		
		
			org.apache.rocketmq
			rocketmq-common
			4.3.1
		

1.在配置文件中配置服务器端口号,生产者消费者组名和NameServe地址
我在这里用的是yml格式的配置文件

#服务器端口号
server:
  port: 8022
#消费者组名
PusbConsumer: PusbConsumer
#生产者组名
producerGroup: Producer
#NameServe端口号
namesrvAddr: 127.0.0.1:9876

2.配置生产者
@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。
(1)引进配置文件中生产者组名和NameServeAddr端口号

    /**
     * 生产者的组名
     */
    @Value("${producerGroup}")
    private String producerGroup;

    /**
     * NameServer 地址
     */
    @Value("${namesrvAddr}")
    private String namesrvAddr;

(2)在类中使用引入的生产者组名和NameServerAddr

        //生产者的组名
        DefaultMQProducer producer = new DefaultMQProducer(producerGroup);

        //指定NameServer地址,多个地址以 ; 隔开
        producer.setNamesrvAddr(namesrvAddr);

(3)初始化生产者对象,创建一个消息实例

            /**
             * Producer对象在使用之前必须要调用start初始化,初始化一次即可
             * 注意:切记不可以在每次发送消息时,都调用start方法
             */
            producer.start();

            //创建一个消息实例,包含 topic、tag 和 消息体
            //如下:topic 为 "TopicTest",tag 为 "push"
            Message message = new Message("TopicTest", "push", "发送消息----zhisheng-----".getBytes());

(4)发送消息

SendResult result = producer.send(message,new MessageQueueSelector() {

	@Override
	 public MessageQueue select(List mqs, Message msg, Object arg) {
	         Integer id = (Integer) arg;
	         int index = id % mqs.size();
	         return mqs.get(index);
      }
},1);
 System.out.println("发送响应:MsgId:" + result.getMsgId() + ",发送状态:" + result.getSendStatus());

3.配置消费者
(1).引入配置文件中消费者的组名和NameServerAddr端口号

    /**
     * 消费者的组名
     */
    @Value("${PusbConsumer}")
    private String consumerGroup;

    /**
     * NameServer 地址
     */
    @Value("${namesrvAddr}")
    private String namesrvAddr;

(2).设置消费者组名和NameServerAddr地址

        //消费者的组名
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);

        //指定NameServer地址,多个地址以 ; 隔开
        consumer.setNamesrvAddr(namesrvAddr);

(3).消费者消费

       try {
            //订阅PushTopic下Tag为push的消息
            consumer.subscribe("TopicTest", "push");

            //设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费
            //如果非第一次启动,那么按照上次消费的位置继续消费
            consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {//->为Java8的lambda表达式,就是匿名函数,具体可以参考该文章https://segmentfault.com/q/1010000007518474。
                try {
                    for (MessageExt messageExt : list) {
                        System.out.println("messageExt: " + messageExt);//输出消息内容
                        String messageBody = new String(messageExt.getBody());
                        System.out.println("消费响应:msgId : " + messageExt.getMsgId() + ",  msgBody : " + messageBody);//输出消息内容
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER; //稍后再试
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; //消费成功
            });
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

4.编写controller调用生产者(消费者上可加@PostConstruct来自动执行)

package com.example.demo.rocketmq;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController//使用该注解后不用再在每个requestmapping后加reponsedbody注解
public class TestController {
    //生成生产者
    @Autowired
    RocketMQProvider rocketMQProvider;
    //生成消费者
    @Autowired
    RocketMQConsumer rocketMQConsumer;
    @RequestMapping("/testMQ")
    public String testMq() {
        rocketMQProvider.defaultMQProducer();
//        rocketMQConsumer.defaultMQPushConsumer();
        return null;
    }
}

你可能感兴趣的:(SpringBoot整合rocketMQ)