我们在 HornetQ 中遇到了以下异常(使用 HornetQ 2.2.5 GA 和 JBoss 4.3.3,使用 InVM 连接器。客户端和服务器都在同一台机器上):
hornetq-failure-check-thread,检测到连接失败:没有收到来自 invm:0 的数据。
错误代码为 3(即 HornetQException.CONNECTION_TIMEDOUT)。
这会导致 RemotingServiceImpl.FailureCheckAndFlushThread 运行,它会多次写入以下日志:
客户端连接失败,正在清理 session 95406085-7b3a-11e2-86d3-005056b14e26 的资源
请注意,在我们的应用程序中,我们重用了我们的 ClientSession。我们每个连接有一个 ClientSession 实例(我们打开多个连接,每个客户端一个),上述问题导致其中一个 session 被关闭。
阅读这篇文章后: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 出于其他原因再次关闭 session , 我们如何创建新 session 而不是关闭的 session ?
我之所以这么问是因为在我们发现 session 关闭之后(并且在我们设置 clientFailure 和 clientTTL 值之前),我们尝试通过调用 ClientSessionFactory 实例上的 createSession(false, true, true) 方法来创建一个新 session (我们仅在系统启动时创建该实例并在此之后恢复它)并且它失败并出现以下错误:
HornetQException[errorCode=0 message=创建 session 失败]
所以我们没有成功创建新 session ,唯一的解决方案是重新启动 JBoss。
请注意,我们无法在客户端站点上重新启动我们的应用程序,因此我们需要找到一种方法来创建新 session ,以防旧 session 因某种原因关闭。
最佳答案
而不是这样做,您应该配置重试并使用适当的值,这样您的连接将被重新连接。
但是由于您使用的是 inVM,并且只要您不停止服务器,您应该可以使用该配置。但是,如果您打算仅重新启动服务器,您可以使用 reconnectionRetry (-1) 并且 session 将重新附加或重新创建给您。
无论如何,我建议您使用 2.2.5 之后的更新版本。
关于jboss - ClientSession 被 HornetQ 关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14979153/