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===========