(假定你的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;
}
}