友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

JMS简明教程(PDF格式)-第15部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!


MapMessage。例如,它可以包含以下条目:  

     z    股票订价名称——String  

     z    当前的值——double  

     z    订价时间——long  

     z    最后更新——double  

     z    股票信息——String  

     为了构造MapMessage,客户端程序使用不同的与MapMessage 关联的set 方法(setString, 

setLong 等等),并在MapMessage 中设置命名的值。  

     String stockName;     /* Name of the stock */  

     double stockValue;    /* Current value of the stock */  

     long   stockTime;      /* Time the stock quote was updated */  

     double stockDiff;     /* the +/hange in the stock quote*/  

     String stockInfo;     /* Other information on this stock */  

     MapMessage message;  

     message = session。createMapMessage();  

     注意,下面的设置可以按任何顺序进行:  

     /* First parameter is the name of the map element;   

     *  second is the value  

     */  

     message。setString(〃Name〃;   〃SUNW〃);  

     message。setDouble(〃Value〃; stockValue);  

     message。setLong(〃Time〃;    stockTime);  

     message。setDouble(〃Diff〃;  stockDiff);  

     message。setString(〃Info〃;    〃Recent  server  announcement  causes  market                  

interest〃);  



9。4。6 解包MapMessage  



     为了解包MapMessage,客户端程序使用不同的与MapMessage 相关的get 方法来获取 

MapMessage 各元素的值。在下面的例子中,客户端程序希望得到某些MapMessage 元素。  

     String stockName;      /*Name of the stock */  

     double stockValue;     /* Current value of the stock */  

     long   stockTime;      /* Time of the stock update */  

     double stockDiff;      /* +/hange in the stock */  

     String stockInfo;      /* Information on this stock */  

     通过使用 get         方法和提供期望的值的名字从消息中取出的数据。可以按任意顺序从 

MapMessage 中得到它的元素。  

     stockName  = message。getString(〃Name〃);  

     stockDiff  = message。getDouble(〃Diff〃);  

     stockValue = message。getDouble(〃Value〃);  



                                                                                               62 / 66  

  


…………………………………………………………Page 63……………………………………………………………

                                                   



     stockTime  = message。getLong(〃Time〃);  

     如果客户端需要得到 MapMessage                            的元素列表,那么它可以使用 

MapMessage。getMapNames 方法。  



9。4。7 创建StreamMessage  



     与MapMessage 类似,应用可以发送由按序写入消息的不同字段组成的消息,每个字段 

都是原始数据类型。使用StreamMessage 来实现。下面的原始类型赋给股票报价消息的每一 

项。  

     z    股票订价名称——String  

     z    当前的值——double  

     z    订价时间——long  

     z    最后更新——double  

     z    股票信息——String  

     客户端可能只对某些消息字段感兴趣,但在使用StreamMessage 的情况下,客户端必须 

按顺序读并暗地抛弃每个字段。  

     在下面的例子中,已经设置了下面字段的值:  

     String stockName;      /* Name of the stock */  

     double stockValue;     /* Current value of the stock */  

     long   stockTime;      /* Time of the stock update */  

     double stockDiff;      /* +/hange in the stock quote */  

     String stockInfo;      /* Information on this stock*/  

     StreamMessage message;  

     /* Create message */  

     message = session。createStreamMessage();  

     下面的元素必须按照它们被读取的顺序写入StreamMessage 。注意,它们不是单独命名 

的属性,和MapMessage 中一样。  

     /* Set data for message */  

     message。writeString(stockName);  

     message。writeDouble(stockValue);   

     message。writeLong(stockTime);   

     message。writeDouble(stockDiff);   

     message。writeString(stockInfo);  



9。4。8 解包StreamMessage  



     StreamMessage 的元素必须按照写入的顺序被读取。  

     String stockName;      /* Name of the stock quote */  

     double stockValue;     /* Current value of the stock */  

     long   stockTime;      /* Time of the stock update */  

     double stockDiff;      /* +/hange in the stock quote */  

     String stockInfo;      /* Information on this stock */  

     stockName  = message。readString();  



                                                                                           63 / 66  

  


…………………………………………………………Page 64……………………………………………………………

                                                        



      stockValue = message。readDouble();  

      stockTime  = message。readLong();  

      stockDiff  = message。readDouble();  

      stockInfo  = message。readString();  



9。4。9 创建ObjectMessage  



      股票信息可以以特殊的 StockObject                          对象的形式被发送。这个对象然后作为 

ObjectMessage 的消息体被发送。ObjectMessage 可以用于发送java 对象。  

      使用那些StockObject 实现中互不重复的方法来设置这些值。例如,StockObject 可以有 

设置不同数据值的方法。使用StockObject 的应用可能看起来类似如下代码:  

      String stockName;      /* Name of the stock quote */  

      double stockValue;     /* Current value of the stock */  

      long   stockTime;      /* Time of the stock update */  

      double stockDiff;      /* +/hange in the stock quote */  

      String stockInfo;      /* Information on this stock */  

     /* Create a StockObject */  

      StockObject stockObject = new StockObject();  

     /* Establish the values for the StockObject */  

      stockObject。setName(stockName);   

      stockObject。setValue(stockValue);   

      stockObject。setTime(stockTime);   

      stockObject。setDiff(stockDiff);   

      stockObject。setInfo(stockInfo);  

      为了创建ObjectMessage,将StockObject 传入消息,你将按下面的方式来实现:  

     /* Create an ObjectMessage */  

      ObjectMessage message;  

      message = session。createObjectMessage();  

     /* Set the body of the message to the StockObject */  

      message。setObject(stockObject);  



9。4。10 解包ObjectMessage  



      为了解包ObjectMessage,使用ObjectMessage。getObject 方法来得到对象。一旦对象被 

取出,客户端应用使用与对象类型匹配的方法从对象中取出数据。  

      StockObject stockObject;  

     /* Retrieve the StockObject from the message */  

      stockObject = (StockObject)message。getObject();  

     /* Extract data from the StockObject by using StockObject methods */  

      String stockName;      /* Name of the stock quote */  

      double stockValue;     /* Current value of the stock */  

      long   stockTime;      /* Time of the stock update */  

      double stockDiff;      /* +/hange in the stock quote */  



                                                                                                      64 / 66  

  


…………………………………………………………Page 65……………………………………………………………

                                            



    String stockInfo;      /* Information on this stock */  

    stockName =  stockObject。getName();  

    stockValue = stockObject。getValue();  

    stockTime =  stockObject。getTime();  

    stockDiff =  stockObject。getDiff();  

    stockInfo =  stockObject。getInfo();  



10       问题  



10。1   已解决的问题  



10。1。1 JDK1。1。x 兼容性  



    JMS 兼容JDK1。1。x 。  



10。1。2 分布式Java 事件模型  



    一般情况下,JMS 可以被用作通知服务;但是它没有定义java 事件的分布版本。  

    实现分布式Java 事件的一个替代方案是将事件作为JavaBean 通过JMS 透明地分发它, 

这种分发对事件的生产者和监听器bean 是透明的。  



10。1。3 可以合并JMS 的两个域PTP 和Pub/Sub 吗?  



    尽管有许多类似点,提供分离的域似乎仍然是重要的。  

    这意味着供应商不必支持超出域的那些工具,且产品完全支持一个域会使客户端代码有 

更好的移植性(相对于对合并域的子集做比较少的支持)。  



10。1。4 JMS 应当指定一个JMS JavaBean 集合吗?  



    JMS 是一个底层API ,和其它的Java 底层API 一样,它不直接作为JavaBean 出现。  



10。1。5 与CORBA 通知服务对齐  



    通知服务增加了过滤、转发保证语义、永久连接和对 CORBA 事件服务的事件网络的组 

装。它从CORBA 消息服务得到它的转发保证语义(这个服务定义了异步CORBA 方法调用)。  

    Java 技术可以和CORBA 很好的集成。它提供了Java IDL 和COS 命名。另外,OMG 最近 

定义了基于IIOP 的RMI。  

    在Java  中期望通过RMI 来使用IIOP。希望通过JNDI 来使用COS 命名。JMS 是Java API , 



                                                                               65 / 66  

  


…………………………………………………………Page 66……………………………………………………………

                                   



它设计的目标是架构在现存的和将来的MOM 系统之上的一层API (就像JNDI 是位于现存的 

命名和目录服务至上)。  



10。1。6 JMS 应当提供端对端的同步消息转发和转发通知吗?  



   某些消息系统将向目的地同步转发作为实现可靠应用的机制来提供。某些系统向客户端 

提供不同形式的转发通知来让客户端可以检测丢弃或忽略的消息。这都不是 JMS                      定义的模 

型。  

   JMS 通过PERSISTNECT 消息的一次只有一个的转发语义提供了转发保证。另外,消息消 

费者通过使用CLIENT_ACKNOWLEDGE 模式或事务性会话可以保证消息的可靠处理。  

   这样就可以使用最小的同步达到可靠的转发,并且这是大多数供应商和开发者喜欢的企 

业消息模型。  

   JMS 没有定义系统消息的模式(Schema )(例如转发通知)。如果应用需要对这些消息 

接收进行确认,那么它可以定义应用级的消息确认。  

   当在Pub/Sub 应用的上下文中检验这些问题时,它们可以更好理解。在这个上下文中, 

同步转发和/或接收的系统确认都不是实现可靠应用有效的机制(因为按照定义,生产者不 

负责也不想负责端对端(End to End)的消息转发)。  



10。1。7 JMS 应当提供发送到列表的机制吗?  



    目前,JMS 提供了大量的消息发送选项;但是消息一次只能被发送到一个目的地。  

   发送到列表的好处是简化了程序员的工作,且潜在地可以让 JMS  提供商优化向多个目 

的地发送同一个消息。  

   发送到列表机制的缺点是列表效果上是客户端实现和维护的一个组。这复杂了 JMS  客 

户端的管理。  

   JMS 提供发送到列表的机制的替代方案,推荐提供商支持代表一个组的目的地。这可以 

让客户端只要一个发送就可以到达多个消费者,但要保证组受到妥善的管理。  



10。1。8 JMS 应当提供订阅通知吗?  



   如果发布者能够检测到订阅者什么时候存在,那么它可以禁止想未订阅的主题上发布消 

息。  

   尽管为发布者提供禁止向未订阅的主题上发布消息的机制有一些好处,但这将增加JMS 

的复杂性,且它给提供商增加的工作量大于了它得到的好处。反而,JMS 提供商应当保证最 

小化处理发布到未订阅主题的消息的负载。  



11     变更历史  



   略。  



                                                             66 / 66  

  


………………………………………………………………………用户上传之内容结束……………………………………………………………………………………

返回目录 上一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!