客户坚持创建会话

时间:2012-02-02 11:24:23

标签: activemq

我有一个由3个经纪人组成的网络,但有时经纪人会以一种相当独特和恼人的方式失败。

他们仍然接受连接但是停止与客户端通信(即使是那些仍然连接的客户端)。 对于在java中创建的新连接,这意味着:

con = factory.getConnection(); // method returns, connection is created
con.createSession(false, Session.AUTO_ACKNOWLEDGE); // never returns
服务器端的

在调试模式下运行时没有记录异常。

你怎么知道这里发生了什么? 我可以找到任何logmessage吗?

编辑: 一些额外的信息:

  • http://pastebin.com/9iztG67D - xml配置文件
  • 每个节点都是具有连接从属(纯主从属)的主节点
  • client uri:failover:(tcp:// serverA:61616,tcp:// serverB:61616,tcp:// serverC:61616,tcp:// serverA-Slave:61616,tcp:// serverB-Slave :61616,TCP://服务器C从站:61616)随机=假

2 个答案:

答案 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的调用基本上会使一个条件导致客户端与服务器交换协议命令,并且如果无法建立连接,则调用将阻塞,直到故障转移传输可以创建连接。