快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
,它会根据传进来的参数,初始化一个ReceiveRequestImpl对象。

|

ReceiveRequestImpl.new(),这个new代表ReceiveRequestImpl的构造函数。

|

QueueImpl.get(...),如果timeout = 0,即如果客户调用的是receiveNoWait的话,我们直接去通过 QueueImpl.get(...),如果没有match的message,那么直接将新建request的result设定为no result,否 则将match的message设定为result。

QueueImpl.addReader(receiveRequestImpl),如果timeout != 0,我们会在 ReceiveRequestImpl.start()中调用QueueImpl.addReader(),addReader()中同样会通过QueueImpl.get ()检查是否有match的message,如果找到相应的message,我们会把message reference状态改为receive。

TimerManagerImpl.schedule(timeout),如果QueueImpl.addReader()中的QueueImpl.get()没有找到 相应的message,我们需要等待(依据客户指定的timeout),这个等待通过timer去实现,如下:

timer = timerManager.schedule(this, timeout);

指定的timeout到达后,如果和没有可用的message,no result将被返回。从上面的异常堆栈来看,问 题就出在这里,如果timeout为负数,timerMangerImpl在启动trigger的时候,会抛出如下的 runtimeException,

java.lang.IllegalArgumentException: Delay is negative.

关于JMS Message Pending的问题(4)

时间:2011-10-02 blogjava fjin

也许你会疑问,这没什么问题吧,timerTrigger只有在没有message的时候才会被schedule,既然没有 message,那有谈何状态receive message?没错,起timerTrigger之前我们的确没有修改message状态, 但你注意到没有,我们在起timerTrigger前,把receiveRequestImpl加入到QueueImpl去了,但我们在碰 到IllegalArgumentException时并没有把这个receiveRequestImpl从QueueImpl中删除,问题就在这里。

 1   synchronized void addReader(Reader reader) throws KernelException {   2  3     List list = get(..);  4     int newCount;  5     if (list != null) {  6  7     } else {  8       reader.incrementReserveCount(- reservedCount);  9       newCount = reader.getCount(); 10     } 11      if (newCount > 0) { 12       logger.debug("Adding consumer to reader list"); 13       readerList.add(reader); 14     } 15   }

如果我们不把receiveRequestImpl从QueueImpl的readerList中删除,那么如果过一会有message sender发送一条和我们上述请求match的message到这个queue。weblogic收到这个message后,它会检查 readerList,如果这个message match某个reader,我们会把message状态改成receive,当由于 IllegalArgumentException,客户端收到它的时候,客户端会close JMSSession,也就是说这个消息虽然 有reader,但无法deliver到客户端。

我们再来看看Weblogic JMS sender的相关流程,

QueueImpl.messageSendComplete(),消息发送过程结束后(比如涉及store的话,消息此时已经被存储 ),到这一步的话,我们会调整系统接受的消息数,然后通过makeMessageAvailable()把消息标成 visiable或deliver给正在等待的reader。

QueueImpl.makeMessageAvailable(),它会直接调用match()去检查readerList中是否存在正在等待它 的reader。

QueueImpl.match(),它通过finderReader()从readerList中检查reader,如果有符合条件的reader, 它会把这个message标志为receive,同时把这个message挪到pending list中去。

前面我们说了,虽然reader还在,但与之对应的JMSConsumer已经被close,所以这个消息根本就无法 deliver出

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号