RocketMQ入门(Filter)_5
RocketMQ中存储的消息对于消费者来说,并不完全都是他们需要的,因此需要对消息进行过滤。
订阅Topic主题 ,选择Tags都是我们简单的过滤。Topic是大分类,Tags是二级分类。

RocketMQ还有一种过滤机制MessageFilter,是在服务端开启过滤服务器,消费者将指定的java上传后,在服务端过滤。
这种会在很大程度上影响服务器性能,java类要确保简单安全,不占用过多资源。

服务器配置:
要开启FilterServer需要在配置文件(broker)中添加启动filterServer,默认是关闭的。
filterServerNums=
开启的Server数,一个broker可对应多个filterServer,建议一般就1个。
启动前关闭broker,添加完配置,然后启动broker。
再启动filterServer
》nohup sh mqfiltersrv -c /usr/local/program/rocketmq/conf/2m-2s-sync/broker-a.properties &
启动完毕后可使用jps来查看。
程序配置:
Producer端无需任何变化。
Consumer端变化:
先定义一个Filter类,实现MessageFilter接口。
/**
* filter
* attention: don't use the chinese word..
* @author DennyZhao
*
*/
public class FruitMsgFilter implements MessageFilter { @Override
public boolean match(MessageExt msg, FilterContext filterContext) {
String origin = msg.getUserProperty("origin"); //from map
if("mainland".equals(origin)) {
return true;
}
return false;
} }
※ 注意:里面不能有中文,判断内容可随意。
将Filter文件,放入到resource下,防止被编译,无法发送。
1. 增加filter java类写成String.发送给broker。
File file = new File(Thread.currentThread().getContextClassLoader().getResource("FruitMsgFilter.java").getFile());
String fileStr = MixAll.file2String(file);
// 订阅下添加此java到当前的package下,此处不能带 .java
consumer.subscribe("fruit", "com.rocketmq.learn.filter.FruitMsgFilter", fileStr);
运行 consumer,在console的consumer下可以看到此consumer,点击client可以看到filter信息。

启动producer测试类:
/**
* 水果生產者
* @author DennyZhao
*
*/
public class FruitProducer { /**
* 主方法
* @param args
* @throws MQClientException
* @throws InterruptedException
*/
public static void main(String[] args) throws MQClientException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("fruitProducerGroup");
producer.setNamesrvAddr("192.168.68.137:9876;192.168.68.138:9876;");
producer.start();
String[] fruitArray = {"apple","pear","strawberry","kiwifruit","mango","peach"};
int count = 0;
for(String fruitname : fruitArray) {
Message msg = new Message("fruit", "common", fruitname, fruitname.getBytes());
count++;
Thread.sleep(2000);
// 用于定义产地
if(count !=4 && count != 5) {
msg.putUserProperty("origin", "mainland");
}else {
msg.putUserProperty("origin", "foregin");
}
SendResult result = null;
try {
result = producer.send(msg);
if(result != null) {
switch(result.getSendStatus()) {
case SEND_OK:
System.out.println("发送成功........");
break;
default:
System.out.println("发送失败.......");
// TODO将内容写入到Redis或失败表中,用于后面从新发送
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
} producer.shutdown();
} }
测试结果,只会展示 mainland 的水果。
※:一般情况不要开启FilterServer,对mq性能消耗较大。
RocketMQ入门(Filter)_5的更多相关文章
- RocketMQ入门(3)拉取消息
转自:http://www.changeself.net/archives/rocketmq入门(3)拉取消息.html RocketMQ入门(3)拉取消息 RocketMQ不止可以直接推送消息,在消 ...
- RocketMQ入门(2)最佳实践
转自:http://www.changeself.net/archives/rocketmq入门(2)最佳实践.html RocketMQ入门(2)最佳实践 一.服务端安装部署 我是在虚拟机中的Cen ...
- RocketMQ入门(1)
转自:http://www.changeself.net/archives/rocketmq入门(1).html RocketMQ入门(1) RocketMQ是一款分布式.队列模型的消息中间件,具有以 ...
- RocketMQ入门(消费者)_3
消费者角色: 1. 推式(一般建议用推式) 2. 拉式 消费模式: 1. 集群(cluster) --均衡负载消费 2. 广播(broadcasting) --发布和订阅 ...
- RocketMQ入门手册
前言 继我上一篇博客后 分布式消息队列RocketMQ学习教程① 上一篇博客最主要介绍了几种常用的MQ,所以本博客再简单介绍一下RocketMQ的原理和简单的例子,基于Java实现,希望可以帮助学习者 ...
- 必须先理解的RocketMQ入门手册,才能再次深入解读
RocketMQ入门手册 RocketMQ是一个分布式.队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具 ...
- RocketMQ入门到入土(二)事务消息&顺序消息
接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...
- RocketMQ入门
本文首先引出消息中间件通常需要解决哪些问题,在解决这些问题当中会遇到什么困难,Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件否可以解决,规范中如何定义这些问题.然后 ...
- (一)RocketMq入门之安装运行
一.几个重要的地址 Git地址:https://github.com/apache/incubator-rocketmq 编译好的文件:https://rocketmq.incubator.apach ...
随机推荐
- mysql中describe关键字
今天写代码的时候,有一个类的数据始终不能插入,老是提示在You have an error in your SQL syntax; check the manual that corresponds ...
- day 06 字符串和列表的方法
一.整形int 定义方式: age=18 #调用age=int(18)的方法,自动调用 n=int("123") #只能转换纯数字类型 二:浮点型float 定义方式 sal ...
- 如何执行Python代码
1.在linux系统中执行代码有两种方法 a.在脚本的当前目录下执行:python test.py b.给脚本赋予可执行权限,然后执行代码 chmod +x test.py test.py 2.在wi ...
- Python全栈之路----函数----参数
参数可以让你的函数更灵活,不只能做死的动作,还可以根据调用时传参的不同决定函数内部的执行流程. 形参:只有在被调用时才分配内存单元,在调用结束时,即可释放所分配的内存单元.因此形参只在函数内部有效.函 ...
- 20155208徐子涵《网络对抗》Exp2 后门原理与实践
20155208徐子涵<网络对抗>Exp2 后门原理与实践 基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:当我们在非官方网站上下载软件时,后门极有可能会进入我们 ...
- cordova网络情况检测插件使用:cordova-plugin-network-information
1. 添加插件 : cordova plugin add cordova-plugin-network-information 2. 调用方法: document.addEventListener(' ...
- BEAM188和LINK180简单实例
简介 一开始想做一个绳索单元悬挂重物的仿真,其实想法很简单,但是在实现过程中却出现了很大的问题,纠结了很久,初步归结为:绳索单元在垂直其单元方向上受力,会导致其产生很大的变形,从而导致其不收敛.因此专 ...
- ajax 调用webservice 跨域问题
注意两点 1. 在webservice的config中加入这段位置 (注意不是调用webservice的webconfig中加入) <system.webServer> <! ...
- IETF和W3C的区别
国际互联网协会ISOC和万维网联盟W3C是互联网领域内两大国际协会组织,ISOC旗下IETF机构与W3C是互联网行业内两大标准组织.不可否认「IETF和W3C都是优秀的组织,它们从事着一种使事情按程序 ...
- Dart Map<> 添加 元素
Map<String, WidgetBuilder> routesList() { Map<String, WidgetBuilder> re = new Map<Str ...