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";
}
}