jms message组成和jsm selector详解(二)

来源:互联网 发布:ubuntu 安装 ssh 编辑:程序博客网 时间:2024/05/16 14:57

JMS Message组成

进入正题,Message主要由三部分组成,分别是Header,Properties和Body, 解释如下

  • Header: 消息头,所有类型的这部分格式都是一样的。
  • Properties: 属性,按类型可以分为应用设置的属性,标准属性和消息中间件定义的属性。
  • Body: 消息正文,指我们具体需要消息传输的内容。

      

Header中的各个属性

这里写图片描述

 

   从上表中我们可以看到,系统提供的标准头信息一共有10个属性,其中有6个是由send方法在调用时设置的,有三个是由客户端设置的,还有一个是由消息中间件设置的。

      需要注意的是,这里的client不是指消费者,而是指使用JMS的客户端,即开发者所写的应用程序,即在生产消息时,这三个属性是可以由应用程序来设定的,而其它的header要么由消息中间件设置,要么由发送方法来决定,开发者即使设置了,也是无效的。

      为了验证我们的猜测,个人做了个测试,结果如下:

      以上截图只显示了关键的设置代码和消费者获取到消息之后的打印结果,从中可以得到以下结论:

      1)只有JmsType, ReplyTo和CorrelationId可以显示设置,其它都无效

      2)优先级和有效期可以由生产者来设置

      3)Expiration的值等于Timestemp的时间加上timeToLive的值,是一个绝对时间。

  基于以上结论,对于大多数属性来说,我们知道其表示的意义即可,因为我们无法改变这些值的设置。

Properies中的各个属性

分成三类
CUSTOM PROPERTIES
用户属性可以任意创建和使用,如果必要的话。
getBooleanProperty()/setBooleanProperty(), getStringProperty()/setStringProperty(),


JMS-DEFINED PROPERTIES

  • JMSXAppID—定义了应用程序发送消息的id
  • JMSXConsumerTXID —消费者的id
  • JMSXDeliveryCount—尝试发送消息的次数
  • JMSXGroupID—消息所在的组
  • JMSXGroupSeq—消息所在的组的确认
  • JMSXProducerTXID—生产者id
  • JMSXRcvTimestamp —生产者发送消息的时间
  • JMSXState—定义生产者的状态
  • JMSXUserID —用来辨认使用者

PROVIDER-SPECIFIC PROPERTIES
每个provoder都定义的值。通常用于特定于proider的非JMS客户机,不应该用于JMS到JMS消息传递。


Message Selector

介绍了Propertis和Header,那么,他们对我们有什么帮助呢?
JMS客户端可以利用(消息选择器)JMS message selector告诉JMS生产者他想要的消息,根据消息的特定属性和特定的值。

而这个消息选择器的工作原理是根据Propertis和Header,通过普通的布尔等价对比(simple Boolean evaluation)进行过滤选择。

假设我们有一个消息如下:

public void sendStockMessage(Session session,                                 MessageProducer producer,                                 Destination destination,                                 String payload,                                 String symbol,                                 double price)        throws JMSException {    TextMessage textMessage = session.createTextMessage();    textMessage.setText(payload);    textMessage.setStringProperty("SYMBOL", symbol);    textMessage.setDoubleProperty("PRICE", price);    producer.send(destination, textMessage);}

  • 过滤实例
String selector = "SYMBOL = 'AAPL'";MessageConsumer consumer =    session.createConsumer(destination, selector);
String selector = "SYMBOL = 'AAPL' AND PRICE > "    + getPreviousPrice();MessageConsumer consumer =    session.createConsumer(destination, selector);
String selector = "SYMBOL IN ('AAPL', 'CSCO') AND PRICE > "        + getPreviousPrice() + " AND PE_RATIO < "        + getCurrentAcceptedPriceToEarningsRatioThreshold();MessageConsumer consumer =    session.createConsumer(destination, selector);

Message Body

包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口

  • StreamMessage 一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
  • MapMessage 一种主体中包含一组键–值对的消息。没有定义条目顺序。
  • TextMessage 一种主体中包含Java字符串的消息(例如,XML消息)。
  • ObjectMessage 一种主体中包含序列化Java对象的消息。
  • BytesMessage 一种主体中包含连续字节流的消息。
原创粉丝点击