我有一个由3个经纪人组成的网络,但有时经纪人会以一种相当独特和恼人的方式失败。
他们仍然接受连接但是停止与客户端通信(即使是那些仍然连接的客户端)。 对于在java中创建的新连接,这意味着:
con = factory.getConnection(); // method returns, connection is created
con.createSession(false, Session.AUTO_ACKNOWLEDGE); // never returns
服务器端的在调试模式下运行时没有记录异常。
你怎么知道这里发生了什么? 我可以找到任何logmessage吗?编辑: 一些额外的信息:
答案 0 :(得分:0)
在不了解您的经纪人如何配置以及您正在使用哪种类型的队列/主题结构的情况下,您很难确切地知道发生了什么。但是根据你描述的一般行为,这听起来像某种程度上的流量控制。
查看here以获得有关流量控制的更详细说明。基本上,如果由于缓慢/挂起的消费者而导致目的地填满并达到其内存限制,则当新生产者尝试发送消息时,代理可能会出现“锁定”状态。
当达到系统内存限制时,代理商也可能以奇怪的方式锁定。查看以下配置值:
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="64 mb" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb" />
</storeUsage>
<tempUsage>
<tempUsage limit="10 gb" />
</tempUsage>
</systemUsage>
</systemUsage>
识别此类问题的最简单方法是使用JMX客户端(例如jconsole)连接到代理,并检查与其限制相关的内存的当前使用情况,针对不同的目标和整个代理。
答案 1 :(得分:0)
由于您尚未显示客户端URI的外观,因此不容易说出确切的问题。如果您在客户端uri上使用故障转移并且客户端无法连接到代理,则可能会出现您所描述的客户端挂起。对createSession的调用基本上会使一个条件导致客户端与服务器交换协议命令,并且如果无法建立连接,则调用将阻塞,直到故障转移传输可以创建连接。