一 JMS 消息由以下几部分组成:消息头,属性,消息体。 [4]
l 消息头( header ): JMS 消息头包含了许多字段,它们是消息发送后由 JMS 提供者或消息发送者产 生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。
一般以JMS 开头,如JMSDestination ,JMSMessageID JMSReplyTo
msg.setJMSMessageID(id);
大部分消息头是自动分配的,即便使用setJMS... 也会被忽略
JMSReplyTo JMSCorelationID 用户可自己分配
l 属性( property ):由消息发送者产生,用来添加删除消息头以外的附加信息。
名称没有限制,用户可随便定义
属性分三类 :
1 应用程序定义的属性(即自定义,程序可以通过它传递信息,比如用到消息过滤中)
msg.setStringProperty("property_name", value)
msg.setDoubleProperty(" property name ", value);
2JMS定义的属性
JMSUserID JMSXAppID JMSXGroupID 等
这类属性只能用 msg.setStringProperty(" JMSUserID ", value) ,没有相应的set JMSUserID()
3 提供者特定的属性,不同厂商有其特定的属性,
属性一般第一条最常用 ,对一般用户来说
l 消息体( body ):由消息发送者产生, JMS 中定义了 5 种消息体: ByteMessage 、 MapMessage 、 ObjectMessage 、 StreamMessage 和 TextMessage 。
二 消息过滤
消息选择器基于sql92 语法
如 age >10 AND name='abc' 语句则仅符全这个条件的消息才会被接收
注意这里的age name 必须是jms 消息的 消息头,属性
即 msg.setStringProperty("name","abc" )
msg.setIntProperty("age",11 )
这个消息才会被消费 ,
除了自定义的属性如name age 可以用作过滤外,
JMSDeliveryMode JMSPriority JMSMessageId JMSTimestamp JMSCorrelationId JMSType 也可以用作过滤
但jmsdestination jmsreplyto jmsredelivered 不可以,因为前两个对应的值是Destination对象,而者 jmsredelivered 的值不确定,因为谁也不知道 这个消息是不是重发的。
1 String 常量用单引号引住如'abc' ,单引号用两个单引号表示 如‘jack''s ’ 表示的是jack's
2比较运算符
算术运算
like (a_c a%c &bc )
between
in age in (10 ,11,12)
not
is null (没有相应的name age 属性或消息头,则 is null )
and or
subSession.createConsumer(destination, messageSelector);
session.createBrowser ();
session.createReceiver();
session.createSuubscriber();
String sql= "age >10 AND name='abc'";
subSession.createConsumer(topic, sql);
如果一个消息(及其是队列中的消息,)如果一直没有消费者消费它,会一直存在队列中,
为此可以设置一个消息的到期时间 JMSExpiration 消息头表示到何时过期,
也可以通过 MessageProducer.setTimeToLive(1000); 设置