rocketmq消息隊列整合boot框架
一、步驟
1、啓動rocketmq namesrv + broker
具體安裝與啓動可以參考上一篇博客:https://blog.csdn.net/weixin_42083036/article/details/103694840
2、導入依賴
<!-- RocketMq客戶端相關依賴 -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.6.0</version>
</dependency>
注意:你安裝的rocketmq 的版本是多少 pom對應的版本號就應該是多少
3、配置文件
# 消費者的組名
apache.rocketmq.consumer.PushConsumer=PayConsumer
# 生產者的組名
apache.rocketmq.producer.producerGroup=PayProducer
# NameServer地址
#集羣地址
#apache.rocketmq.namesrvAddr=47.97.188.94:9876;47.97.188.95:9876;47.97.188.96:9876
apache.rocketmq.namesrvAddr=127.0.0.1:9876
配置類
public class JmsConfig {
/**
* NameServer 地址
*/
public final static String NAME_SERVER = "47.97.188.93:9876";
/**
* topic
*/
public static final String TOPIC = "xdclass_pay_test_topic2";
}
消息生成者
@Component
public class PayProducer {
/**
* 生產者的組名
*/
private String producerGroup="PayProducer";
private DefaultMQProducer producer;
/**
* 構造方法初始化
* 注:構造方法先於變量初始化所以全局變量賦值無法注入
* 類似 @Value是無法注入到構造方法參數裏面的
*/
public PayProducer(){
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(JmsConfig.NAME_SERVER);
start();
}
public DefaultMQProducer getProducer(){
return this.producer;
}
/**
* 一般應用在上下文,使用上下文監聽
*/
public void shutdowm(){
this.producer.shutdown();
}
/**
* Producer對象在使用之前必須要調用start初始化,初始化一次即可
* 注意:切記不可以在每次發送消息時,都調用start方法
*/
public void start(){
try {
this.producer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
public SendResult send(String topic,String tag,String text) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
Message message = new Message(topic,tag,text.getBytes());
SendResult sendResult = producer.send(message);
shutdowm();
return sendResult;
}
public SendResult sendMessage(Message message) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
SendResult sendResult = producer.send(message);
shutdowm();
return sendResult;
}
}
消息消費者
@Component
public class Consumer {
/**
* 消費者的組名
*/
private String consumerGroup="PayConsumer";
private DefaultMQPushConsumer consumer;
public Consumer() throws MQClientException {
consumer = new DefaultMQPushConsumer(consumerGroup);
consumer.setNamesrvAddr(JmsConfig.NAME_SERVER);
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
consumer.subscribe(JmsConfig.TOPIC, "*");
consumer.registerMessageListener((MessageListenerConcurrently) (msgs, context) -> {
try {
Message msg = msgs.get(0);
System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody()));
String topic = msg.getTopic();
String body = new String(msg.getBody(), "utf-8");
String tags = msg.getTags();
String keys = msg.getKeys();
System.out.println("topic=" + topic + ", tags=" + tags + ", keys=" + keys + ", msg=" + body);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
});
consumer.start();
System.out.println("consumer start ...");
}
}
測試類
@RestController
@RequestMapping("/")
public class TestSendMsg {
@Autowired
private PayProducer payProducer;
@RequestMapping("send")
public String send(String text) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
Message message = new Message(JmsConfig.TOPIC,"taga", ("hello xdclass rocketmq = "+text).getBytes() );
//SendResult sendResult = payProducer.sendMessage(message);
SendResult sendResult = payProducer.getProducer().send(message);
System.out.println(sendResult);
return "success";
}
}