• 深入理解RocketMQ(九)---实战(代码)


    一、批量发送消息

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

    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、类过滤模式

  • 相关阅读:
    python基础学习8(浅拷贝与深拷贝)
    适配器模式(Adapter)
    NHibernate的调试技巧和Log4Net配置
    查看表字段的相关的系统信息
    Asp.net MVC 3 开发一个简单的企业网站系统
    ie8 自动设置 兼容性 代码
    同时安装vs2010和VS2012后IEnumerable<ModelClientValidationRule>编译错误
    各种合同样本
    使用远程桌面的朋友可能经常会遇到“超出最大允许连接数”的问题,
    弹出窗口全屏显示:window.showModalDialog与window.open全屏显示
  • 原文地址:https://www.cnblogs.com/liconglong/p/12907343.html
Copyright © 2020-2023  润新知