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

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

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


     /* Session is not transacted;   

     *   uses AUTO_ACKNOWLEDGE for message  

     *  acknowledgement  

     */  

     session = connection。createSession(false; Session。AUTO_ACKNOWLEDGE);  



9。1。5 创建MessageProducer  



     在得到 Session        后,客户端程序使用 Session                    来创建 MessageProducer 。这个 

MessageProducer 对象用于向目的地发送消息。通过使用Session。createProducer 方法来创建 

MessageProducer,参数是消息被发送的目的地。  

     MessageProducer sender;  

     /* Value in stockQueue previously looked up in the JNDI  

     *  createProducer takes a Destination  

     */  

     sender = session。createProducer(stockQueue);  



9。1。6 创建MessageConsumer  



     消息可以被同步或异步的消费。这个例子展示了如何创建同步消费消息的消息消费者。 



                                                                                            56 / 66  

  


…………………………………………………………Page 57……………………………………………………………

                                                



参见9。3。1  “异步接收消息”了解如何异步消费消息。  

     MessageConsumer    用于从目的地接收消息,在这个例子中是“StockQueue ”。用 

Session。createConsumer 方法来创建MessageConsumer,参数是接收消息的目的地。  

     MessageConsumer receiver;  

     /* Value in stockQueue previously looked up in the JNDI  

     *  createConsumer takes a Destination  

     */  

     receiver = session。createConsumer(stockQueue);  



9。1。7 启动消息转发  



     到现在为止,消息的转发还是被禁止的,以便前面的设置不会被异步转发的消息打断。 

现在设置已经完成,可以告诉Connection 开始向MessageConsumer 转发消息了。  

     connection。start();  



9。1。8 使用TextMessage  



     有几个消息格式。在这个例子中,股票报价消息作为文本串被发送。客户端按文本串读 

取和展示这个消息。  

     下面的代码解释了如何创建这样的消息:  

     String        stockData;    /* Stock information as a string */  

     TextMessage   message;  

     /* Set the message’s text to be the stockData string */  

     message = session。createTextMessage();  

     message。setText(stockData);  



9。2  发送和接收消息  



     现在已经完成了Session 的设置,你可以发送和接收消息了。本节描述了如何:  

     z   创建消息  

     z    发送消息  

     z    同步接收消息  



9。2。1 发送消息  



     为了发送消息,使用MessageProducer。send 方法,参数是Message 对象。  

     /* Send the message */  

     sender。send(message);  



                                                                                       57 / 66  

  


…………………………………………………………Page 58……………………………………………………………

                                                     



9。2。2 同步接收消息  



     为了接收Queue 里的消息,你可以使用MessageConsumer。receive 方法。这个方法调用 

在消息到达Queue 之前可能阻塞。这个方法也可以用于从Topic  中接收消息。  

     TextMessage stockMessage;  

     stockMessage = (TextMessage)receiver。receive();  

     为了限制客户端阻塞的时间长度,使用 receive 方法的超时参数。如果在超时到期时还 

没有消息到达,那么receive 方法返回。超时参数按毫秒计时。  

     TextMessage stockMessage;  

     /* Wait 4 seconds for a message */  

     TextMessage = (TextMessage)receiver。receive(4000);  



9。2。3 解包TextMessage  



     股票报价信息使用 TextMessage                      发送。为了从消息中得到这个信息,使用 

TextMessage。getText 方法。它以字符串返回消息的内容。  

     String newStockData;    /* Stock information as a string */  

     newStockData = message。getText();  



9。3  其他消息特性  



     本节不仅提供了基本的消息功能,而且还描述了如何执行某些其他的公共消息功能:  

     z    创建异步MessageListener。  

     z    使用消息选择器过滤消息转发。  

     z    创建Topic 的永久订阅。  

     z    对使用永久订阅的Topic 进行重新连接。  



9。3。1 异步接收消息  



     为了在消息被转发到消息消费者时异步的接收消息,客户端程序需要创建实现了 

MessageListener     接口的消息监听器。本例中 MessageListener                               接口的实现称为 

StockListener。java,类似于下面的代码:  

     import javax。jms。*;  

     public class StockListener implements MessageListener   

     {  

     public void onMessage(Message message) {  

      /* Unpack and handle the messages received */  

     。。。  

     }  

       }  

     客户端程序按下面的方式将这个MessageListener 对象注册到MessageConsumer 对象:  



                                                                                               58 / 66  

  


…………………………………………………………Page 59……………………………………………………………

                                                         



      StockListener myListener = new StockListener();  

      /* Receiver is MessageConsumer object */  

      receiver。setMessageListener(myListener);  

      Connection  必须被启动以迎接开始的消息转发。当消息被发布到 Queue  时会异步的通 

知MessageListener。这通过MessageListener 接口的onMessage 方法实现。由客户端负责处 

理消息。  

      public void onMessage(Message message)   

      {  

      String newStockData;  

      /* Unpack and handle the messages received */  

      newStockData = message。getText();  

      if(。。。)  

      {  

       /* Logic related to the data */  

      }  

      }  



9。3。2 使用消息选择器  



      在这个例子中,客户端程序只对技术相关的股票感兴趣。消息的发送者向消息的属性中 

设置一个称为StockSector 的属性。它的值包括“Technology ”,“Financial”,“Manufacturing”; 

 “Emerging”和“Global ”。消息发送者通过使用Message。setStringProperty 方法来设置这些 

属性值。  

      String stockData;    /* Stock information as a String */  

      TextMessage message;  

      /* Set the message’s text to be the stockData string *  

      message = session。createTextMessage();  

      message。setText(stockData);  

      /* Set the message property ‘StockSector’  

      message。setStringProperty(〃StockSector〃; 〃Technology〃);  

      当接收股票报价消息客户端程序 MessageConsumer 被创建时,它可以创建一个消息选 

择器字符串来决定它将接收哪些消息。  

      String selector;  

      selector = new String(〃(StockSector = ‘Technology’)〃  

      这个字符串在创建MessageConsumer 时指定。  

      MessageConsumer receiver;  

      receiver = session。createConsumer(stockQueue; selector);  

      客户端程序只接收和Technology 相关的消息。  



9。3。3 使用永久订阅  



      永久订阅用于从Topic 接收消息。当JMS  客户端创建永久订阅时,客户端能够从Topic 

断开连接。当客户端程序重新连接时,它可以收到断开连接后到达的消息。在这个例子中, 



                                                                                                      59 / 66  

  


…………………………………………………………Page 60……………………………………………………………

                                                



Destination 提供对消息更新的通知。  



9。3。3。1 创建永久订阅  



     下面的例子创建了从Topic 获取消息的永久订阅。首先,客户端程序必须执行常规的设 

置步骤,查找ConnectionFactory 和Destination,创建Connection 和Session,如节9。1 “准备 

发送和接收消息”中所述。  

     import javax。naming。*;  

     import javax。jms。*;  

     /* Look up connection factory */  

     ConnectionFactory connectionFactory;  

     Context messaging = new InitialContext();  

     connectionFactory =   

     (ConnectionFactory) Messaging。lookup(〃ConnectionFactory〃)  

     /* Look up destination */  

     Topic newsFeedTopic;  

     newsFeedTopic = messaging。lookup(〃BreakingNews〃);  

     /* Create connection and session */  

     Connection connection;  

     Session session;  

     connection = ConnectionFactory。createConnection();  

     session = connection。createSession(false; Session。AUTO_ACKNOWLEDGE);  

     执行完常规的设置后,客户端程序可以创建到目的地的永久订阅者。使用 

session。createDurableSubscriber 来创建永久TopicSubscriber 。名字“mySubscription”用于标 

识永久订阅。  

     session。createDurableSubscriber(newsFeedTopic;〃mySubscription〃);  

     此时,客户端程序可以启动连接和开始接收消息。  



9。3。3。2 重新连接使用永久订阅的Topic  



     为了重新连接一个存在永久订阅的 Topic ,客户端程序可以简单的再次调用 

session。createDurableSubscriber,参数和以前的相同。客户端程序可以中断连接。使用永久 

订阅可以让从Topic 消费消息的客户端程序始终能够得到消息,即使客户端程序不是持续连 

接的。  

     /* Reconnect to a durable subscription */  

     session。createDurableSubscriber(newsFeedTopic; 〃mySubscription〃);  

     这将会重新建立客户端程序到Topic 的连接,并且转发客户端断开时到达的消息。但是 

需要知道几个重要的限制:  

     z   客户端必须使用同一个Connection 。  

     z   Destination 和订阅的名字必须和以前的一样。  

     z   如果指定了消息选择器,则它的名字也必须和以前的一样。  

     如果不能满足这些条件,那么永久订阅被删除,并创建一个新的订阅。  



                                                                                      60 / 66  

  


…………………………………………………………Page 61……………………………………………………………

                                                



9。4  JMS 消息类型  



     有五个 JMS      消息类型。本节提供了如何创建和解包每种消息类型的例子。在每个例子 

中,在消息中的数据都是与股票报价相关的数据。任何情况下,创建消息真正内容的代码都 

是可以忽略的。  



9。4。1 创建TextMessage  



     在这个例子中,股票报价信息作为 TextMessgae  被发送。TextMessage  携带了可以被客 

户端作为文本字符串读取的消息。  

     下面的代码解释了如何创建这样的消息:  

     String        stockData;    /* Stock information as a string */  

     TextMessage   message;  

     message = session。createTextMessage();  

     /* Set the stockData string to the message body */  

     message。setText(stockData);  



9。4。2 解包TextMessage  



     为了解包TextMessage ,客户端使用Message。getText 方法。  

     String stockInfo;    /* String to hold stock info */  

     stockInfo = message。getText();  



9。4。3 创建BytesMessage  



     股票报价信息可以以字节格式发送,服务器知道如何构造它,客户端知道如何作为股票 

报价来解析和展现它。它作为BytesMessage 被发送。  

     这样的消息可以按下面的方式来构造:  

     byte''            stockData;     /* Stock information as a byte array */  

     BytesMessage   message;  

     message = session。createBytesMessage();  

     message。writeBytes(stockData);  



9。4。4 解包BytesMessage  



     当收到BytesMessage 时,可以按照以下方式来解包:  

     byte''      stockInfo; /* Byte array to hold stock information */  

     int        length;  

     length = message。readBytes(stockData);  

     消息体被复制到字节数组。客户端程序然后可以开始读和解析数据。  



                                                                                       61 / 66  

  


…………………………………………………………Page 62……………………………………………………………

                                                    



9。4。5 创建MapMessage  



      由服务器发送的每个股票消息都可以是不同股票报价名字/ 值对的映射,使用 

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

     z    股票订价名称——String  

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