【 JMS Selectors 】

JMS Selectors用于在订阅中,基于消息属性对消息进行过滤。

以下是个Selectors的例子:Java代码

consumer = session.createConsumer(destination, "JMSType = 'car' AND weight > 2500");

在JMS Selectors表达式中,可以使用IN、NOT IN、LIKE等,

例如: LIKE '12%3' ('123' true,'12993' true,'1234' false) LIKE 'l_se' ('lose' true,'loose' false) LIKE '\_%' ESCAPE '\' ('_foo' true,'foo' false)

需要注意的是,JMS Selectors表达式中的日期和时间需要使用标准的long型毫秒值。

另外表达式中的属性不会自动进行类型转换,例如:Java代码myMessage.setStringProperty("NumberOfOrders", "2");"NumberOfOrders > 1" 求值结果是false。

关于JMS Selectors的详细文档请参考javax.jms.Message的javadoc。 上一小节介绍的Message Groups虽然可以保证具有相同message group的消息被唯一的consumer顺序处理,但是却不能确定被哪个consumer处理。在某些情况下,Message Groups可以和JMS Selector一起工作,例如: 设想有三个consumers分别是A、B和C。你可以在producer中为消息设置三个message groups分别是"A"、"B"和"C"。然后令consumer A使用"JMXGroupID = 'A'"作为selector。B和C也同理。这样就可以保证message group A的消息只被consumer A处理。需要注意的是,这种做法有以下缺点:• producer必须知道当前正在运行的consumers,也就是说producer和consumer被耦合到一起。• 如果某个consumer失效,那么应该被这个consumer消费的消息将会一直被积压在broker上。

【消息过滤实例】

【生产者】

package test2.activemq.demo;

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; public Producer(){
try{
this.connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616");
this.connection= this.connectionFactory.createConnection();
this.connection.start();
this.session = this.connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
this.messageProducer = this.session.createProducer(null);
}catch(JMSException e){
e.printStackTrace();
}
} public Session getSession(){
return this.session;
} public void sendMapMessage(){
try{
Destination destination = this.session.createQueue("bestQueue");
MapMessage msg1 = this.session.createMapMessage();
msg1.setString("name", "Higgin");
msg1.setString("age", ""); //这个格式不属于过滤的格式
msg1.setIntProperty("money", ); //这个格式次才是能过滤的格式
msg1.setStringProperty("color", "blue"); MapMessage msg2 = this.session.createMapMessage();
msg2.setString("name", "Higgin2");
msg2.setString("age", "");
msg2.setIntProperty("money", );
msg2.setStringProperty("color", "yellow"); MapMessage msg3 = this.session.createMapMessage();
msg3.setString("name", "Zhansan");
msg3.setString("age", "");
msg3.setIntProperty("money", );
msg3.setStringProperty("color", "red"); MapMessage msg4 = this.session.createMapMessage();
msg4.setString("name", "Lisi");
msg4.setString("age", "");
msg4.setIntProperty("money", );
msg4.setStringProperty("color", "blue"); MapMessage msg5 = this.session.createMapMessage();
msg5.setString("name", "Wangwu");
msg5.setString("age", "");
msg5.setIntProperty("money", );
msg5.setStringProperty("color", "blue"); this.messageProducer.send(destination,msg1,DeliveryMode.NON_PERSISTENT,,**10L); //消息有效时间10分钟
this.messageProducer.send(destination,msg2,DeliveryMode.NON_PERSISTENT,,**10L);
this.messageProducer.send(destination,msg3,DeliveryMode.NON_PERSISTENT,,**10L);
this.messageProducer.send(destination,msg4,DeliveryMode.NON_PERSISTENT,,**10L);
this.messageProducer.send(destination,msg5,DeliveryMode.NON_PERSISTENT,,**10L); }catch(JMSException e){
e.printStackTrace();
}
} public void sendTextMessage(){
try{
Destination destination = this.session.createQueue("bestQueue");
TextMessage textMessage = this.session.createTextMessage("text Message Ha Ha Ha");
this.messageProducer.send(destination,textMessage,DeliveryMode.NON_PERSISTENT,,**10L);
}catch(JMSException e){
e.printStackTrace();
}
} public static void main(String[] args) {
Producer p = new Producer();
p.sendMapMessage();
} }

【消费者】

package test2.activemq.demo;

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.MessageProducer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; public class Consumer {
//错误的条件,因为producer是使用setString()方法添加的属性,只有setIntProperty或setStringProperty这种格式的才能满足过滤条件
public final String SELECTOR_0 = "age = 25"; public final String SELECTOR_1 = "color = 'blue'"; public final String SELECTOR_2 = "color = 'blue' AND money > 100 "; public final String SELECTOR_3 = "receiver = 'A'"; //1.连接工厂
private ConnectionFactory connectionFactory;
//2.连接对象
private Connection connection;
//3.Session对象
private Session session;
//4.生产者
private MessageConsumer messageConsumer;
//5.队列
private Destination destination; public Consumer(){
try{
this.connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616");
this.connection= this.connectionFactory.createConnection();
this.connection.start();
this.session = this.connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
this.destination = this.session.createQueue("bestQueue");
//创建消费者的时候,除了增加队列信息,还可以添加一个过滤器
this.messageConsumer = this.session.createConsumer(this.destination,this.SELECTOR_1);
}catch(JMSException e){
e.printStackTrace();
}
} public void receiver(){
try{
this.messageConsumer.setMessageListener(new Listener());
}catch(JMSException e){
e.printStackTrace();
}
} class Listener implements MessageListener{ @Override
public void onMessage(Message msg) {
try{
if(msg instanceof MapMessage){
MapMessage result =(MapMessage)msg;
System.out.println(result.toString());
System.out.println("被消费的消息:"+result.getString("name")+"--"+result.getString("age")+"--"+result.getStringProperty("color"));
}
}catch(Exception e){
e.printStackTrace();
}
}
} public static void main(String[] args) {
Consumer c = new Consumer();
c.receiver();
}
}

【消费者SELECT_1的运行结果】

05_ActiveMQ的selectors的更多相关文章

  1. DOM扩展-Selectors API(选择符 API)、元素遍历

    DOM扩展 对DOM的两个主要扩展是SelectorsAPI(选择符API)和HTML5 SelectorsAPI(选择符API)是由W3C发起制定的一个标准,致力于浏览器原生支持CSS查询,Sele ...

  2. BeautifulSoup高级应用 之 CSS selectors /CSS 选择器

    BeautifulSoup支持最常用的CSS selectors,这是将字符串转化为Tag对象或者BeautifulSoup自身的.select()方法. 本篇所使用的html为: html_doc ...

  3. CSS 笔记六(Image/Attribute Selectors)

    Image Opacity / Transparency The CSS opacity property is a part of the CSS3 recommendation. Example ...

  4. CSS 笔记一(Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width)

    Selectors/ Backgrounds/ Borders/ Margins/ Padding/ Height and Width CSS Introduction: CSS stands for ...

  5. DOM扩展之Selectors API

    jQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getElementById()和getElementsByTagName(). Selectors API致力于让浏览器 ...

  6. 转:SELENIUM TIPS: CSS SELECTORS

    This page will show you some CSS rules and pseudo-classes that will help you move your XPATH locator ...

  7. selectors实现高并发

    1. 下面的例子,客户端给服务端发送消息,服务端把消息返回 server #!/usr/bin/env python import selectors import socket import tim ...

  8. 【CSS3】Advanced3:Universal, Child, and Adjacent Selectors

    1.Universal selectors eg:#target*{ } 2.Child selectors < something immediately nested within some ...

  9. 【CSS】Intermediate1:Class and ID Selectors

    1.html tag = css selector 2.Define your own selectors in the form of class and ID selectors 3. .clas ...

随机推荐

  1. 常见浏览器hack汇总

    1.背景渐变bug: ①.ie8 ie9:用滤镜的方式解决: -ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientT ...

  2. overload_protect_config.txt

    overload_protection_switch=Y reject_uri_list= reject_request_percent=50 period_time=10 period_max_fa ...

  3. Post、Get请求

    post.get请求方法 /// <summary> /// Post.Get请求 /// </summary> /// <param name="url&qu ...

  4. 差分ADC到单端ADC

    单片机可以处理单端ADC(不在电压范围内要进行分压),也可以处理差分ADC(但需要双路输入).差分信号在传输过程中抗共模干扰能力很强,所以传输中都用差分传输,到ADC时可以差分也可以单端(需要放大器处 ...

  5. Mysql+innodb数据存储逻辑

    Mysql+innodb数据存储逻辑. 表空间由段,区,页组成 ibdata1:共享表空间.即所有的数据都存放在这个表空间内.如果用户启用了innodb_file_per_table,则每张表内的数据 ...

  6. html的img标签

    html显示图片 1.最简单: <img src="图片路径"/> 2.如果要改变图片显示的尺寸 <img src="图片路径" width= ...

  7. FocusBI:SSAS体系结构(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277   获取学习资料和一起探讨问题. SSAS是微软BI组件系列中最核心的组件,商业智能的心脏所有的数据都从这里统一输出,它能把 ...

  8. Web后台模拟前端post(带NTLM验证)

    using System.Data; using System.Net; using System.IO; using System.Net.Http; using System.Web; using ...

  9. Echarts 修改折线的颜色和折线的点的大小方法

    series: [{ type: 'line', smooth:true,//折点是圆弧状的                            showSymbol: true,          ...

  10. 浅谈MES系统SMT的JIT功能(二):JIT流程

    上周说到JIT的原理,今天就说说JIT功能的基本流程:从维护基本信息——>生产人员排程——>仓库人员发料——>生产上料——>JIT物料配送看板拉到仓库人员发第二次料,循环上料发 ...