JMS学习(四) Selector详解
一、前言
在掌握了消息的结构之后,我们接下来看一下JMS的一个重要功能:选择器。有些时候,作为消费者只希望处理自己感兴趣的消息。如果某个消息只有一个消费者,我们可以在让该客户端根据规则来处理自己感兴趣的消息,那些不满足某些规则的就直接替丢弃掉。
但如果消息是广播的机制,那么让每个客户端都去做这样的处理,就加大了客户端的工作量,一种更好的方式,就是由消息提供者来完成消息的过滤和路由工作,这样就能大减轻客户端的工作量,消费者在真正处理的时候,完全不用关注对消息的过滤,可以只负责对消息的处理。也就是说,JMS的消息提供者可以保证其收到的消息都是其想要的消息。
JMS中,这种机制是通过selector来实现的,本文则详细介绍一下selector.
二、实现方式
在JMS里,selector并不是一个对象,而是一个字符串,更确切的说,是一个条件表达式,这个表达式并不仅限于处理逻辑表达式,而是一个跟SQL92语法类似的表达式。表达式中的变量必须为标准的消息头信息的key或者是某个属性的key,如果表达式计算结果为true,则表示该消息满足条件,接收端需要处理,如果为false,则表达接收端不需要处理。
该表达式在创建一个消费者的时候进行指定,示例如下:
MessageConsumer receiver = session.createConsumer(myDest, "articleType ='joke'");
则该receiver只会收到消息中有articleType属性,且其值为'joke'的消息。假设有两条消息,如下:
message1.setStringProperty("articleType", "joke");
message2.setStringProperty("articleType", "pic");
很明显只有message1会被处理。
三、表达式定义
可以看到其实设置一个selector还是比较简单的,如果对于SQL语法比较熟悉的话,那么对于表达式的理解和编写也会比较简单。一些重要的规则如下:
1. 表达式的操作符不区分大小写,但通常约定为大写
2. 表达式的变量名跟普通java变量名的命名规则一致,区分大小写,如articleType和articletype是两个不同的变量。
3. 表达式的变量名必须是标准的头header名或者已存在的属性名,否则对应的值会为NULL
4. 表达式的值不会进行类型转化,即假设有message2.setStringProperty("version", "1"); 那么表达式"version=1" 对于message2来说,结果是false.
5. 支持基本的算术操作,逻辑操作,括号,取反等运算符
6. 支持BETWEEN .. AND ... , IN (NOT IN)等操作
7. 支持LIKE操作进行模糊匹配,%表示匹配多个任意字符,_表示匹配一个任意字符
8. 支持IS NULL及IS NOT NULL
9. 其它未提到的SQL 92 标准,可以认为能在WHERE语句后使用的表达式,在这儿都可以使用。
四、小结
通过message的头信息和属性,结合selector,就能很方便的进行消息过滤。
JMS学习(四) Selector详解的更多相关文章
- iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...
- [转]iOS学习之UINavigationController详解与使用(三)ToolBar
转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...
- [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...
- 各大公司广泛使用的在线学习算法FTRL详解
各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...
- 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码
跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...
- 从51跳cortex-m0学习2——程序详解
跳cortex-m0——思想转变>之后又一入门级文章,在此不敢请老鸟们过目.不过要是老鸟们低头瞅了一眼,发现错误,还请教育之,那更是感激不尽.与Cortex在某些操作方式上的异同,让自己对Cor ...
- JAVA消息服务JMS规范及原理详解
JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- iOS学习之UINavigationController详解与使用(三)ToolBar
1.显示Toolbar 在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopy [ ...
- iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...
- Flink 从 0 到 1 学习 —— Flink 配置文件详解
前面文章我们已经知道 Flink 是什么东西了,安装好 Flink 后,我们再来看下安装路径下的配置文件吧. 安装目录下主要有 flink-conf.yaml 配置.日志的配置文件.zk 配置.Fli ...
随机推荐
- Kafka 分区备份实战
1.概述 在 Kafka 集群中,我们可以对每个 Topic 进行一个或是多个分区,并为该 Topic 指定备份数.这部分元数据信息都是存放在 Zookeeper 上,我们可以使用 zkCli 客户端 ...
- android 抓包 使用 tcpdmp + Wireshark
下载地址tcpdump: http://www.androidtcpdump.com/ 使用su用户, 给/system/可写的权限 mount -o remount,rw -t ...
- 记一次VNC远程连接Linux问题解决记录(5900端口测试、KDE桌面安装)
最近几天,到一个项目上安装Linux部署环境.由于服务器在机房,而进机房又比较麻烦,于是选择VNC远程连接Linux就显得自然而然了.以前也用过VNC,而且还经常使用,由于各个项目环境不太一样,这次也 ...
- smdkv210
参考:http://code.google.com/p/libyuv/issues/detail?id=295 ******************************************** ...
- golang append
1) Append a slice b to an existing slice a: a = append(a, b...) 2) Copy a slice a to a new slice b: ...
- EETOP中关于Gm仿真的一些帖子的总结
1. cadence画gm曲线 电路里,要把漏的电源dc值设置成变量,比如叫vds,计算器,info标签,点op,然后点管子,在op窗口点list,选gm,然后把这个公式弄到ADE的outputs那里 ...
- 公网IP、私网IP
公网.内网是两种Internet的接入方式.公网接入方式:上网的计算机得到的IP地址是Internet上的非保留地址,公网的计算机和Internet上的其他计算机可随意互相访问. NAT(Networ ...
- IBM powerVM VIOS
引言 随着信息化技术不断发展,各个企业 IT 基础架构也在不断朝向虚拟化,大数据,云计算等精简,整合的趋势发展.虚拟化技术就显得尤为重要.今天要给大家介绍的是 Power 服务器虚拟化技术中的一小部分 ...
- Android应用中使用及实现系统“分享”接口
为了应用的推广.传播,很多的应用中都有“分享”功能,一个按钮,点击后会出现短信.微博等等一切实现了分享功能的应用列表.这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中.An ...
- Knockout 新版应用开发教程之Observable Arrays
假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...