快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
t.dispatchAsync(Request.java:1046)          at weblogic.jms.dispatcher.Request.dispatchAsync(Request.java:72)          at weblogic.jms.frontend.FEConsumer.receive(FEConsumer.java:557)         at weblogic.jms.frontend.FEConsumer.invoke(FEConsumer.java:806)         at weblogic.messaging.dispatcher.Request.wrappedFiniteStateMachine(Request.java:7 59)          at weblogic.messaging.dispatcher.DispatcherServerRef.invoke(DispatcherServerRef.j ava:276)         at weblogic.messaging.dispatcher.DispatcherServerRef.handleRequest(DispatcherServ erRef.java:141)         at weblogic.messaging.dispatcher.DispatcherServerRef.access$000(DispatcherServerR ef.java:36)         at weblogic.messaging.dispatcher.DispatcherServerRef$2.run (DispatcherServerRef.ja va:112)         at weblogic.work.ExecuteThread.execute (ExecuteThread.java:209)         at weblogic.work.ExecuteThread.run (ExecuteThread.java:181)

现在我们看一下Weblogic JMS的receive的基本流程,看看这个exception为什么会被抛出来。

JMSConsumer.receive(long timewait),客户端发起receive请求,其中timewait可有可无,不做指定 的话,说明没有可用消息到达的话,我们会一直等下去。如要不作等待的话,可以使用receiveNoWait() 。receive()中会检查timeout值,如果没有指定timeout,那么Long.maxValue会被设定成这个timeout, 如果timeout小于0,客户端将会收到Invalid Timeout异常,接下来请求会被delegate到JMSSession。

|

JMSSession.receiveMessage(consumer,timeout),这里timeout会被重新计算,然后我们会创建一个 FEConsumerReceiveRequest对象。这个对象中包含计算后的timeout,计算后的timeout应该是个非负值( 上面的异常就是这里的计算导致的,至于为什么客户指定的timeout为1,计算后的timeout变成了负数, 从而导致上面的异常,从代码层面,看不出有什么问题)。FEConsumerReceiveRequest对象创建后,由JMS FrontEnd Dispatcher负责把请求交给后端的JMS Server,Dispatcher是Weblogic JMS中用于负责请求传 输的,它依赖于RJVM layer,这里不做赘述。

|

RJVM layer, 负责RMI socket层的数据发送

|

关于JMS Message Pending的问题(3)

时间:2011-10-02 blogjava fjin

FEConsumer.receive(invocableRequest),RJVM层处理完socket数据后,请求会被转给JMSConsumer, JMSConsumer通过状态机(state machine)来控制请求处理,没有过多的逻辑,它会基于收到的receive request创建一个BEConsumerReceiveRequest对象,然后把这个请求通过JMS BackEnd Dispatcher转发给 BEConsumerImpl。之所以存在FrontEnd /BackEnd Dispatcher,主要考虑到处理请求的server和queue所 在的不是同一server。

|

BEConsumerImpl.receive(request),request进入BEConsumerImpl后,它也通过state machine来控制 请求处理,下面两个方法在调用过程中被顺序调用,

BEConsumerImpl.blockingReceiveStart(request),这里首先检查timeout值,然后调用 QueueImpl.receive(...)从queue中获取message,receive()的具体参数如下,包括timeout, expression(即检查条件,我们定义的message selector就在其中)。

BEConsumerImpl.blockingReceiveProcessMessage(request)

BEConsumerImpl.blockingReceiveComplete(request)

|

QueueImpl.receive(expression,count,acknowledge,owner,timeout,started,userBlob),这里除了 状态检查,没有其他逻辑

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