前言
上篇内容介绍了RocketMQ的基础知识和单机启动方式,同时也也简单介绍了监控仪表盘RocketMQ Dashboard,这次主要介绍java中如何接入RocketMQ的。由于SpringBoot提供的Starter集成度太高,屏蔽了大量细节,不建议上来直接学习,我们先通过RocketMQ-Client整合,了解基本使用方法,后期再学习SpringBoot的整合。
RocketMQ整合
1.首先先导入rocketmq-client包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.4</version>
</dependency>
2.编写生产者代码
import com.alibaba.fastjson.JSONObject;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
public class Producer {
public static void producer() {
//创建DefaultMQProducer消息生产者对象
DefaultMQProducer producer = new DefaultMQProducer("TestProducerGroup");
//设置NameServer 多个节点间用分号分割
producer.setNamesrvAddr("192.168.2.5:9876");
try {
//与NameServer建立长连接
producer.start();
//发送一百条数据
for (int i = 1; i <= 100; i++) {
//1S中发送一次
Thread.sleep(1000);
JSONObject json = new JSONObject();
json.put("orderId",i+1);
json.put("desc","这是第"+i+1+"个订单");
//数据正文
String data = json.toJSONString();
/*创建消息
Message消息三个参数
topic 代表消息主题,自定义自定义TopicOrder代表订单主题代表订单主题
tags 代表标志,用于消费者接收数据时进行数据筛选。PAY_TAG代表支付相关信息
body 代表消息内容
*/
Message message = new Message("TopicOrder", "PAY_TAG", data.getBytes());
//发送消息,获取发送结果
SendResult result = producer.send(message);
//将发送结果对象打印在控制台
System.out.println("消息已发送:MsgId:" + result.getMsgId() + ",发送状态:"
+ result.getSendStatus());
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
producer.shutdown();
} catch (Exception e) {
}
}
}
public static void main(String[] args) {
Producer.producer();;
}
}
执行之后,可以看到如下信息
3.编写消费者代码
MQ的消费模式可以大致分为两种,一种是推Push,一种是拉Pull。
-
Push是服务端主动推送消息给客户端,优点是及时性较好,但如果客户端没有做好流控,一旦服务端推送大量消息到客户端时,就会导致客户端消息堆积甚至崩溃。
-
Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。
Apache RocketMQ既提供了Push模式也提供了Pull模式。
(1)push推送模式
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.message.MessageExt;
import java.util.List;
public class PushConsumer {
public static void consumer() {
//创建消费者对象
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TestConsumerGroup");
try {
//设置NameServer节点
consumer.setNamesrvAddr("192.168.2.5:9876");
/*订阅主题,
consumer.subscribe包含两个参数:
topic: 说明消费者从Broker订阅哪一个主题,这一项要与Provider保持一致。
subExpression: 子表达式用于筛选tags。
同一个主题下可以包含很多不同的tags,subExpression用于筛选符合条件的tags进行接收。
例如:设置为*,则代表接收所有tags数据。
例如:设置为PAY_TAG,则Broker中只有tags=PAY_TAG的消息会被接收,而其他的就会被排除在外。
*/
consumer.subscribe("TopicOrder", "*");
//创建监听,当有新的消息监听程序会及时捕捉并加以处理。
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
//批量数据处理
for (MessageExt msg : msgs) {
System.out.println("消费者获取数据:" + msg.getMsgId() + "==>" + new
String(msg.getBody()));
}
//返回数据已接收标识
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//启动消费者,与Broker建立长连接,开始监听。
consumer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
PushConsumer.consumer();
}
}
(2)pull拉取模式
import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
public class PullConsumer {
public static volatile boolean running = true;
public static void consumer() {
//创建pull消费者对象
DefaultLitePullConsumer litePullConsumer = new DefaultLitePullConsumer("TestPullConsumerGroup");
//设置NameServer节点
litePullConsumer.setNamesrvAddr("192.168.2.5:9876");
try {
//订阅主题,与Push相同
litePullConsumer.subscribe("TopicOrder", "*");
//每次拉取数据条目数
litePullConsumer.setPullBatchSize(10);
//启动消费者
litePullConsumer.start();
while (running) {
List<MessageExt> messageExts = litePullConsumer.poll();
//批量数据处理
for (MessageExt msg : messageExts) {
System.out.println("消费者获取数据:" + msg.getMsgId() + "==>" + new
String(msg.getBody()));
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
litePullConsumer.shutdown();
}
}
public static void main(String[] args) {
PullConsumer.consumer();
}
}
两种方式大家都可以试一下,结果如下:
总结
这篇主要介绍的是RocketMQ最基础的使用方式,目的在于让大家能更好的理解运行的方式,后面的章节,我们会慢慢的深入学习。
接下来将详细的介绍生产者的相关知识
关注我,不迷路