消息选择器

  将消息选择器应用在消费者,消费者就只会接受能通过过滤器的消息。消息选择器是基于 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 - 消息选择器的更多相关文章

  1. Oozie 生成JMS消息并向 JMS Provider发送消息过程分析

    一,涉及到的工程 从官网下载源码,mvn 编译成 Eclipse工程文件:

  2. JMS学习(三)JMS 消息结构之属性及消息体详解

    一.前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍. 二.属性介绍 消息属性的主要作用是可以对头 ...

  3. JavaEE(6) - JMS消息选择和查看

    1. JMS消息的类型.消息头和消息属性 消息类型: StreamMessage MapMessage TextMessage ObjectMessage BytesMessage JMS消息中的消息 ...

  4. AMQ学习笔记 - 04. 消息选择器

    概述 消息选择器使用类似于SQL语法,为Consumer指定基于Message属性的筛选条件. 消息选择器 发送的时候,给消息添加一些属性:在接收的时候,根据属性进行过滤. API javax.jms ...

  5. 三:JMS消息服务规范

    一:JMS是什么?--->JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API--->用于在两个应用程 ...

  6. JMS消息

    1.消息可分为3部分:消息头.属性和有效负载 消息头:用于标识消息.声明消息属性及提供路由信息的特殊字段组成. 消息的属性区包含了和该消息有关的附加元数据,这个元数据由应用程序开发者进行设置,或者由J ...

  7. JMS 重点是JMS消息结构讲解

    这部分之前认识的不是很清楚,转载记录下,转载自:https://www.cnblogs.com/Zender/p/9098410.html 阅读目录 一,消息服务 二,JMS 回到目录 小时(1000 ...

  8. IBM MQ消息中间件jms消息中RHF2消息头的处理

    公司的技术平台在和某券商对接IBM MQ消息中间件时,发送到MQ中的消息多出了消息头信息:RHF2,造成消息的接收处理不正常.在此记录此问题的处理方式. 在IBM MQ中提供了一个参数 targetC ...

  9. Intellij IDEA 创建消息驱动Bean - 接收JMS消息

    除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了 ...

随机推荐

  1. Java虚拟机学习 - 体系结构 内存模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”, 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最 ...

  2. 树莓派加入定时任务实现花生壳定时重启(linux的定时任务)

    由于花生壳在linux下不稳定,联系开机一个星期左右会挂掉,所以要使用定时任务实现每小时刷新一次/启动一次. 使用的是linux下的定时任务crontab去实现. 实现步骤: 1.编辑/etc/cro ...

  3. Java学习笔记(七):内部类、静态类和泛型

    内部类 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一下这四种 ...

  4. 菜鸟学习 git

    到新公司学习和使用 git 有一段时间了.不得不说 git 真的很牛逼,当然,git 的牛逼是建立在 Linux 之父的牛逼的基础上的. 首先跪着推荐 git 学习网站:http://www.liao ...

  5. no datanode to stop

    昨晚整了半天,遇上的问题是通过start-all.sh无法启动datanode,然后关闭时就会报no datanode to stop ,引起这个的原因是因为我多次格式化,导致namespaceID不 ...

  6. UVa572 Oil Deposits DFS求连通块

      技巧:遍历8个方向 ; dr <= ; dr++) ; dc <= ; dc++) || dc != ) dfs(r+dr, c+dc, id); 我的解法: #include< ...

  7. Educational Codeforces Round 1 E. Chocolate Bar 记忆化搜索

    E. Chocolate Bar Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/prob ...

  8. TListView列表拒绝添加重复信息

      //TListView列表拒绝添加重复信息 procedure TForm1.Button1Click(Sender: TObject);var  i: Integer;begin  if (Tr ...

  9. MaterialDesignLibrary

    https://github.com/navasmdc/MaterialDesignLibrary MaterialDesignLibrary.zip

  10. C++11 类内初始化

    C++11新标准规定,可以为数据成员提供一个类内初始值.创建对象时,类内初始值将用于初始化数据成员.没有初始值的成员将默认初始化. 对类内初始值的限制与之前介绍的类似:或者放在花括号里,或者放在等号右 ...