快速业务通道

关于JMS Message Pending的问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

关于JMS Message Pending的问题

时间:2011-10-02 blogjava fjin

前段时间,有同事跟我说客户那边有很多状态为receive的message,这些message只有在JMS Server或 weblogic Server充启之后才能被消费。经过调查后,这个问题可能是weblogic的一个bug,当然也不排除 跟具体环境有关的可能。下面我们来看看问题的根本原因是什么,这种分析有助我们更进一步理解 weblogic JMS的实现。

首先我们看一下什么是receive,receive表示一个message已经被consumer消费,但服务端还没有关于 这个message的ack,所以消息不能从queue中删除, 由于queue中的消息是point-2-point的,所以某个消 息被标为receive后,这个消息自然不能被其他consumer消费。那么这个ack由谁负责发送给Server呢,什 么时候发送呢?这些都由我们创建JMS Session时使用的Ack_mode决定,典型的ack-mode有如下两种:

auto-ack: 自动响应模式,consumer.receive()调用后,如果服务器端发现有可用的message,消息返 回到客户端JMS实现层,在消息返回给客户前,由weblogic client (JMSSession.getAsyncMessageForConsumer(),异步接受,比如MessageListener,或 JMSSession.receiveMessage(),同步接受)层实现直接调用acknowledge()通知服务器端,服务器端收到 ack后,它会负责负责将处于receive的message从物理queue中删除。

client-ack: 客户响应模式,consumer.receive()调用后,客户端收到消息后,客户端程序决定什么 时候发送ack,可以在消息后立即发送,也可以在消息处理成功后发送,ack的发送通过 message.acknowledge()实现。后面的过程和auto-ack相同。

初看这个问题,感觉是ack没有收到,那么什么情况下会出现ack丢失呢?网络问题? 那么客户端或服 务器端的server log应该能够看到异常,客户坚持说没有任何异常。有点不可思议,要了客户的代码,他 们没有代码,实际上他们的应用是基于Spring Framework的,通过简单的配置来实现他们的业务需要,看 了下Spring的相关代码,客户之所以说没有异常,因为Spring catch了服务器端返回的JMSException,并 吃掉了这个异常(即异常没有打印出来),这个异常输出是可以通过Spring的配置来实现。客户配置后, 给了我具体的异常,如下:

关于JMS Message Pending的问题(2)

时间:2011-10-02 blogjava fjin

java.lang.IllegalArgumentException: Delay is negative.         at weblogic.timers.internal.TimerManagerImpl.schedule(TimerManagerImpl.java:388)          at weblogic.timers.internal.TimerManagerImpl.schedule(TimerManagerImpl.java:340)          at weblogic.messaging.kernel.internal.ReceiveRequestImpl.<init> (ReceiveRequestImp l.java:98)         at weblogic.messaging.kernel.internal.QueueImpl.receive(QueueImpl.java:820)         at weblogic.jms.backend.BEConsumerImpl.blockingReceiveStart(BEConsumerImpl.java:1 172)          at weblogic.jms.backend.BEConsumerImpl.receive(BEConsumerImpl.java:1383)          at weblogic.jms.backend.BEConsumerImpl.invoke(BEConsumerImpl.java:1088)          at weblogic.messaging.dispatcher.Request.wrappedFiniteStateMachine(Request.java:7 59)         at weblogic.messaging.dispatcher.DispatcherImpl.dispatchAsyncInternal (DispatcherI mpl.java:129)         at weblogic.messaging.dispatcher.DispatcherImpl.dispatchAsync(DispatcherImpl.java :112)          at weblogic.messaging.dispatcher.Reques

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号