【问题标题】:Clients stuck at creating session客户停留在创建会话
【发布时间】:2012-02-25 01:23:42
【问题描述】:

我有一个由 3 个代理组成的网络正在运行,但有时代理会以一种相当独特且令人讨厌的方式失败。

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

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

在服务器端,在调试模式下运行时没有记录异常。

你知道这里发生了什么吗? 有没有我可以查找的日志消息?

编辑: 一些附加信息:

  • 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://serverC-Slave:61616)?randomize=false

【问题讨论】:

  • 这很可能不是这种情况,只是为了确保您在 BOX 上释放空间/ram/cpu...等吗?
  • 您是否在客户端连接 URI 中使用故障转移?请添加有关客户端配置的更多信息。
  • @Laures 嗨,我非常需要你的帮助。请看这个关于球衣休息服务和 Activemq 集成的问题。 stackoverflow.com/questions/19706788/…

标签: activemq


【解决方案1】:

由于您没有显示客户端 URI 的样子,因此很难说出确切的问题是什么。如果您在客户端 uri 上使用故障转移并且客户端无法连接到代理,则可能会发生您描述的客户端挂起。对 createSession 的调用基本上触发了一个条件,该条件导致客户端开始与服务器交换协议命令,如果无法建立连接,则调用将阻塞,直到故障转移传输可以创建连接。

【讨论】:

  • 根据客户端记录它确实连接到列表中的第一个代理的故障转移日志以及我的客户端记录 getConnection 返回但不记录 createSession 返回。另外,上次代理失败时,我们意识到创建的连接无法关闭。这也阻止了。
【解决方案2】:

如果不了解您的代理的配置方式以及您使用的队列/主题结构类型的更多信息,则很难准确判断发生了什么。但根据您描述的一般行为,这在某种程度上听起来像是流量控制。

查看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)连接到代理,并针对不同目的地和整个代理检查与其限制相关的当前内存使用情况。

【讨论】:

  • 我添加了我的代理配置。流量控制为假,未达到系统使用限制。
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2021-11-27
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多