JMS - 消息选择器
消息选择器
将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息。消息选择器是基于 SQL-92 条件表达式语法的一个子集。消息选择器由三个元素组成:标识符、常量和标记运算符。
标识符
标识符就是表达式中被比较的那一部分。标识符必须是消息属性或者若干 JMS 消息头之一。
可以用作标识符的 JMS 消息头包括:JMSDeliveryMode、JMSPriority、JMSMessageID、JMSTimestamp、JMSCorrelationID 和 JMSType。JMSDestination 和 JMSReplyTo 消息头无法用作标识符,因为它们对应的值是 Destination 对象,这些对象的实际值是私有的,因而也是未定义的。JMSRelivered 值可以在传送期间修改,因此不再选择器中使用。JMSExpiration 不能用作标识符,因为这个值会因 JMS 提供者所选的不同实现而异。
常量
常量是使用硬编码方式写人消息选择器的表达式值。String 常量使用单引号括起来。如果 String 常量中含有单引号,则可以使用两个单引号表示(例如,'Smith''s')。数值常量使用精确数值表示法(+22,30,-100)、近似数值表示法(-33.22,10.00,+7.2)或科学计数法(-9E4、3.5E6)来表示。布尔常量用 true 或 false 来表示。
运算符
运算符包括算术比较运算符、LIKE 运算符、BETWEEN 运算符、IN 运算符、IS NULL 运算符和逻辑运算符。
示例
消息选择在 session.createConsumer() 中指定,这样消费者只会在指定的目的地消费通过过滤器的消息。在下面例子中,只有消息属性 status 是 U 或 R,且消息的优先级大于等于 8 的消息才会被消费。
Destination destination = session.createQueue("hello_queue");
String filter = "status IN ('U', 'R') and JMSPriority >= 8";
MessageConsumer msgConsumer = session.createConsumer(destination, filter);
消息过滤的设计
在设计基于消息的解决方案时,主要有两种消息过滤方式。可以向单个 JMS 目的地发送所有相关的消息,并对消息消费者使用消息过滤器来选择特定的消息,这种方式称之为 Message Filtering(消息过滤)方式。第二种方式使用包含预过滤消息的多个 JMS 目的地,称之为 Multiple Destination(多目的地)方式。
Message Filtering 方式
在 Message Filtering 方式中,是消息消费者控制了消息过滤,并决定它要接收什么消息。这种方式为消息生产者组件和消息消费者组件提供了更高程度的去耦,因为消息生产者只须了解更少的关于如何处理消息的信息。这对发布/订阅模型来说更是如此,因为主题发布者通常不会注意某个特定主题订阅者的数量和类型。

Multiple Destination 方式
Multiple Destination 方式在消息发送到目的地之前使用消息过滤。它使用的不是消息选择器,取而代之的则是包含特定消息的多目的地方式。消息生产者通常使用 Java 代码应用过滤逻辑来判断该消息应该被发送到哪一个目的地。由于每个队列或主题包含了一个特殊类型的预过滤消息,消息消费者不必使用消息过滤器来接收它所感兴趣的消息。

混合方式
可以混合使用两种方式,来平衡单独使用某种方式的局限。

JMS - 消息选择器的更多相关文章
- Oozie 生成JMS消息并向 JMS Provider发送消息过程分析
一,涉及到的工程 从官网下载源码,mvn 编译成 Eclipse工程文件:
- JMS学习(三)JMS 消息结构之属性及消息体详解
一.前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍. 二.属性介绍 消息属性的主要作用是可以对头 ...
- JavaEE(6) - JMS消息选择和查看
1. JMS消息的类型.消息头和消息属性 消息类型: StreamMessage MapMessage TextMessage ObjectMessage BytesMessage JMS消息中的消息 ...
- AMQ学习笔记 - 04. 消息选择器
概述 消息选择器使用类似于SQL语法,为Consumer指定基于Message属性的筛选条件. 消息选择器 发送的时候,给消息添加一些属性:在接收的时候,根据属性进行过滤. API javax.jms ...
- 三:JMS消息服务规范
一:JMS是什么?--->JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API--->用于在两个应用程 ...
- JMS消息
1.消息可分为3部分:消息头.属性和有效负载 消息头:用于标识消息.声明消息属性及提供路由信息的特殊字段组成. 消息的属性区包含了和该消息有关的附加元数据,这个元数据由应用程序开发者进行设置,或者由J ...
- JMS 重点是JMS消息结构讲解
这部分之前认识的不是很清楚,转载记录下,转载自:https://www.cnblogs.com/Zender/p/9098410.html 阅读目录 一,消息服务 二,JMS 回到目录 小时(1000 ...
- IBM MQ消息中间件jms消息中RHF2消息头的处理
公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...
- Intellij IDEA 创建消息驱动Bean - 接收JMS消息
除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...
随机推荐
- 用ConfigurationManager读取和修改配置文件
为了方便有时我们会把一些简单的配置的信息放入web.config文件里. 放到appSettings添加key value等信息. ConfigurationManager.AppSettings ...
- Nexus搭建Manven
Nexus相当于中转服务器,减轻网络的负载,加速项目搭建的进程 1.下载地址:http://www.sonatype.org/nexus/go 2.下载的是zip包,解压后进入D:\nexus-2.8 ...
- ckeditor内容保存后显示问题
ckeditor保存到数据库中的数据是html格式,如果要在前台进行显示,需要采用${news.content },这样数据才能进行正常的显示,否则如果采用<s:property value=& ...
- C#多线程开发
1.进程与线程的区别 通俗的讲,进行就是任务管理器中进行列表中看到的正在运行的程序,它是一个动态的概念,活动的实体. 线程是程序执行流的最小单元,是线程中一个实体,是系统独立调度和分派CPU基本单位. ...
- iOS 小知识-tips
--->1<--- arc的项目中使用非arc代码,则添加-fno-objc-arc: 非arc项目中使用arc代码,则添加-fobjc-arc. --->2<--- 实用的类 ...
- Java Nio 多线程网络下载
--> 默认最多50个线程 同一文件下载失败延迟超过30秒就结束下载 --> 下载5分钟超时时间,假设5分钟内未下载完就结束下载 --> 依赖 commons-httpclient ...
- androidstudio构建(或导入)工程(不用gradle)
获取源代码: ---assets ---libs ---res ---src 先备份AndroidManifest.xml,然后工程中只保留这四个文件夹,其他文件删除, 然后在studio中导入工程, ...
- SuperToolTips
https://github.com/nhaarman/supertooltips supertooltips-master.zip
- class、classLoader的getResourceAsStream的区别
1.class.getResourceAsStream() 从源码中可以看出他也是调用ClassLoader的getResourceAsStream() public InputStream getR ...
- iOS修改声明为readonly的属性值
本文讨论的是,对于类中声明为 readonly 的属性值,我们就不可以修改其值了么?如何可以,那么如何修改呢? 为了便于说明,定义一个 ACLStudent 的类: ACLStudent.h @int ...