一、批量发送消息

  即多条消息放入List,一次发送,从而减少网络传输,提高效率

  1. DefaultMQProducer producer = new DefaultMQProducer("batch_send_producer_group");
  2. producer.setNamesrvAddr("127.0.0.1:9876");
  3. producer.start();
  4.  
  5. String topic = "batchTopic";
  6. List<Message> messageList = new ArrayList<>();
  7.  
  8. for (int i = 0; i < 10; i++) {
  9. Message msg = new Message(topic,"TAG1","ORDER" + i, "Hello world".getBytes());
  10. messageList.add(msg);
  11. }
  12. try{
  13. producer.send(messageList);
  14. }catch (Exception e){
  15. e.printStackTrace();
  16. }
  17.  
  18. producer.shutdown();

二、消息发送队列自主选择

例:可以将同一订单(不同操作,例如下单、付款、出库、订单完成等操作)发送到同一个queue中,来保证一个订单不同操作的顺序性

  1. DefaultMQProducer producer = new DefaultMQProducer("select_queue_producer_group");
    producer.setNamesrvAddr("127.0.0.1:9876");
    producer.start();
  2.  
  3. String topic = "selectQueueTopic";
  4.  
  5. String[] tags = new String[]{"TAG","TAG2","TAG3","TAG4","TAG5"};
  6.  
  7. 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);
  8.  
  9. 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);
    }
  10.  
  11. }catch (Exception e){
    e.printStackTrace();
    }
  12.  
  13. producer.shutdown();

输入如下:

可以看到订单ID为41的消息,全部发送到queueId为1的队列中,订单ID为42的消息,全部发送到QueueId为2的队列中

三、订单过滤

1、TAG模式过滤(多个tag使用 || 区分)

  1. DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
  2. producer.setNamesrvAddr("127.0.0.1:9876");
  3.  
  4. producer.setNamesrvAddr("127.0.0.1:9876");
  5. producer.start();
  6.  
  7. String topic = "TagFilterTopic1";
  8. String tagA = "TagA";
  9. String tagB = "TagB";
  10. for (int i = ; i < ; i++) {
  11. try {
  12. Message msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  13. SendResult sendResult = producer.send(msg);
  14.  
  15. msg = new Message(topic,tagB,("tagA==========22222222222").getBytes(RemotingHelper.DEFAULT_CHARSET));
  16. sendResult = producer.send(msg);
  17. System.out.printf("%s%n", sendResult);
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. Thread.sleep();
  21. }
  22. }
  23. producer.shutdown();

消息消费

  1. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("tagFileterConcumer");
  2.  
  3. consumer.setNamesrvAddr("127.0.0.1:9876");
  4. consumer.setConsumerGroup("tagFileterConcumerGroup");
  5. consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  6. consumer.subscribe("TagFilterTopic1", "TagA");
  7. consumer.registerMessageListener(new MessageListenerConcurrently() {
  8. @Override
  9. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  10. ConsumeConcurrentlyContext context) {
  11. System.out.printf("%s TagA Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  12. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  13. }
  14. });
  15. consumer.start();
  16.  
  17. System.out.printf("Consumer Started.%n");
  18.  
  19. DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("tagFileterConcumer1");
  20.  
  21. consumer1.setNamesrvAddr("127.0.0.1:9876");
  22. consumer1.setConsumerGroup("tagFileterConcumerGroup1");
  23. consumer1.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  24. consumer1.subscribe("TagFilterTopic1", "TagA || TagB");
  25. consumer1.registerMessageListener(new MessageListenerConcurrently() {
  26. @Override
  27. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  28. ConsumeConcurrentlyContext context) {
  29. System.out.printf("%s TagA&TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  30. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  31. }
  32. });
  33. consumer1.start();
  34. System.out.printf("Consumer Started.%n");
  35.  
  36. DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("tagFileterConcumer2");
  37.  
  38. consumer2.setNamesrvAddr("127.0.0.1:9876");
  39. consumer2.setConsumerGroup("tagFileterConcumerGroup2");
  40. consumer2.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  41. consumer2.subscribe("TagFilterTopic1", "TagB");
  42. consumer2.registerMessageListener(new MessageListenerConcurrently() {
  43. @Override
  44. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  45. ConsumeConcurrentlyContext context) {
  46. System.out.printf("%s TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  47. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  48. }
  49. });
  50. consumer2.start();
  51. System.out.printf("Consumer Started.%n");

执行结果:可以看到只需要TagA的消费者,只输出了一条消息;只需要TagB的消费者,也只输出了一条消息

2、SQL过滤

需要开启支持sql92:在broker.conf文件中添加如下配置:enablePropertyFilter=true

发送者:

  1. DefaultMQProducer producer = new DefaultMQProducer("sql_filter_group_name");
  2. producer.setNamesrvAddr("127.0.0.1:9876");
  3. producer.start();
  4.  
  5. String topic = "SqlFilterTopic1";
  6. String tagA = "TagA";
  7. for (int i = ; i < ; i++) {
  8. try {
  9. Message msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  10. msg.putUserProperty("orderStatus","");
  11. msg.putUserProperty("userName","lcl");
  12. msg.putUserProperty("orderId","");
  13. SendResult sendResult = producer.send(msg);
  14. System.out.printf("%s%n", sendResult);
  15.  
  16. msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  17. msg.putUserProperty("orderStatus","");
  18. msg.putUserProperty("userName","lcl");
  19. msg.putUserProperty("orderId","");
  20. sendResult = producer.send(msg);
  21. System.out.printf("%s%n", sendResult);
  22.  
  23. msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  24. msg.putUserProperty("orderStatus","");
  25. msg.putUserProperty("userName","mm");
  26. msg.putUserProperty("orderId","");
  27. sendResult = producer.send(msg);
  28. System.out.printf("%s%n", sendResult);
  29.  
  30. msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  31. msg.putUserProperty("orderStatus","");
  32. msg.putUserProperty("userName","lcl");
  33. msg.putUserProperty("orderId","");
  34. sendResult = producer.send(msg);
  35. System.out.printf("%s%n", sendResult);
  36.  
  37. msg = new Message(topic,tagA,("tagA==========11111111111").getBytes(RemotingHelper.DEFAULT_CHARSET));
  38. msg.putUserProperty("orderStatus","");
  39. msg.putUserProperty("userName","lcl");
  40. msg.putUserProperty("orderId","");
  41. sendResult = producer.send(msg);
  42. System.out.printf("%s%n", sendResult);
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. Thread.sleep();
  46. }
  47. }
  48. producer.shutdown();

消费者:

  1. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("sqlFileterConcumer");
  2.  
  3. consumer.setNamesrvAddr("127.0.0.1:9876");
  4. consumer.setConsumerGroup("tagFileterConcumerGroup");
  5. consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  6. consumer.subscribe("SqlFilterTopic1", MessageSelector.bySql("(orderStatus = '1' and userName = 'lcl' and orderId > 0)"));
  7. consumer.registerMessageListener(new MessageListenerConcurrently() {
  8. @Override
  9. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  10. ConsumeConcurrentlyContext context) {
  11. System.out.printf("%s TagA Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  12. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  13. }
  14. });
  15. consumer.start();
  16.  
  17. System.out.printf("Consumer Started.%n");
  18.  
  19. DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("tagFileterConcumer1");
  20.  
  21. consumer1.setNamesrvAddr("127.0.0.1:9876");
  22. consumer1.setConsumerGroup("tagFileterConcumerGroup1");
  23. consumer1.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  24. consumer1.subscribe("TagFilterTopic1", "TagA || TagB");
  25. consumer1.registerMessageListener(new MessageListenerConcurrently() {
  26. @Override
  27. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  28. ConsumeConcurrentlyContext context) {
  29. System.out.printf("%s TagA&TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  30. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  31. }
  32. });
  33. consumer1.start();
  34. System.out.printf("Consumer Started.%n");
  35.  
  36. DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("tagFileterConcumer2");
  37.  
  38. consumer2.setNamesrvAddr("127.0.0.1:9876");
  39. consumer2.setConsumerGroup("tagFileterConcumerGroup2");
  40. consumer2.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
  41. consumer2.subscribe("TagFilterTopic1", "TagB");
  42. consumer2.registerMessageListener(new MessageListenerConcurrently() {
  43. @Override
  44. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  45. ConsumeConcurrentlyContext context) {
  46. System.out.printf("%s TagB Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
  47. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  48. }
  49. });
  50. consumer2.start();
  51. System.out.printf("Consumer Started.%n");

消费者输出结果:

3、类过滤模式

深入理解RocketMQ(九)---实战(代码)的更多相关文章

  1. 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

    1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...

  2. DOM基础操作实战代码

    对于已经讲解给大家的DOM实战,我今天给大家几个实战代码,可以让大家加深对此的理解! 1.用DOM动态生成这样一个结构: <div class=”example”> <p class ...

  3. 深入理解RocketMQ的消费者组、队列、Broker,Topic

    1.遇到的问题:上测试环境,上次描述的鸟问题又出现了,就是生产者发3条数据,我这边只能收到1条数据. 2.问题解决: (1)去控制台看我的消费者启动情况,貌似没什么问题 , (2)去测试服务器里看日志 ...

  4. HtmlAgilityPack实战代码

    C#采集代理服务器ip并设置IE代理--HtmlAgilityPack实战代码 今天在博客园看到一篇文章,说是C#采集某某的数据,其实做采集小软件很久了, 用的最好的还是HtmlAgilityPack ...

  5. SpringCloud---熔断降级理解、Hystrix实战(五)

    SpringCloud---熔断降级理解.Hystrix实战(五) https://www.cnblogs.com/qdhxhz/p/9581440.html https://blog.csdn.ne ...

  6. SpringCloud(6)---熔断降级理解、Hystrix实战

    SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...

  7. dubbo项目实战代码展示

    最近公司项目使用dubbo服务,于是就去网上搜索关于dubbo的相关资料,真的很多,但是对于很多人并不是很了解框架或者 不是太适合新手的片段代码,于是我就根据项目的相关内容把dubbo部分单独切出来, ...

  8. EM算法理解的九层境界

    EM算法理解的九层境界 EM 就是 E + M EM 是一种局部下限构造 K-Means是一种Hard EM算法 从EM 到 广义EM 广义EM的一个特例是VBEM 广义EM的另一个特例是WS算法 广 ...

  9. Magenta Demos Magenta 实战代码

    Magenta 实战代码 这个仓库包含了很多 Magenta 模型的实现.看 Magenta 库以及模型,看我们的主仓库:https://github.com/tensorflow/magenta A ...

  10. 创建HttpFilter与理解多个Filter代码的执行顺序

    1.自定义的HttpFilter,实现Filter接口 HttpFilter package com.aff.filter; import java.io.IOException; import ja ...

随机推荐

  1. SPA页面

    背景: 单页 Web 应用 (single-page application 简称为 SPA) 是一种特殊的 Web 应用,它将所有的活动均局限于一个Web页面中:这就表示Web应用被加载出来之后,W ...

  2. Java并发编程 (八) J.U.C组件拓展

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.J.U.C-FutureTask-1 FutureTask组件,该组件是JUC中的.但该组件不是 A ...

  3. PELT(Per-Entity Load Tracking)

    引言 对于Linux内核而言,做一款好的进程调度器是一项非常具有挑战性的任务,主要原因是在进行CPU资源分配的时候必须满足如下的需求: 1.它必须是公平的 2.快速响应 3.系统的throughput ...

  4. java实现放麦子问题

    /* 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子, 在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子, 在第 ...

  5. PAT 旧键盘

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 行中分别给出应该输入的文字.以及 ...

  6. 两种方法设置MMDVM静态组

    方法一.进入BM页面设置静态组 1.仪表盘配置页面点击下图所示进入BM 2.或是点击链接进入https://brandmeister.network 3..进入页面后点击My hotspots,显示你 ...

  7. 第12章 Java内存模型与线程

    参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作  流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...

  8. mysqldump导出数据库

    问题描述:要将一个mysql中六个数据库导出来,使用mysqldump导出 mysqldump使用语法:mysqldump -uroot -p -S /data/mysql/db_itax_m/mys ...

  9. [原创][开源] SunnyUI.Net 国际化

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  10. 查询局域网指定段内存活IP

    目录 批量ping 输出到指定文件 批量ping for /L %i IN (起始,扫描间距,结束) DO ping -w 2 -n 1 10.224.131.%i 如 for /L %i IN (5 ...