`

第二章 Message组成详解

 
阅读更多

                                                                                                   Message组成详解

1.1JMS message组成说明

       JMS message包含两部分,头和承载体. 头中提供被客户端和provider使用的元数据, 承载体包含着实际的数据.

                                                                                  

 

    客户端send方法定义的

  •     JMS Destination  消息送的目的地
  • JMS DeliveryMode--传送模式.总共分两种:持久化和非持久化的.默认是采用持久化的模式 

               persist: 能确保发送失败的时候不会丢失,会多次发送直到成功,但是需要额外的存储空间开销,并且是可靠的

               non-persist:只会发送一次不论成功与否

  • JMS Expiration---message会过期,headers用来确保发送的消息不会是过期的消息。设置过期值可以用 MessageProducer.setTimeToLive()来设置全局的过期时间或者用 MessageProducer.send()来为每个消息单独设置过期时间(默认消息是不会过期的,设置过期时间为0消息也不会过期)
  • JMS MESSAGEID ---message的唯一标示符.使用messageId会招致额外的开销,消息生产者可以建议MQ不需要依赖headers的值通过使用 MessageProducer.setDisableMessageID()方法,此时messageID必须设置成NULL
  • JMS Priority--优先级.用来说明消息的重要性的级别.一旦被设置,那么这个producer的所有消息都适用.JMS提供10个级别从0-9(最高).MQ不需要实现消息排序,尽管很多都有排序.它们只需要保证高优先级的消息先发送出去即可.
  • JMS Timestamp---用来纪录被发送的时间戳。可以用方法MessageProducer.setDisableMessageTimestamp()来禁用.

   客户端定义的

  • JMS Correlation ID --用来关联当前的message和之前的message。例如一个请求message和一个应答message。它的值可以是以下几种:一个特定于提供程序的消息ID, 应用程序特定的字符串 ,字节数组值。
  • JMS ReplyTo----有些情况下,一个JMS消息生产者可能会要求消费者对一条消息做出应答。JMSReplyTo消息头包含了一个javax.jms.Destination,标明了JMS消费者应该应答的地址。在使用请求/应答场景时,通过这条消息头属性可以进一步实现消息生产者和消息消费者之间的去耦
  • JMS Type -----定义message的类型.类型和具体的provider来定义.

   MQ定义的

  •   JMS Redelivered----JMSRedelivered消息头表示会重新发送给消费者如果该消息被重新传送,JMSRedelivered消息头就为true,否则为false。如果一个消费者未能确认先前传送的消息,或者JMS提供者并不确定消费者是否已经接收到该消息时,就可以将这条消息标记为重新传送

以下是Message接口定义

public interface Message {
...
boolean getBooleanProperty(String name) throws JMSException;
byte getByteProperty(String name) throws JMSException;
short getShortProperty(String name) throws JMSException;
int getIntProperty(String name) throws JMSException;
long getLongProperty(String name) throws JMSException;
float getFloatProperty(String name) throws JMSException;
double getDoubleProperty(String name) throws JMSException;
String getStringProperty(String name) throws JMSException;
Object getObjectProperty(String name) throws JMSException;
...
Enumeration getPropertyNames() throws JMSException;
boolean propertyExists(String name) throws JMSException;
...
void setBooleanProperty(String name, boolean value) throws JMSException;
void setByteProperty(String name, byte value) throws JMSException;
void setShortProperty(String name, short value) throws JMSException;
void setIntProperty(String name, int value) throws JMSException;
void setLongProperty(String name, long value) throws JMSException;
void setFloatProperty(String name, float value) throws JMSException;
void setDoubleProperty(String name, double value) throws JMSException;
void setStringProperty(String name, String value) throws JMSException;
void setObjectProperty(String name, Object value) throws JMSException;
.. }

        getPropertyNames用来返回一个枚举列表,通过它可以迭代这个message的所有属性.propertyExists()方法用来判断这个message是否包含属性

       你可以获得到三种类型的属性:用户属性. JMS自定义属性,MQ特殊属性.

  •   用户属性可以自由定义.通过getBooleanProperty()/setBooleanProperty() ,  getStringProperty()/setStringProperty这些方法
  • JMS自定义属性.
  1. JMSXAppID —标识发送消息的应用程序
  2. JMSX ConsumerTXID  —被消费的事务标识符内的事务
  3. JMSXDeliveryCount—消息发送的次数
  4. JMSXGroupID —这个消息属于哪个消息组
  5. JMSXGroupSeq—这个消息在消息组中的序号
  6. JMSXProducerTXID —生产事务标识符内的事务
  7. JMSXRcvTimestamp —把消息发送给消费者的时间戳
  8. JMSXState—用于定义特定于提供程序的状态
  9. JMSXUserID  —发送消息的用户ID  

         标红的两个属性是比较有用的,使用它们,可以对消息进行分组和排序.

  • MQ特殊属性.
1.2 消息选择器
    当一个jms client被订阅到一个目的地.但它也许要过滤某些message.这个时候headers和属性信息正好可以用上.例如:如果一个消费者注册从一个队列接受消息,它只对某些特定标志的message感兴趣.这是很容易的,只要 每个消息包含一个属性标示符。client就可以利用jms消息选择器来告诉provider我只要包含了这种标示符的消息.

   下面来看看一个条件过滤的例子

  

	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'";(过滤表达式)
String selector = "SYMBOL = 'AAPL' AND PRICE > "
+ getPreviousPrice();
String selector = "SYMBOL IN ('AAPL', 'CSCO') AND PRICE > "
+ getPreviousPrice() + " AND PE_RATIO < "
+ getCurrentAcceptedPriceToEarningsRatioThreshold();
MessageConsumer consumer =
session.createConsumer(destination, selector);
...

 以下是选择器的语法

 1.3message承载体

          jms定义了6种java类型的消息体

  •  Message  — 基础消息类型.没有信息载体,只发送header和properties.通常用于简单的事件通知.
  • TextMessge —带有 字符串类型的消息载体.用于发送简单文本和xml数据
  • MapMessage  —带有一系列键值对的消息载体.key是string类型,value是java基本类型
  • ByteMessage —用于包含一个字节数组
  • StreamMessage ---用java基本类型来填充的字符流作为消息载体
  • ObjectMessage---可序列化的java对象作为载体,也支持java 集合
1.4消息接受模式
  • 点对点模式:生产者生产的信息只能被一个消费者消费.可以使用MessageConsumer.receive()从队列同步的接受消息或者使用MessageConsumer.setMessageListener()异步的接受消息.队列会储存消息知道被消费.
  • 发布订阅模式:生产者生产的信息能被多个消费者消费.Topic不保存消息(除非通过订阅)
  虽然jms没提供请求/应答模式,但是它提供了一些message headers和两个类(QueueRequestor,TopicRequestor)来处理基础的请求/应答消息.请求/应答消息传递是一种 异步反复会话模式,利用点对点或者发布订阅通过结合JMSReplyTo和JMSCorrelationID的消息头和临时目的地来达到目的。
    JMSReplyTo指定应该消息应该发送的目的地,在应答消息中的JMSCorrelationID指定了请求消息的JMSMessageID.这些头信息被用于关联应答信息和原始请求信息.临时目的地是那些只存活一个连接的持续时间  并且只能被创建他们的连接消费。
 QueueRequestor,TopicRequestor提供一个request方法用来发送信息等待回复消息通过创建一个临时的每个请求只有一个回复的目的地。不过只支持一个请求一个应答的模式,不支持一个请求多个应答,或者多个请求一个应答.
      

1.5管理对象
     CONNECTIONFACTORY:JMS client通过ConnectionFactory创建和mq的连接.这个连接代表一个client和mq之间的tcp套接字,所以开支是很大的。使用连接池是一个很好的建议.ConnectionFactory通过创建session来维持和mq的连接.
    DESTINATION:它封装消息发送的地址和.它是被session创建的.临时目的地的生命周期和创建它的connection是一致的,并且只有创建它的connection可以从它创建消费者.它通常用于请求/应答模式.
 
 
 
 
  • 大小: 17.4 KB
  • 大小: 22 KB
分享到:
评论

相关推荐

    IBM WebSphere MQ 第二章

    ### IBM WebSphere MQ 第二章知识点详解 #### 2章:WebSphere MQ 的构成要素 在第一章中,我们概述了WebSphere MQ的基本概念及其在消息传递系统中的作用。本章节将深入探讨WebSphere MQ的核心组成部分——队列和...

    计算机网络题目第二章计算机网络第三版编著.pdf

    【计算机网络知识点详解】 1. **网络协议** (A):网络协议是为网络数据交换制定的通信规则、约定与标准。它定义了不同设备如何交互、数据如何封装和解封,以及错误处理等机制。 2. **网络体系结构** (H):网络体系...

    深入理解Android II样章

    2. **第二章:Java Binder与MessageQueue** - Java Binder机制的深入分析 - MessageQueue的工作原理 3. **第三章:SystemServer工作原理** - EntropyService、DropboxManagerService、DiskStatsService、...

    计算机网络谢希仁(第七版)复习题(带问题详解).pdf

    第二章的内容主要涉及通信链路的数据传输速率计算。奈奎斯特定理给出了在理想信道中的最大码元传输速率,而QAM(Quadrature Amplitude Modulation)调制技术可以提高数据传输速率。例如,题目(1)和(2)要求根据...

    第5章Intranet服务器.pptx

    第二种是直接使用`ifconfig`命令设置网卡属性,但这种配置仅是临时的。第三种则是修改配置文件,如`/etc/sysconfig/network-scripts/ifcfg-eth0`,然后重启网络服务使配置生效,这是最持久的方法。 RPM(Red Hat ...

    第7章 EJB技术.pdf

    ### 第7章 EJB技术详解 #### 一、EJB技术概述 **EJB(Enterprise JavaBeans)** 是一种基于Java平台的企业级应用组件模型,主要用于构建可扩展、可重用且高性能的分布式应用程序。EJB是J2EE(Java 2 Platform, ...

    Linux Kernel Networking Implementation and Theory

    - **第二章:Netlink Sockets** Netlink套接字是Linux内核中用于通信的一个特殊接口,主要负责用户空间与内核空间之间的通信。本章将详细介绍Netlink套接字的工作原理、消息格式以及如何使用它们进行编程。 - **第...

    【计算机网络】Computer-Network-Notes.zip

    **第二章 物理层** 物理层是OSI模型的最底层,负责数据的物理传输。这章涉及了物理介质(如双绞线、光纤、无线信号)、信号类型(模拟与数字)、传输速率(带宽)和接口标准(如RJ-45)。此外,还会讨论物理层的通信...

    Visual C 教学课件:第5章 MFC编程基础.ppt

    《Visual C++ MFC编程基础详解》 MFC,全称Microsoft Foundation Classes,是由微软公司提供的一个C++类库,用于简化Windows应用程序的开发。它将底层的Windows API进行了封装,使得开发者能够更加高效地创建窗口、...

    WCF培训资料以及说明

    ### 第二章 WCF的性能介绍 #### 第一节 WCF与以往的分布式技术有何区别 WCF通过提供更强大的配置选项和编程模型,使得服务可以更高效地处理消息。它支持多种传输协议和消息编码,比之前的Web服务更加灵活。 #### ...

    Linux程序设计 第四版 英文版 经典linux书籍 819页 pdf Beginning Linux Programming

    2. **第二章:Shell Programming(Shell编程)** - **主要内容**:教授如何使用Shell脚本进行简单的自动化任务。 - **知识点**: - Bash Shell基础语法 - 变量和条件语句 - 循环结构和函数定义 - 常用Shell...

Global site tag (gtag.js) - Google Analytics