前面我们已经安装好了 RocketMQ,现在就开始测试下相关的操作,安装的链接看这里.。
消息处理分析
消息发送者步骤分析
1. 创建消息生产者 producer,并指定生产者组名
2. 指定 Nameserver 地址
3. 启动 producer
4. 创建消息对象,指定主题 Topic、Tag和消息体
5. 发送消息
6. 关闭生产者 producer
消息消费者步骤分析
1.创建消费者 Consumer,指定消费者组名
2.指定 Nameserver 地址
3.订阅主题 Topic和 Tag
4.设置回调函数,处理消息
5.启动消费者 consumer
消息生命周期
普通消息生命周期
-
初始化:消息被生产者构建并完成初始化,待发送到服务端的状态。
-
待消费:消息被发送到服务端,对消费者可见,等待消费者消费的状态。
-
消费中:消息被消费者获取,并按照消费者本地的业务逻辑进行处理的过程。 此时服务端会等待消费者完成消费并提交消费结果,如果一定时间后没有收到消费者的响应,Apache RocketMQ会对消息进行重试处理。具体信息,请参见消费重试。
-
消费提交:消费者完成消费处理,并向服务端提交消费结果,服务端标记当前消息已经被处理(包括消费成功和失败)。 Apache RocketMQ默认支持保留所有消息,此时消息数据并不会立即被删除,只是逻辑标记已消费。消息在保存时间到期或存储空间不足被删除前,消费者仍然可以回溯消息重新消费。
-
消息删除:Apache RocketMQ按照消息保存机制滚动清理最早的消息数据,将消息从物理文件中删除。更多信息,请参见消息存储和清理机制。
消息发送
发送同步消息
这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知
public class SyncProducer {
public static void main(String[] args) throws Exception {
// 实例化消息生产者Producer
DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
// 设置NameServer的地址
producer.setNamesrvAddr("192.168.152.130:9876");
// 启动Producer实例
producer.start();
for (int i = 0; i < 100; i++) {
// 创建消息,并指定Topic,Tag和消息体
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
// 发送消息到一个Broker
SendResult sendResult = producer.send(msg);
// 通过sendResult返回消息是否成功送达
System.out.printf("%s%n", sendResult);
}
// 如果不再发送消息,关闭Producer实例。
producer.shutdown();
}
}
发送异步消息
异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。
public class AsyncProducer {
public static void main(String[] args) throws Exception {
// 1:实例化消息生产者 Producer, 指定生产组名称
DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
// 2:设置NameServer的地址
producer.setNamesrvAddr("192.168.152.130:9876");
// 3:启动Producer实例
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0);
for (int i = 0; i < 10; i++) {
// 4:创建消息,并指定 Topic,Tag 和 消息体
/*
参数一: 消息主题
参数二: 消息 tag
参数三: 消息内容
*/
Message msg = new Message("TopicTest", "TagB", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 5:发送消息到一个Broker
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送结果:" + sendResult);
}
@Override
public void onException(Throwable throwable) {
System.out.println("发送异常:" + throwable.getMessage());
}
});
TimeUnit.SECONDS.sleep(1);
}
// 6:如果不再发送消息,关闭Producer实例。
// producer.shutdown();
}
}
发送单向消息
这种方式主要用在不特别关心发送结果的场景,例如日志发送。
public class OneWayProducer {
public static void main(String[] args) throws Exception {
// 1:实例化消息生产者 Producer, 指定生产组名称
DefaultMQProducer producer = new DefaultMQProducer("produceGroup");
// 2:设置NameServer的地址
producer.setNamesrvAddr("192.168.152.130:9876");
// 3:启动Producer实例
producer.start();
for (int i = 0; i < 10; i++) {
// 4:创建消息,并指定 Topic,Tag 和 消息体
/*
参数一: 消息主题
参数二: 消息 tag
参数三: 消息内容
*/
Message msg = new Message("TopicTest", "TagC", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 5:发送单向消息,没有任何返回结果
producer.sendOneway(msg);
}
// 6:如果不再发送消息,关闭Producer实例。
producer.shutdown();
}
}
消息消费
public class Consumer {
public static void main(String[] args) throws Exception {
// 1. 创建消费者,指定消费者组名
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("produceGroup");
// 2. 指定 NameSever 地址
consumer.setNamesrvAddr("192.168.152.130:9876");
// 3. 订阅主题 Topic 和 tag
consumer.subscribe("TopicTest", "TagB");
// 4. 设置回调函数,处理消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
// System.out.println(list);
list.forEach( messageExt -> System.out.println(new String(messageExt.getBody())));
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 启动消费者
consumer.start();
}
}