1 定时消息
在/bin目录下执行以下命令,创建定时主题:
sh mqadmin updateTopic -c DefaultCluster -t DelayTopic001 -o true -n 127.0.0.1:9876 -a +message.type=DELAY
1.1 发送同步、异步定时消息
public class DelayMessageTest {
private static final String TOPIC_DELAY = "DelayTopic001";
private static final String TAG = "TAG01";
public static void main(String[] args) throws ClientException {
//加载服务
final ClientServiceProvider provider= ClientServiceProvider.loadService();
//创建producer
Producer producer = ProducerSingleton.getInstance(TOPIC_DELAY);
//发送 同步定时消息
//sendDelayMessage(provider,producer) ;
//发送异步定时消息
sentDelayMessageAsync(provider,producer);
}
public static void sendDelayMessage(ClientServiceProvider provider,Producer producer){
for (int i = 0; i < 20; i++) {
//消息体
byte[] messageBody = ("孔乙己"+i).getBytes(StandardCharsets.UTF_8);
//设置消息延迟时间-3秒钟
Duration messageDelayTimes = Duration.ofSeconds(3);
//设置消息属性
Message message = provider.newMessageBuilder()
.setTag(TAG)
.setTopic(TOPIC_DELAY)
//设置唯一索引键
.setKeys("001")
.setBody(messageBody)
.setDeliveryTimestamp(System.currentTimeMillis() + messageDelayTimes.toMillis())
.build();
try {
SendReceipt sendReceipt = producer.send(message);
log.info("发送定时消息成功,messageId = {}" ,sendReceipt.getMessageId());
}catch (Throwable t){
log.error("发送定时消息失败",t);
}
}
}
//发送异步定时消息
public static void sentDelayMessageAsync(ClientServiceProvider provider,Producer producer){
for (int i = 0; i < 20; i++) {
//消息体
byte[] messageBody = ("孔乙己"+i).getBytes(StandardCharsets.UTF_8);
Duration messageDelayTimes = Duration.ofSeconds(3);
//设置消息属性
Message message = provider.newMessageBuilder()
.setTag(TAG)
.setTopic(TOPIC_DELAY)
//设置唯一索引键
.setKeys("001")
.setBody(messageBody)
.setDeliveryTimestamp(System.currentTimeMillis() + messageDelayTimes.toMillis())
.build();
CompletableFuture<SendReceipt> future = producer.sendAsync(message);
ExecutorService threadPool = Executors.newFixedThreadPool(6);
future.whenCompleteAsync((sendReceipt,throwable) ->{
if(null != throwable){
log.info("消息发送失败");
}
log.info("消息发送成功,messageId = {}", sendReceipt.getMessageId());
},threadPool);
}
}
}
1.2 分别使用SimpleConsumer和PushConsumer消费定时消息
package com.jay.demo01;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.consumer.*;
import org.apache.rocketmq.client.apis.message.MessageId;
import org.apache.rocketmq.client.apis.message.MessageView;
import org.apache.rocketmq.shaded.com.google.errorprone.annotations.Var;
import java.io.IOException;
import java.time.Duration;
import java.util.Collections;
import java.util.List;
@Slf4j
public class PushConsumerAndSimpleConsumerTest {
//接入点
private static final String ENDPOINT = "x.x.x.x:8081";
//普通消息消费者组名
private static final String GROUPNAME = "groupName01";
private static final String DEYALGROUPNAME = "delayGroupName001";
//Tag标签
private static final String TAG = "TAG01";
//普通主题
private static final String TOPIC = "topic001";
private static final String TOPIC_DELAY = "DelayTopic001";
//定时消息主题
public static void main(String[] args) throws ClientException, IOException, InterruptedException {
final ClientServiceProvider provider = ClientServiceProvider.loadService();
//测试PushConsumer
//testPushConsumer(provider);
//测试SimpleConsumer
testSimpleConsumer(provider);
}
public static void testPushConsumer(ClientServiceProvider provider)throws InterruptedException, IOException, ClientException{
//定义ClientConfiguration,设置接入点
ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder()
.setEndpoints(ENDPOINT)
.build();
//定义过滤表达式
FilterExpression filterExpression = new FilterExpression(TAG, FilterExpressionType.TAG);
//定义PushConsumer
log.info("pushConsumer 开始接收信息");
PushConsumer pushConsumer = provider.newPushConsumerBuilder()
//设置配置信息
.setClientConfiguration(clientConfiguration)
//设置消费者组
.setConsumerGro

本文围绕RocketMQ展开,介绍了定时、顺序、事务三种消息的操作。包括分别创建对应主题,发送同步、异步定时和顺序消息,发送同步事务消息,以及使用SimpleConsumer和PushConsumer消费这三种消息。
最低0.47元/天 解锁文章
996

被折叠的 条评论
为什么被折叠?



