深入理解RocketMQ(九)---实战(代码)
一、批量发送消息
即多条消息放入List,一次发送,从而减少网络传输,提高效率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | DefaultMQProducer producer = new DefaultMQProducer( "batch_send_producer_group" ); producer.setNamesrvAddr( "127.0.0.1:9876" ); producer.start(); String topic = "batchTopic" ; List<Message> messageList = new ArrayList<>(); for ( int i = 0; i < 10; i++) { Message msg = new Message(topic, "TAG1" , "ORDER" + i, "Hello world" .getBytes()); messageList.add(msg); } try { producer.send(messageList); } catch (Exception e){ e.printStackTrace(); } producer.shutdown(); |
二、消息发送队列自主选择
例:可以将同一订单(不同操作,例如下单、付款、出库、订单完成等操作)发送到同一个queue中,来保证一个订单不同操作的顺序性
DefaultMQProducer producer = new DefaultMQProducer("select_queue_producer_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
String topic = "selectQueueTopic";
String[] tags = new String[]{"TAG","TAG2","TAG3","TAG4","TAG5"};
int orderId = 41;
int orderId1 = 42;
try{
for (int i = 0; i < 10; i++) {
Message msg = new Message(topic,tags[i%tags.length],"KEY" + i, ("Hello world"+i).getBytes());
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
return mqs.get((Integer) arg % mqs.size());
}
},orderId1);
System.out.println(orderId1 + "=======" + sendResult);
sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
return mqs.get((Integer) arg % mqs.size());
}
},orderId);
System.out.println(orderId + "=======" + sendResult);
}
}catch (Exception e){
e.printStackTrace();
}
producer.shutdown();
输入如下:
可以看到订单ID为41的消息,全部发送到queueId为1的队列中,订单ID为42的消息,全部发送到QueueId为2的队列中
三、订单过滤
1、TAG模式过滤(多个tag使用 || 区分)
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr("127.0.0.1:9876"); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); String topic = "TagFilterTopic1"; String tagA = "TagA"; String tagB = "TagB"; for (int i = 0; i < 10; i++) { try { Message msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); msg = new Message(topic,tagB,("tagA==========22222222222").getBytes(RemotingHelper.DEFAULT_CHARSET)); sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } catch (Exception e) { e.printStackTrace(); Thread.sleep(1000); } } producer.shutdown();
消息消费
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("tagFileterConcumer"); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.setConsumerGroup("tagFileterConcumerGroup"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer.subscribe("TagFilterTopic1", "TagA"); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagA Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); System.out.printf("Consumer Started.%n"); DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("tagFileterConcumer1"); consumer1.setNamesrvAddr("127.0.0.1:9876"); consumer1.setConsumerGroup("tagFileterConcumerGroup1"); consumer1.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer1.subscribe("TagFilterTopic1", "TagA || TagB"); consumer1.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagA&TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer1.start(); System.out.printf("Consumer Started.%n"); DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("tagFileterConcumer2"); consumer2.setNamesrvAddr("127.0.0.1:9876"); consumer2.setConsumerGroup("tagFileterConcumerGroup2"); consumer2.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer2.subscribe("TagFilterTopic1", "TagB"); consumer2.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer2.start(); System.out.printf("Consumer Started.%n");
执行结果:可以看到只需要TagA的消费者,只输出了一条消息;只需要TagB的消费者,也只输出了一条消息
2、SQL过滤
需要开启支持sql92:在broker.conf文件中添加如下配置:enablePropertyFilter=true
发送者:
DefaultMQProducer producer = new DefaultMQProducer("sql_filter_group_name"); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); String topic = "SqlFilterTopic1"; String tagA = "TagA"; for (int i = 0; i < 1; i++) { try { Message msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); msg.putUserProperty("orderStatus","1"); msg.putUserProperty("userName","lcl"); msg.putUserProperty("orderId","654646"); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); msg.putUserProperty("orderStatus","2"); msg.putUserProperty("userName","lcl"); msg.putUserProperty("orderId","654646"); sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); msg.putUserProperty("orderStatus","2"); msg.putUserProperty("userName","mm"); msg.putUserProperty("orderId","654646"); sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); msg.putUserProperty("orderStatus","2"); msg.putUserProperty("userName","lcl"); msg.putUserProperty("orderId","323"); sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET)); msg.putUserProperty("orderStatus","1"); msg.putUserProperty("userName","lcl"); msg.putUserProperty("orderId","68789"); sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } catch (Exception e) { e.printStackTrace(); Thread.sleep(1000); } } producer.shutdown();
消费者:
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("sqlFileterConcumer"); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.setConsumerGroup("tagFileterConcumerGroup"); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer.subscribe("SqlFilterTopic1", MessageSelector.bySql("(orderStatus = '1' and userName = 'lcl' and orderId > 0)")); consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagA Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer.start(); System.out.printf("Consumer Started.%n"); DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("tagFileterConcumer1"); consumer1.setNamesrvAddr("127.0.0.1:9876"); consumer1.setConsumerGroup("tagFileterConcumerGroup1"); consumer1.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer1.subscribe("TagFilterTopic1", "TagA || TagB"); consumer1.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagA&TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer1.start(); System.out.printf("Consumer Started.%n"); DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("tagFileterConcumer2"); consumer2.setNamesrvAddr("127.0.0.1:9876"); consumer2.setConsumerGroup("tagFileterConcumerGroup2"); consumer2.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); consumer2.subscribe("TagFilterTopic1", "TagB"); consumer2.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer2.start(); System.out.printf("Consumer Started.%n");
消费者输出结果:
3、类过滤模式
------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)