【 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. POJ_3368 Frequent values 【线段树+区间查询】

    一.题面 POJ3368 二.分析 仍然是一道只需要区间查询不需要区间修改的线段树题. 这题的题面比较特别,它是一组非减的数组.当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可 ...

  2. springcloud(一)-初识

    springCloud简介 尽管springCloud带有“cloud”字样,但它并不是云计算解决方案,而是在SpringBoot基础上构建的,用于快速构建分布式系统的通用的工具集.从技术架构上降低了 ...

  3. vue项目element-ui框架中的弹窗中的表单验证清除问题

    问题回顾: 1.vue项目的在弹窗上的form表单验证,第一次点击新增时正常,第二次新增打开弹窗后由于表单内容为空,出现验证这种情况 2.为了解决上面的情况,在执行点击新增事件加上this.$refs ...

  4. java se系列(十一)线程

    1 线程的概述 进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域. 线程:就是在一个进程中负责一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 图上的一键优化与 ...

  5. JS之作用域与闭包

    JS之作用域与闭包   作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...

  6. cloudera-scm-server启动时出现Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not open connection问题解决方法(图文详解)

    问题现象 查看 [root@cmbigdata1 cloudera-scm-server]# pwd /var/log/cloudera-scm-server [root@cmbigdata1 clo ...

  7. git笔记(三)

    详细输出日志 git log --pretty=raw 查看id类型 git cat-file -t fe4c git cat-file -t b36bf6 git  cat-file  -t b08 ...

  8. 【随笔】win7下安装Apache服务器

    1.首先下载64位的apache服务器httpd-2.4.10-win64.zip 2.解压,可以是默认路径,也可以自定义路径,我这里是E:/ 3.打开E:/Apache24/conf文件夹 4.随便 ...

  9. C 标准库 - string.h之strncpy使用

    strncpy 把 src 所指向的字符串复制到 dest,最多复制 n 个字符.当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充. char *strncpy(char *dest ...

  10. Vim常用插件——前端开发工具系列

    作为一名开发者,应该对编辑器之神Vim与神之编辑器Emacs有所耳闻吧.编辑器之战的具体细节有兴趣的童鞋可以google之. Vim最大的特点是打开速度快,功能强大,一旦掌握了其中的命令,编程过程双手 ...