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 ...
随机推荐
- C#生成PDF文件流
1.设置字体 static BaseFont FontBase = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF", Ba ...
- JS的小判断
// 0 if(undefined) { console.log('1'); } else { console.log('0'); } // 0 if(null) { console.log('1') ...
- 使用元类 编写ORM
元类 一句话: 元类定制类的创建行为 知识点 1.类的创建: python这种动态语言,函数和类的定义,不是编译时定义的,而是运行时动态创建的. Python解释器遇到class定义时,仅仅是扫描一下 ...
- 转发 C# Win32 API程序控制鼠标的操作
命名空间:using System.Runtime.InteropServices; 在程序中添加: [DllImport("User32")]public extern stat ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- IDEA java编译中出现了Exception in thread “main" java.lang.UnsupportedClassVersionError
这个问题确实是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误. 在idea中需要修改的有两区,四个地方 1. 修改项目编译器 Crtl+Shift+A 进入如下 ...
- Codeforces1076F. Summer Practice Report(贪心+动态规划)
题目链接:传送门 题目: F. Summer Practice Report time limit per test seconds memory limit per test megabytes i ...
- 【python接口自动化框架-unittest】如何传参数到下一个case
1.前提 平时我们用unittest的时候,都知道每个test_ 都是相互独立的,但是很多现实情况是,我们下一个接口参数,可能会用到上一个接口返回的json字段,那么,我们怎么去实现呢 2.实例 1. ...
- golang web framework--Martini
Martini是一个功能强大的软件包,用于在Golang中快速编写模块化Web应用程序/服务. 下载 $ go get github.com/go-martini/martini Demo serve ...
- spring @Autowired注入对象,在构造方法中为null问题
出现问题的代码如下: @Service public class BaseHttpServiceImpl implements BaseHttpClient { private final stati ...