ActiveMQ消息过滤
前言
ActiveMQ提供了一种机制,使用它,消息服务可根据消息选择器中的标准来执行消息过滤。生产者可在消息中放入应用程序特有的属性,而消费者可使用基于这些属性的选择标准来表明对消息是否感兴趣。这就简化了客户端的工作,并避免了向不需要这些消息的消费者传送消息的开销。然而,它也使得处理选择标准的消息服务增加了一些额外开销。
消息选择器是用于MessageConsumer的过滤器,可以用来过滤传入消息的属性和消息头部分(但不过滤消息体),并确定是否将实际消费该消息。消息选择器是一些字符串,它们基于某种语法,而这种语法是SQL-92的子集。可以将消息选择器作为MessageConsumer 创建的一部分。
实现对MapMessage和TextMessage两种消息的过滤条件的设置和消费
Producer
在消息的属性中设置过滤条件
package com.tgb.activemqFilter; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Producer {
// 单例模式
// 1、连接工厂
private ConnectionFactory connectionFactory;
// 2、连接对象
private Connection connection;
// 3、Session对象
private Session session;
// 4、生产者
private MessageProducer messageProducer;
private Destination destination; public Producer() {
try {
this.connectionFactory = new ActiveMQConnectionFactory("admin",
"admin", "tcp://127.0.0.1:61616");
this.connection = connectionFactory.createConnection();
this.connection.start();
// 设置自动签收模式
this.session = this.connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
this.destination = this.session.createQueue("first");
this.messageProducer = this.session.createProducer(null);
} catch (JMSException e) {
throw new RuntimeException(e);
} } public Session getSession() {
return this.session;
} public void send1(/* String QueueName, Message message */) {
try { Destination destination = this.session.createQueue("first");
MapMessage msg1 = this.session.createMapMessage();
msg1.setString("name", "张三");
msg1.setInt("age", );
// 设置用于消息过滤器的条件
msg1.setStringProperty("name", "张三");
msg1.setIntProperty("age", );
msg1.setStringProperty("color", "bule"); MapMessage msg2 = this.session.createMapMessage();
msg2.setString("name", "李四");
msg2.setInt("age", );
// 设置用于消息过滤器的条件
msg2.setStringProperty("name", "李四");
msg2.setIntProperty("age", );
msg2.setStringProperty("color", "white"); MapMessage msg3 = this.session.createMapMessage();
msg3.setString("name", "赵六");
msg3.setInt("age", );
// 设置用于消息过滤器的条件
msg3.setStringProperty("name", "赵六");
msg3.setIntProperty("age", );
msg3.setStringProperty("color", "black");
// 发送消息
this.messageProducer.send(destination, msg1,
DeliveryMode.NON_PERSISTENT, , * * );
this.messageProducer.send(destination, msg2,
DeliveryMode.NON_PERSISTENT, , * * );
this.messageProducer.send(destination, msg3,
DeliveryMode.NON_PERSISTENT, , * * );
} catch (JMSException e) {
throw new RuntimeException(e);
}
} public void send2() {
try {
Destination destination = this.session.createQueue("first");
TextMessage message = this.session.createTextMessage("我是一个字符串");
message.setIntProperty("age", );
// 发送消息
this.messageProducer.send(destination, message,
DeliveryMode.NON_PERSISTENT, , * * );
} catch (JMSException e) {
throw new RuntimeException(e);
} } public static void main(String[] args) {
Producer producer = new Producer();
producer.send1();
// producer.send2(); }
}
Conmuser
消费消息时,直接在session创建MessageConsumer时,将过滤条件作为参数传入(过滤条件的写法和SQL的写法是很像的)
package com.tgb.activemqFilter; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory; public class Conmuser {
// 单例模式
// 1、连接工厂
private ConnectionFactory connectionFactory;
// 2、连接对象
private Connection connection;
// 3、Session对象
private Session session;
// 4、生产者
private MessageConsumer messageConsumer;
// 5、目的地址
private Destination destination;
// 消息选择器
public final String SELECTOR_1 = "age > 25";
public final String SELECTOR_2 = " age > 20 and color='black'"; public Conmuser() {
try {
this.connectionFactory = new ActiveMQConnectionFactory("admin",
"admin", "tcp://127.0.0.1:61616");
this.connection = connectionFactory.createConnection();
this.connection.start();
// 设置自动签收模式
this.session = this.connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
this.destination = this.session.createQueue("first");
// 在构造消费者的时候,指定了 消息选择器
// 有选择性的消费消息
this.messageConsumer = this.session.createConsumer(destination,
SELECTOR_1);
} catch (JMSException e) {
throw new RuntimeException(e);
}
} public Session getSession() {
return this.session;
} // 用于监听消息队列的消息
class MyLister implements MessageListener { @Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage ret = (TextMessage) message;
System.out.println("results;" + ret.getText());
}
if (message instanceof MapMessage) {
MapMessage ret = (MapMessage) message;
System.out.println(ret.toString());
System.out.println(ret.getString("name"));
System.out.println(ret.getInt("age"));
}
} catch (JMSException e) {
throw new RuntimeException(e);
}
} } // 用于异步监听消息
public void receiver() {
try {
this.messageConsumer.setMessageListener(new MyLister());
} catch (JMSException e) {
throw new RuntimeException(e);
}
} public static void main(String[] args) {
Conmuser conmuser = new Conmuser();
conmuser.receiver(); }
}
测试

Messages Enqueued: 张三 20 | 李四 25 | 赵六 30
消息过滤条件:age>25
ActiveMQ消息过滤的更多相关文章
- JMS学习四(ActiveMQ消息过滤)
一.消息的选择器 不管是在消息发送端设置消息过期时间还是在接收端设置等待时间,都是对不满足的消息有过滤的作用,那消息选择器就是为过滤消息而生的下面来看看消息选择器: ActiveMQ提供了一种机制,使 ...
- 消息中间件-activemq消息机制和持久化介绍(三)
前面一节简单学习了activemq的使用,我们知道activemq的使用方式非常简单有如下几个步骤: 创建连接工厂 创建连接 创建会话 创建目的地 创建生产者或消费者 生产或消费消息 关闭生产或消费者 ...
- ActiveMQ消息选择器Selector
一.前言 消息发送到Broker,消费者通过Destination可以订阅消费某个特定的通道内的消息.一些特殊情况下,需要消费者对消息过滤下再进行消费,也就是筛选出某些特定消息.ActiveMQ提供了 ...
- C#实现ActiveMQ消息队列
本文使用C#实现ActiveMQ消息队列功能. 一.首先需要导入两个包,分别是:Apache.NMS 和 Apache.NMS.ActiveMQ 二.创建Winform程序实现生产者功能. 三.Pro ...
- 2015年12月10日 spring初级知识讲解(三)Spring消息之activeMQ消息队列
基础 JMS消息 一.下载ActiveMQ并安装 地址:http://activemq.apache.org/ 最新版本:5.13.0 下载完后解压缩到本地硬盘中,解压目录中activemq-core ...
- Activemq消息类型
Activemq消息类型JMS规范中的消息类型包括TextMessage.MapMessage.ObjectMessage.BytesMessage.和StreamMessage等五种.ActiveM ...
- ActiveMQ消息的可靠性机制(转)
文章转自:http://www.linuxidc.com/Linux/2013-02/79664.htm 1.JMS消息确认机制 JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通 ...
- activemq消息队列的使用及应用docker部署常见问题及注意事项
activemq消息队列的使用及应用docker部署常见问题及注意事项 docker用https://hub.docker.com/r/rmohr/activemq/配置在/data/docker/a ...
- JAVA的设计模式之观察者模式----结合ActiveMQ消息队列说明
1----------------------观察者模式------------------------------ 观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 ...
随机推荐
- Net中Attribute特性的高级使用及自定义验证实现
好久没写博客了,今天在百忙之中抽空来写篇文章,记录一下最近深入学习Attribute特性的笔记及心得.~~ 一.什么是特性? 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法. ...
- Unity3D_(API)射线检测Raycast()
Unity射线检测官方文档: 传送门 一.检测前方是否有游戏物体(射线无限长度) 二.检测前方是否有游戏物体(射线长度为1m) 三.检测前方游戏物体碰撞信息(射线无限长度): 四.指定检测碰撞Tag层 ...
- IDEA下从零开始搭建SpringBoot工程
SpringBoot的具体介绍可以参看其他网上介绍,这里就不多说了,就这几天的学习,个人理解,简而言之: (1)它是Spring的升级版,Spring容器能做到的事情,它都能做到,而且更简便,从配置形 ...
- Javascript事件:this.value()和this.select()
1.JavaScript的this.value() <asp:TextBox ID="txtComment" runat="server" Text=&q ...
- android 面试汇总<二>
Animation Q:Android中有哪几种类型的动画? 技术点:动画类型 参考回答: 常见三类动画 View动画(View Animation)/补间动画(Tween animation):对V ...
- 万能的TextView,实现常用布局样式
package com.loaderman.textviewdemo; import android.content.Context; import android.content.res.Typed ...
- springboot2.0+swagger集成
场景:项目中添加Swagger配置,可以加速项目的开发,在快速开发项目中十分重要. 1.pom.xml添加swagger <!--swagger --> <dependency> ...
- XAMPP安装后启动Apache的Busy解决方法
启动apache后,一直提示80 busy 使用netstat -ano查看,并无端口占用,真是奇怪. 百度之后发现有可能是启动后,ssl端口占用导致. XAMPP默认会加载一个SSL模块,它要占用一 ...
- Delphi中的Free和Nil和freeandnil函数
Delphi中的Free和Nil 在Delphi中释放对象资源时一般用Obj.Free(Obj为一个实例名),不过程Delphi中还有一个FreeAndNil(对象名)函数,那么用哪个好呢?Free和 ...
- 【SSM】---增删改查
20:43:06 package com.chinasofti.dao; import java.util.List; import com.chinasofti.entity.User; publi ...