我这里是使用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;
}
}