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

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

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




即设置。如果在这个时刻后再设置,则设置客户端标识就是程序性错误,将抛出 

IllegalStateException。  

    客户端标识的目的是将连接和它的对象与由提供商按客户端维护的状态关联起来。按照 

定义,被客户端标识标识的客户端状态在一个时刻只能由一个客户端“在用”。JMS  提供商 

必须防止并发执行的客户端来使用它。  

    阻止方式可以是当企图这样使用时抛出各种 JMSException              的形式;也可以阻塞后续的 

客户端;或者是其他的解决方案。JMS 提供商必须保证这种共享单个客户端状态的企图不能 

引起消息的丢失或重复处理。  

    由JMS 标识的唯一的单个客户端状态要支持长期订阅。  



4。3。3 Connection 设置  



    JMS  客户端通常创建一个 Connection,一个或多个Session  和大量的 MessageProducer 

和MessageConsumer。当Connection 被创建时,它处于stopped 模式。意思是没有消息可以 

转发给它。  

    通常会让昂Connection 处于停止模式直到设置完成。设置完成后调用Connection。start() 

方法,且消息开始到达 Connection       的消费者。这种设置约定减小了客户端还在设置它自己 

时就有异步消息转发的问题。  

    Connection 可以立即启动然后再进行设置。这样,客户端必须做好它们在设置过程中处 



                                                                   32 / 66  

  


…………………………………………………………Page 33……………………………………………………………

                                  



理异步消息转发的准备。  

   MessageProducer 可以在Connection 是停止时发送消息。  

   要注意,客户端必须在连接启动后它才能转发消息。JMS 提供商必须保证这种情况。  



4。3。4 中止消息的转发  



   连接对接收到的消息的转发可以使用 stop()方法被临时停止。可以使用 start()方法重新 

启动它。当连接被停止时,禁止向所有连接的 MessageConsumer 进行转发:同步接收被阻 

塞,消息不被转发到MessageListener。  

   停止连接对发送消息没有影响。停止一个已经停止的连接和启动一个已经启动的连接被 

忽略。  

   在消息的转发被停止后才能返回 stop  方法。这意味着停止后,不会调用任何消息监听 

器,并且所有的等待接收消息的控制线程在连接重新启动前不会返回消息。用于已停止连接 

的的接收计时器仍然有效,因此接收可能会超时并返回一个空消息。  

   如果stop 方法被调用时消息监听器(MessageListener)仍在运行,则必须在所有的监听器 

都返回后才能停止。当这些消息监听器将要完成时,他们必须拥有连接的所有服务。  



4。3。5 关闭Connection  



   由于提供商通常为Connection 分配JVM 外部的资源,因此客户端应当在它们不需要的 

时候关闭这些资源。依赖垃圾回收来回收这些资源可能不是非常及时。  

   关闭操作将终止所有连接会话消费者接收的未处理消息。接收可能返回一个消息也可能 

返回null,这要根据关闭时刻是否可以获得一个消息。  

   注意,在这种情况下,如果消息消费者企图用这个关闭的连接来处理最后的消息,它很 

可能会得到一个异常。开发者在写消息消费者的时候必须考虑这种“最后的消息”。必须再 

次强调,消息消费者不能依靠空返回值来判断“最后的消息”。  

   如果一个或多个消息监听器在连接关闭被调用时正在处理消息,那么在控制没有返回给 

JMS 提供商之前就必须保持连接和会话的所有功能都可以被那些监听器获得。  

   当连接被关闭时,直到消息处理按顺序都被停止后关闭方法才能返回。这意味着所有正 

在运行的消息监听器已经返回且所有未处理的接收已经返回。  

   如果连接被关闭,不需要关闭它的组成对象。连接关闭足以通知 JMS                 提供商应当释放 

连接的所有资源。  

   关闭连接必须回滚处于处理的交易会话中的事务(注:术语“交易会话”指的是会话的 

提交和回滚方法用于分割会话的本地事务。在这种情况下会话的工作和外部的事务管理器的 

工作是一致的,此时不使用会话的提交和回滚方法,被关闭的会话的工作的结果随后由事务 

管理器决定。)。关闭连接不会强迫客户端确认会话的确认。调用来自已关闭的会话的已接收 

消息的acknowledge 方法必须抛出IllegalStateException。对于那些要求由JMS 客户端连续可 

靠处理的队列和长期订阅来说,这些语义保证关闭连接不会造成消息的丢失。  

   一旦连接被关闭,企图使用它或它的会话或它们的消息消费者和生产者必须抛出 

IllegalStateException  (必须忽略对这些对象的close 方法的调用)。但继续使用通过这个连接 

创建或接收的消息对象仍是有效的,除了已接收消息的acknowledge 方法。  

   关闭一个已关闭的连接不必抛出异常。  



                                                            33 / 66  

  


…………………………………………………………Page 34……………………………………………………………

                                       



4。3。6 会话(Session)  



    Connection 是Session 的工厂,它底层使用对JMS 提供商的连接来生产和消费消息。  



4。3。7 ConnectionMetaData  



    Connection 提供ConnectionMetaData 对象。这个对象提供了提供商支持的JMS  的最新 

版本和提供商的产品名和版本。  

    它也提供了连接支持的JMS 定义的属性名列表。  



4。3。8 ExceptionListener  



    如果JMS 提供商检测到与连接有关的问题,那么它将通知连接的ExceptionListener,如 

果它已经被注册。为了取出ExceptionListener,JMS 提供商调用连接的getExceptionListener() 

方法。这个方法返回这个连接的ExceptionListener。如果没有注册ExceptionListener,则返回 

null 。连接然后可以通过调用监听器的 onException()方法来使用监听器,传入描述问题的 

JMSException 。  

    这可以让客户端异步通知问题。某些连接只消费消息,因此它们没有其他途径来获知它 

们的连接已经失败。  

    连接序列化ExceptionListener 的执行。  

    JMS 提供商应当在通知客户端之前尽力解决连接问题。  

    转发到ExceptionListener 的异常是那些没有其他地方可报告的异常。如果在JMS 调用连 

接时抛出异常,按照定义不会将这个异常转发给 ExceptionListener                       (换句话说, 

ExceptionListener 不是用于监听由连接抛出的所有异常)。  



4。4  Session  



    JMS Session  是一个单线程的上下文(对能够使用会话对象或它创建的线程的数量没有 

限制。限制是会话的资源不应当被多个线程并发使用。这由用户来保证满足这个限制。最简 

单的方式是使用一个线程。在异步转发的情况下,使用一个线程来设置停止模式然后启动异 

步转发。在更复杂的情况下,用户必须提供显式的同步。),用于生产和消费消息。尽管会话 

可以给提供商分配JVM 外部的资源,但是它被看作是轻量JMS 对象。  

    Seesion 用于几个目的:  

    z   它是MessageProducer 和MessageConsumer 的工厂。  

    z   它是TemporaryTopic 和TemporaryQueue 的工厂。  

    z   它为需要动态操纵提供商专有目的地名字的客户端提供了一种创建Queue 或Topic 

        对象的途径。  

    z   它提供了提供商优化后的消息工厂。  

    z   它支持事务串,这些事务将跨会话生产者和消费者的工作组合成原子单元。  

    z   它为它消费的消息和它生产的消息定义了一个连续的顺序。  

    z   它保留它消费的消息直到这些消息被确认。  



                                                                      34 / 66  

  


…………………………………………………………Page 35……………………………………………………………

                                    



    z  它序列化注册到它的MessageListener 的执行。  

    z  它是QueueBrowser 的工厂。  



4。4。1 关闭会话  



    由于提供商可以代表会话分配位于JVM  之外的资源,客户端应当在这些资源不需要的 

时候关闭它们。依靠垃圾回收来最终回收它们不是非常及时的。对于由会话创建的 

MessageProducer 和MessageConsumer 来说同样需要这样做。  

    关闭会话会中止这个会话上的所有消息处理。它必须处理由会话消费者未处理的接收或 

正在运行的消息监听器的关闭,正如在节4。3。5  “关闭连接”中所述。  

    关闭会话的方法可以从一个不同于当前控制这个会话的控制线程调用。  

    当会话关闭被调用时,在消息处理被按顺序停止前关闭方法不能返回。这意味着不会有 

消息监听器正在运行,且如果有未处理的接收,则它返回null 或者一个消息。  

    当会话被关闭时,不需要关闭它的消息生产者和消费者。会话关闭足够通知 JMS                        提供 

商释放会话的所有资源。  

    关闭有事务的会话必须回滚处理中的事务。关闭客户端确认的会话不强迫确认。  

    一旦会话被关闭,那么企图使用它或它的消费者和生产者必须跑出IllegalStateException 

 (必须忽略对这些对象close  方法的调用)。继续使用通过这个会话创建或接收的消息对象 

是有效的,除了已接收消息的acknoledge 方法。  

    关闭一个已关闭的会话不能抛出异常。  



4。4。2 创建MessageProducer 和MessageConsumer  



    会话可以创建和服务于多个 MessageProducer         和 MessageConsumer 。参见节 4。5 

 “MessageConsumer”和节4。6  “MessageProducer”了解创建和使用它们的详细信息。  

    尽管会话可以创建多个生产者和消费者,它们必须依次使用。在效果上,只有一个逻辑 

控制线程可以使用它们。这在后面会详细的解释。  



4。4。3 创建临时目的地  



    尽管会话被用于创建临时目的地,这只是为了方便。它们的范围实际上是整个连接。它 

们的生命周期与连接相同,连接的所有会话都可以创建临时目的地的MessageConsumer。  

    临时目的地(Te
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!