RocketMQ 消息过滤——Message Filter

RocketMQ 消息过滤——Message Filter

参考https://my.oschina.net/xinxingegeya/blog/900162依次启动 namesrv,broker,最后启动filtersrv。

如下启动顺序,

➜  apache-rocketmq git:(master) nohup sh bin/mqnamesrv &
[1] 13196
appending output to nohup.out
➜  apache-rocketmq git:(master) nohup sh bin/mqbroker -n localhost:9876 &
[2] 13213
appending output to nohup.out
➜  apache-rocketmq git:(master) nohup sh bin/mqfiltersrv -n localhost:9876 &
[3] 13261
appending output to nohup.out

需要注意的是启动 filtersrv 时,要指定namesrv的地址。

 

通过 filtersrv 实现消息的过滤

Producer.java

package com.rocketmq.demo.filter;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

/**
 * Created by xinxingegeya on 2017/6/15.
 */
public class Producer {

    public static void main(String[] args) throws MQClientException, InterruptedException {

        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name_filter");
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();

        for (int i = 0; i < 1000; i++) {
            try {
                Message msg = new Message("FilterTopicTest",// topic
                        "TagA",// tag
                        "OrderID001",//key
                        ("Hello RocketMQ " + i).getBytes()// body
                );
                msg.putUserProperty("SequenceId", String.valueOf(i));
                SendResult sendResult = producer.send(msg);
                System.out.println(sendResult);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        producer.shutdown();
    }

}

Consumer.java

package com.rocketmq.demo.filter;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.MixAll;
import org.apache.rocketmq.common.message.MessageExt;

import java.io.IOException;
import java.util.List;

/**
 * Created by xinxingegeya on 2017/6/15.
 */
public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException, IOException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_filter_unique_group_name");
        consumer.setNamesrvAddr("127.0.0.1:9876");
        // 使用Java代码,在服务器做消息过滤
        String filterCode = MixAll.file2String("/Users/xinxingegeya/workspace-gitosc/showcase/rocketmq/src/main/java/com/rocketmq/demo/filter/MessageFilterImpl.java");
        consumer.subscribe("FilterTopicTest", "com.rocketmq.demo.filter.MessageFilterImpl", filterCode);
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        /**
         * Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
         */
        consumer.start();
        System.out.println("Consumer Started.");
    }

}

MessageFilterImpl.java

package com.rocketmq.demo.filter;

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 {
    @Override
    public boolean match(MessageExt msg, FilterContext context) {
        String property = msg.getProperty("SequenceId");
        if (property != null) {
            int id = Integer.parseInt(property);
            if (((id % 10) == 0) && (id > 100)) {
                return true;
            }
        }

        return false;
    }
}

filtersrv 原理请参考:https://my.oschina.net/bieber/blog/492988

===========END===========

转载于:https://my.oschina.net/xinxingegeya/blog/967634

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值