友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

JMS简明教程(PDF格式)-第11章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




的Boolean 的valueOf(String)转换一样。  

     企图读取 null       值作为 java      的原始类型必须看作用 null                值调用原始类型对应的 

valueOf(String)方法。由于char 不支持String 转换,因此企图读取null 值作为char 必须抛出 

NullPointerException。  

     用名字获取还没有被设值的MapMessage 字段按照null 值处理。  

     如果 StreamMessage      好哦 BytesMessage      的读方法抛出 MessageFormatException            或 

NumberFormatException,那么不能增加读指针所在的位置。随后的读必须能够通过重读数 

据作为不同的类型而从异常中恢复。  

     用行类型写的值可能被读作列类型。  

                       表3�7 用于StreamMessage 和MapMessage 的转换  



          boolean  byte  short  char          int   long     float  double  String  Byte'' 



boolean      ×                                                                 ×           



  byte                ×       ×               ×       ×                        ×           



  short                       ×               ×       ×                        ×           



  char                                 ×                                       ×           



   int                                        ×       ×                        ×           



  long                                                ×                        ×           



  float                                                       ×        ×       ×           



 double                                                                ×       ×           



 String      ×        ×       ×               ×       ×       ×        ×       ×           



 byte''                                                                                 ×  



3。11。4 用于非JMS 客户端的消息  



     很多企业消息系统支持自定义的 Stream 和/或 map 本地消息类型。尽管客户端可以使 

用BytesMessage 来构造这种形式的本地消息,但JMS 为StreamMessage 和MapMessage 类 

型提供了更加方便的API 。  

     例如,当客户端使用支持本地消息的JMS 提供商,且它希望发送既能被JMS 客户端又 

能被本地客户端读取的map 消息时,它是由MapMessage。当消息被发送时,提供商将它转 

换成本地格式。本地客户端然后就可以接收它。如果 JMS                                提供商接收它,那么提供商将它 



                                                                                      29 / 66  

  


…………………………………………………………Page 30……………………………………………………………

                                    



转换回MapMessage。  

    即使实现使用新定义的消息的新 JMS           应用时,应用可以选择使用 StreamMessage        和 

MapMessage 来保证非JMS 客户端能够读取消息。  

    如果JMS 客户端发送StreamMessage 或MapMessage,那么它必须被接收JMS 提供商转 

换成一个等价的StreamMessage 或MapMessage。当在JMS 客户端间传递时,消息必须保持 

它全部的格式。例如,作为MapMessage 发生的消息不能作为BytesMessage 消息被接收。  

    如果 JMS  提供商接收一个由本地客户端创建的消息,那么提供商应当将它尽力转换成 

 “最佳的”JMS 消息类型。例如,如果是本地流消息,那么它应当被转换成StreamMessage 。 

如果转换不了,那么提供商总能够将它转换成BytesMessage。  



3。12  JMS Message 接口的提供商实现  



    JMS 提供了一系列消息接口,这些接口定义了JMS 消息模型。它没有提供这些接口的实 

现。  

    每个 JMS  提供商提供它自己的会话的消息创建方法的实现。这可以让提供商来使用满 

足它需要的消息实现。  

    提供商必须能够从客户端接收不是它自己的消息实现。提供商可以不高效的处理外来消 

息实现,但它必须处理。  

    当提供商处理外来消息实现时需要注意下面的例外情况。如果外来消息实现包含 

JMSReplyTo 头字段,这个字段设置了外来地址实现,那么不要求提供商处理或保存这个头字 

段的值。  

    JMS 消息接口提供了写/set 方法来设置消息体内和消息属性内的对象的值。所有的这些 

方法必须复制它们输入的对象,然后放进消息中。输入对象的值可以是null,当获取时返回 

null 。一个例外是 BytesMessage  不支持空流的概念,因此企图向他写 null             则必须抛出 

java。lang。NullPointerException 。  

    JMS 消息接口提供读/get 方法来访问消息体和消息属性内的对象。所有的这些方法必须 

返回要获取对象的拷贝。  



4  JMS 公共工具  



4。1  概述  



    本章描述了在PTP 和Pub/Sub 域间共享的JMS 工具。  



4。2  受管理的对象  



    JMS  受管理的对象是那些包含JMS 配置信息的对象,这些配置信息由JMS  管理员创建 

然后由客户端使用。它们实际管理企业中的JMS 应用。  

    尽管受管理对象的接口不显式的依赖JNDI ,但JMS 为了JMS 客户端通过JNDI 查找的方 

便而设置了这个方便性。  

    管理员可以将受管理对象放到命名空间的任何位置。JMS 没有定义命名策略。  

                                                                 30 / 66  

  


…………………………………………………………Page 31……………………………………………………………

                                      



    区分JMS 和管理提供了几个好处:  

    z  它对客户端隐藏了提供商特有的配置信息。  

    z  他将JMS 可管理的信息抽象成容易被通用管理控制台组织和管理的java 对象。  

    z   由于有JNDI 提供商提供所有流行的命名服务,那么这意味着JMS 提供商可以转发 

       一个受管理对象的实现,这些对象可以运行在任何地方。  

    受管理对象不能持有任何远程资源。它的lookup 不应当使用远程资源,除了有JNDI  自 

己使用的资源以外。  

    客户端应当把受管理的对象看作是本地 java             对象。查找它们不应有任何隐藏边际影响 

或使用大量的本地资源。  

    JMS 定义了两个手管理对象,Destination 和ConnectionFactory 。  

    期望JMS  提供商为管理员提供创建和在JNDI  命名空间中配置受管理对象的工具。JMS 

提供商提供的手管理对象的实现应当是既javax。naming。Referencealbe 又java。io。Serializable 的, 

以便它们能够被存储在所有的JNDI 命名上下文中。另外,建议这些实现遵循JavaBean 的设 

计模式。  



4。2。1 Destination  



    JMS 没有定义标准的地址语法。尽管考虑到了,但在现存的地址语义有很大差别的企业 

消息产品间寻求一个单一的语法是不可能的。因此,JMS  定义了 Destination 对象来封装提 

供商特有的地址作为替代方案。  

    由于 Destination  是一个受管理对象,因此它可以包含除了地址外的提供商特有的配置 

信息。  

    JMS 也支持客户端使用提供商特有的地址名称。参加节4。4。4  “创建Destination 对象” 

了解更详细的信息。  

    Destination 支持并发使用。  



4。2。2 ConnectionFactory  



    ConnectionFactory 封装了一系列连接配置参数,这些参数由管理员定义。客户端使用它 

来创建和JMS 提供商的连接。  

    ConnectionFactory 对象支持并发使用。  



4。3  Connection  



    JMS Connection 是一个客户端到JMS 提供商间的活动连接。它通常分配在Java 虚拟机 

外部的提供商的资源。  

    Connection 对象支持并发使用。  

    Connection 用作几个目的:  

    z  它封装了一个与 JMS  提供商的连接。他通常代表一个在提供商服务域和客户端间 

       的打开的TCP/IP Socket 。  

    z  在客户端授权时创建它。  

    z  它可以指定一个唯一的客户端标识。  



                                                                    31 / 66  

  


…………………………………………………………Page 32……………………………………………………………

                                      



    z  它创建Session 对象。  

    z  它提供ConnectionMetaData 。  

    z  它支持可选的ExceptionListener。  

    由于在创建Connection 时设置授权和通讯,因此Connection 相对是重量级的JMS 对象。 

大多数客户端使用一个连接来执行所有的消息动作。其他更先进的应用可以使用多个 

Connection 。JMS 使用多个连接不是架构方面的原因(除了当客户端作为两个不同提供商间 

的网关时);但是可能有操作方面的原因。  



4。3。1 授权  



    当创建连接时,客户端可以指定它的信任状如用户名/密码。  

    如果没有指定信任状,那么使用当前线程的信任状。这一点上,JDK 没有定义线程缺省 

信任状的概念。但是在不久的将来可能会定义。目前,可以使用 JMS                       客户端运行使用的用 

户标识。  



4。3。2 客户端标识  



    设置客户端标识的最好方式是将它配置在一个客户端特有的 ConnectionFactory                  中,然 

后透明的将它赋给它创建的连接。另一个方法就是客户端可以用提供商特有的值来设置连接 

的客户端标识。显式地设置连接的客户端标识的工具不是一个用于覆盖已经被配置的标识的 

机制。它只是用于管理员没有配置标识的情况。如果标识已经存在,那么企图更改它必须抛 

出IllegalStateException。  

    如果客户端显式地设置标识,那么它必须在创建连接后和在连接上发生其他动作之前立 

即设置。如果在这个时刻后再设置,则设置客户端标识就是程序性错误,将抛�
返回目录 上一页 下一页 回到顶部 赞(0) 踩(0)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!