RocketMQ过滤器demo实现--李波RocketMQ学习

(假定你的RocketMQ已经配置成功,控制台也加上了,并且运行成功,之后考虑过滤器的学习吧,因为前面也有很多坑)
RocketMQ版本为4.2.0
java代码部分,参考的白鹤翔老师的博文,改动不大。
https://www.cnblogs.com/baihexiang/articles/5307073.html

配置方面,白老师文章中说

我们需要在broker-*.properties文件里添加一句话,如下:
filterServerNums=1

但是我的D:\rocketmq-all-4.2.0\conf目录下并没有找到broker-*.properties这个文件。
解决办法:在config目录下自己建一个broker.properties文件,在broker启动时,指定加载该文件。
这里写图片描述
文件内容如下:

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
filterServerNums=1(主要多了这一句)

到D:\rocketmq-all-4.2.0\bin目录下cmd启动黑窗口,依次启动nameserv、broker、filter
,注意:
(1)启动broker和filter时都要指定ip和端口号
(2)启动broker时加载自己添加的broker.properties文件

start mqnamesrv.cmd
start mqbroker.cmd  -c ../conf/broker.properties -n 127.0.0.1:9876 autoCreateTopicEnable=true
start mqfiltersrv.cmd -n 127.0.0.1:9876

RocketMQ都起来了,运行producer和consumer就好。另外注意过滤器要实现MessageFilter接口,一次我就忘了实现接口,对了半天代码,哪都没错啊,怎么就是不输出?原来没有实现过滤器接口。

我的producer

public static void main(String[] args) throws RemotingException, MQBrokerException, InterruptedException, UnsupportedEncodingException {
        //01new一个默认的message queue 生产者,一定要给它一个名字
        DefaultMQProducer producer = new DefaultMQProducer("libo-1");
        //02给这个生产者设置注册的地址,本地的9876port
        producer.setNamesrvAddr("localhost:9876");
        //03启动producer,启动不代表发送了消息
        try {
            producer.start();
            for(int i=0;i<100;i++) {
                //04准备要发送的Message,指定主题,标签,和消息
                Message msg = new Message("topic3", "TagA", ("李波"+i).getBytes("utf-8"));
                //05设置SwquenceId,用于过滤消息
                msg.putUserProperty("SequenceId", String.valueOf(i));
                //06因为发完消息后是需要有回馈的,发送结果(顾名思义)
                SendResult sendResult = producer.send(msg);
                System.out.println(msg);
            }
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        //06关闭producer
        producer.shutdown();

    }

我的consumer

public static void main(String[] args) throws MQClientException, IOException {
        //01new 一个默认的消息消费者push的
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("xiao");
        //02注册
        consumer.setNamesrvAddr("localhost:9876");
        //03打印过滤器文件
        String filterCode = MixAll.file2String("这里写你的过滤器实现类的全路径
        名,比如D:\\tts9\\workspace\\RocketMQTest\\src\\main\\java\\
        exercise1\\filter\\MessageFilterImpl.java");
        System.out.println(filterCode);
        //04订阅,将过滤器代码传给第三个参数,第二个参数为过滤器类的包名点类名
        consumer.subscribe("topic66","exercise1.filter.MessageFilterImpl",filterCode);
        //05从哪里开始取消息
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        //06消费者注册监听器
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, 
                    ConsumeConcurrentlyContext context) {
                try {
                    String str = new String(msgs.get(0).getBody(),"utf-8");
                    System.out.println(str);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //07启动消费者
        consumer.start();
        System.out.println("consumer started .. ");
    }

过滤器实现类

package exercise1.libotest;

import org.apache.rocketmq.common.filter.FilterContext;
import org.apache.rocketmq.common.filter.MessageFilter;
import org.apache.rocketmq.common.message.MessageExt;

public class MessageFilterImpl implements MessageFilter{//注意实现过滤器接口

    public boolean match(MessageExt msg, FilterContext arg1) {
         // NO Chinese
        System.out.println("-------------");
        String property = msg.getUserProperty("SequenceId");
        System.out.println("---------" + property);
        if (property != null) {
            int id = Integer.parseInt(property);
            if((id % 2) == 0) {
            //if ((id % 3) == 0 && (id > 10)) {
                return true;
            }
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38537747/article/details/82110033