jboss – ClientSession由HornetQ关闭

我们在HornetQ中遇到以下异常(使用带有JBoss 4.3.3的HornetQ 2.2.5 GA,带有InVM连接器.客户端和服务器都在同一台机器上):

hornetq-failure-check-thread,检测到连接失败:没有从invm接收数据:0.
错误代码是3(这是HornetQException.CONNECTION_TIMEDOUT).

这会导致RemotingServiceImpl.FailureCheckAndFlushThread运行,它会多次写入以下日志:

客户端连接失败,清除会话的资源95406085-7b3a-11e2-86d3-005056b14e26

请注意,在我们的应用程序中,我们重用了ClientSessions.我们每个连接有一个ClientSession实例(我们打开多个连接,每个客户端一个),上面的问题导致其中一个会话被关闭.

看完这篇文章后:Connection timeout issues – Connection failure has been detected

我知道我们需要在ServerLocator实例上配置以下内容(用于创建创建ClientSessions的ClientSessionFactory):

ServerLocator locator = HornetQClient.createServerLocatorWithoutHA(connectorConfig);
locator.setClientFailureCheckPeriod(Long.MAX_VALUE);
locator.setConnectionTTL(-1);

这个配置解决了这个问题,并且没有再现上述错误.

我们的问题如下 – 如果HornetQ会因其他原因再次关闭会话,我们如何创建新会话而不是关闭会话?

我问这个是因为在我们发现会话被关闭之后(在我们设置clientFailure和clientTTL值之前),我们尝试通过在ClientSessionFactory实例上调用createSession(false,true,true)方法来创建一个新会话(我们在系统启动时只创建一次该实例,然后重新启动它,并且失败并出现以下错误:

HornetQException [errorCode = 0 message =创建会话失败]

所以我们没有成功创建新的会话,唯一的解决方案是重新启动JBoss.

请注意,我们无法在客户端站点上重新启动我们的应用程序,因此我们需要找到一种方法来创建新会话,以防旧旧会话因某种原因而关闭.

最佳答案 您应该配置重试并使用正确的值,而不是这样做,这样您的连接就会重新连接.

但是,因为你正在使用inVM,并且只要你不停止服务器,你就可以使用该配置.但是,如果您打算仅重新启动服务器,则可以使用reconnectionRetry(-1)并重新连接或重新创建会话.

无论如何,我建议你去2.2.5之外的更新版本.

点赞