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的更多相关文章

  1. RocketMQ入门(3)拉取消息

    转自:http://www.changeself.net/archives/rocketmq入门(3)拉取消息.html RocketMQ入门(3)拉取消息 RocketMQ不止可以直接推送消息,在消 ...

  2. RocketMQ入门(2)最佳实践

    转自:http://www.changeself.net/archives/rocketmq入门(2)最佳实践.html RocketMQ入门(2)最佳实践 一.服务端安装部署 我是在虚拟机中的Cen ...

  3. RocketMQ入门(1)

    转自:http://www.changeself.net/archives/rocketmq入门(1).html RocketMQ入门(1) RocketMQ是一款分布式.队列模型的消息中间件,具有以 ...

  4. RocketMQ入门(消费者)_3

    消费者角色: 1. 推式(一般建议用推式) 2. 拉式 消费模式: 1. 集群(cluster)                --均衡负载消费 2. 广播(broadcasting) --发布和订阅 ...

  5. RocketMQ入门手册

    前言 继我上一篇博客后 分布式消息队列RocketMQ学习教程① 上一篇博客最主要介绍了几种常用的MQ,所以本博客再简单介绍一下RocketMQ的原理和简单的例子,基于Java实现,希望可以帮助学习者 ...

  6. 必须先理解的RocketMQ入门手册,才能再次深入解读

    RocketMQ入门手册 RocketMQ是一个分布式.队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具 ...

  7. RocketMQ入门到入土(二)事务消息&顺序消息

    接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...

  8. RocketMQ入门

    本文首先引出消息中间件通常需要解决哪些问题,在解决这些问题当中会遇到什么困难,Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件否可以解决,规范中如何定义这些问题.然后 ...

  9. (一)RocketMq入门之安装运行

    一.几个重要的地址 Git地址:https://github.com/apache/incubator-rocketmq 编译好的文件:https://rocketmq.incubator.apach ...

随机推荐

  1. linq的基本使用

    1.查询所有的偶数 , , , , , , , , , , , , }; var elist = from s in str == select s; foreach (int i in elist) ...

  2. Mondrian辅助组件----Schema WorkBench(架构平台简介)

    Schema WorkBech 是Pentaho套件的另一个组件,是mondrian中schema文件生成工具.通过Schema WorkBench我们可以快速生成一个schema文件,不再需要手写. ...

  3. [Mac]secureCRT私钥转换为mac ssh私钥

    工作环境从win迁移到mac后,win上原来用secureCRT生成的key,在mac的iterm2中不能兼容使用,导致无法再mac下登录.报错如下: key_load_public:invalid ...

  4. SVG的用法

    三种添加方式 <iframe src="图的地址" frameborder="0"></iframe> <object width ...

  5. 在myeclipse中maven项目关于ssh整合时通过pom.xml导入依赖是pom.xml头部会报错

    错误如下 ArtifactTransferException: Failure to transfer org.springframework:spring-jdbc:jar:3.0.5.RELEAS ...

  6. 剑指Offer 30. 连续子数组的最大和 (数组)

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  7. 剑指Offer 51. 构建乘积数组 (数组)

    题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1].不 ...

  8. Python函数定义、文件操作(读写、修改)

    date:2018421 day3 一.函数定义 def  函数名(首字母大写) 增加程序可读性 #直接写函数名即可调用函数 #参数 ①.形参 ②.实参 ③.缺省参数 如果有默认值,调用的时候没有传递 ...

  9. mql初学事物和视图

    1.概念:一条或者多条sql语句的集合! 事务:就是一堆操作的集合,他们同生共死.要么都执行成功,要么都执行失败 2.事务的特性 ACID A:原子性 完整的,不可分割的 原子性 (Atomicity ...

  10. UVa699

    这个建树的根选的很有意思,在中间作为树的根.所以二叉树建树的方法虽然一般是有两种数组的方法,一个是如果深度不太大的话,可以之间用2*k+1,2*k建树,如果很大的话,就挨着建树,弄一个结构体,有左右子 ...