一、搭建RocketMQ集群

  我搭建的是2-master no slave模式,所以在${rocketmq}/conf/2m-noslave/下的 brokder-*.properties 中添加 filterServerNums=1

二、依次启动namesrv和broker

  在broker-*.properties中配置了filterServerNums=1后当你启动broker后,会自动启动filter

三、代码部分

  3.1 Producer部分

  1. package org.hope.lee.filter;
  2.  
  3. import com.alibaba.rocketmq.client.exception.MQClientException;
  4. import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
  5. import com.alibaba.rocketmq.client.producer.SendResult;
  6. import com.alibaba.rocketmq.common.message.Message;
  7.  
  8. public class FilterProducer {
  9. public static void main(String[] args) throws MQClientException {
  10. String group_name = "filter_producer";
  11. DefaultMQProducer producer = new DefaultMQProducer(group_name);
  12. producer.setNamesrvAddr("xxx.xxx.xx.176:9876;xxx.xx.xx.165:9876");
  13. producer.start();
  14. try {
  15. for (int i = 0; i < 100; i++) {
  16. Message msg = new Message("TopicFilter7",// topic
  17. "TagA",// tag
  18. "OrderID001",// key
  19. ("Hello MetaQ" + i).getBytes());// body
  20. msg.putUserProperty("SequenceId", String.valueOf(i));
  21. SendResult sendResult = producer.send(msg);
  22. System.out.println(sendResult);
  23. }
  24. }
  25. catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. producer.shutdown();
  29. }
  30. }

  3.2 Customer部分

  1. package org.hope.lee.filter;
  2.  
  3. import java.io.UnsupportedEncodingException;
  4. import java.util.List;
  5.  
  6. import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
  7. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
  8. import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
  9. import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
  10. import com.alibaba.rocketmq.client.exception.MQClientException;
  11. import com.alibaba.rocketmq.common.MixAll;
  12. import com.alibaba.rocketmq.common.message.MessageExt;
  13.  
  14. public class FilterCustomer {
  15. public static void main(String[] args) throws MQClientException {
  16. String group_name = "filter_consumer";
  17. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group_name);
  18. consumer.setNamesrvAddr("xxx.xxx.xx.176:9876;xxx.xxx.xx.165:9876");
  19. // 使用Java代码,在服务器做消息过滤
  20. String filterCode = MixAll.file2String("E:\\code-on-oschina\\hzjsd1108sohu\\RocketMQ-learn\\rocketmq-api\\src\\main\\java\\org\\hope\\lee\\filter\\MessageFilterImpl.java");
  21. System.out.println(filterCode);
  22. consumer.subscribe("TopicFilter7", "org.hope.lee.filter.MessageFilterImpl", filterCode);
  23. consumer.registerMessageListener(new MessageListenerConcurrently() {
  24. @Override
  25. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
  26. ConsumeConcurrentlyContext context) {
  27. //System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);
  28. try {
  29. System.out.println(new String(msgs.get(0).getBody(),"utf-8"));
  30. } catch (UnsupportedEncodingException e) {
  31. e.printStackTrace();
  32. }
  33. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  34. }
  35. });
  36. consumer.start();
  37. System.out.println("Consumer Started.");
  38. }
  39. }

  3.3 实现MessageFilter接口

    注意:这个类中不能有任何的中文,包括注释中也不能有。否则在Customer启动的时候是找不到这个文件的。

  1. package org.hope.lee.filter;
  2.  
  3. import com.alibaba.rocketmq.common.filter.MessageFilter;
  4. import com.alibaba.rocketmq.common.message.MessageExt;
  5.  
  6. public class MessageFilterImpl implements MessageFilter {
  7.  
  8. @Override
  9. public boolean match(MessageExt msg) {
  10. // NO Chinese
  11. System.out.println("-------------");
  12. String property = msg.getUserProperty("SequenceId");
  13. System.out.println("---------" + property);
  14. if (property != null) {
  15. int id = Integer.parseInt(property);
  16. if((id % 2) == 0) {
  17. //if ((id % 3) == 0 && (id > 10)) {
  18. return true;
  19. }
  20. }
  21.  
  22. return false;
  23. }
  24.  
  25. }

四、测试:

  4.1 运行Customer端

  4.2运行Producer端

https://gitee.com/huayicompany/RocketMQ-learn/tree/master/rocketmq-api

参考:

[1] 白贺翔博客,https://www.cnblogs.com/baihexiang/articles/5307073.html

[2] 考拉哥博客,http://lifestack.cn/archives/371.html

RocketMQ-Filer的更多相关文章

  1. RocketMQ原理解析-Remoting

    Remoting2. 通信层底层传输协议 RocketMq服务器与客户端通过传递RemotingCommand来交互,通过NettyDecoder,对RemotingCommand进行协议的编码与解码 ...

  2. RocketMQ原理解析-Broker

    broker 1. broker的启动 brker的启动 Broker向namesrv注册 1. 获取namesrv的地址列表(是乱序的) 2. 遍历向每个namesrv注册topic的配置信息top ...

  3. RocketMQ原理解析-Consumer

    consumer 1.启动 有别于其他消息中间件由broker做负载均衡并主动向consumer投递消息,RocketMq是基于拉模式拉取消息,consumer做负载均衡并通过长轮询向broker拉消 ...

  4. RocketMQ原理解析-Producer

    producer  producer 1.启动流程 Producer如何感知要发送消息的broker即brokerAddrTable中的值是怎么获得的, 1. 发送消息的时候指定会指定topic,如果 ...

  5. 分布式开放消息系统(RocketMQ)的原理与实践

    分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...

  6. rocketmq生产者和消费者

    1.生产者: package com.ebways.mq.test.mq; import com.alibaba.rocketmq.client.exception.MQClientException ...

  7. rocketmq查看命令

    首先进入 RocketMQ 工程,进入/RocketMQ/bin   在该目录下有个 mqadmin 脚本 .  查看帮助:   在 mqadmin 下可以查看有哪些命令    a: 查看具体命令的使 ...

  8. rocketmq生产者部署的机器注意事项

    报错: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'warningP ...

  9. Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  10. Kafka vs RocketMQ—— Topic数量对单机性能的影响-转自阿里中间件

    引言 上一期我们对比了三类消息产品(Kafka.RabbitMQ.RocketMQ)单纯发送小消息的性能,受到了程序猿们的广泛关注,其中大家对这种单纯的发送场景感到并不过瘾,因为没有任何一个网站的业务 ...

随机推荐

  1. Event事件冒泡和事件捕获

    <!doctype html> <html lang="en"> <head> <meta charset="gb2312&qu ...

  2. java使用WebUploader做大文件的分块和断点续传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  3. Swift1.2与Xcode6.3 beta

    Xcode6.3和Swift1.2都已经发布.这次发布增强了Swift编译器也给Swift增加了一些新的特性.详细内容可以看这里.这里主要关注比较重要的内容. 编译器的改进 Swift1.2的编译器更 ...

  4. 配置好Nginx后,通过flume收集日志到hdfs(记得生成本地log时,不要生成一个文件,)

    生成本地log最好生成多个文件放在一个文件夹里,特别多的时候一个小时一个文件 配置好Nginx后,通过flume收集日志到hdfs 可参考flume的文件 用flume的案例二 执行的注意点 avro ...

  5. WC Java 实现

    项目 github 地址 一. 实现情况 基本要求 c 统计文件字符数 (实现) w 统计文件词数 (实现) l 统计文件行数(实现) 扩展功能 s 递归处理目录下符合条件得文件(实现) a 返回文件 ...

  6. 团队项目第六周——Alpha阶段项目复审(盐酸队)

    Alpha阶段项目复审 小组 优点 缺点,bug报告 名次 天冷记得穿秋裤队 功能比较新颖,可以离线下载,做的比较完整 在下载电影时容易中断 1 只会嘤嘤嘤队 游戏和记单词的融合,也比较新颖 部分浏览 ...

  7. 谈谈XAML前端开发

    GUI的发展 在图形用户界面的操作系统(Windows,MAC)出现之前,计算机软件是命令行界面的程序,用户和程序的交互是通过输入命令,查看命令运行结果进行的.当然很不友好.后来出现了文本图形界面的程 ...

  8. MySQLdb & pymsql

    python有两个模块可以连接和操作mysql数据库,分别是MySQLdb和pymysql,python3建议使用pymysql MySQLdb安装 pip install mysql-python ...

  9. 项目笔记---事半功倍之GhostDoc(二)

    前言 前一篇文章<项目笔记---事半功倍之StyleCop(一)>提到如何约束代码,规范代码风格,这一节,我们将了解如何快速生成符合规则的代码注释---GhostDoc 一.安装Ghost ...

  10. dorado-menu

    1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ...