2

我保持 JMS 连接始终打开,因为上面有一个 MessageListener。

是否普遍需要担心使用长期 JMS 连接来最小化应用程序的维护?

我正在考虑尝试从一些可能常见的众所周知的故障中恢复,例如临时连接故障。

4

3 回答 3

3

一个好的 JMS 提供者将处理网络中断,例如丢失的套接字或消息代理故障转移或重新启动。例如,这是在Apache ActiveMQ中启用自动重新连接的方法。

重新创建所有 JMS 资源(连接、会话、生产者、消费者)通常很痛苦——JMS 提供者为你做这件事要容易得多。

如果您必须使用不支持此功能的提供程序 - 请考虑切换或使用 Spring JMS 帮助程序类,它可以为您完成其中的一些工作。

于 2008-12-04T13:05:57.187 回答
1

您将需要处理两种情况:

  1. 您和 JMS 服务器之间的防火墙。大多数防火墙会在几个小时后切断“空闲”连接。如果是这种情况,请每隔一小时左右发送一条消息,或者,如果可以,启用 TCP_KEEPALIVE。这是一个 TCP/IP 选项,它将导致底层套接字在一段时间后发送测试消息。
  2. 另一台服务器重新启动。发生这种情况时,当您尝试发送下一条消息时,您将收到“连接丢失”错误。在这种情况下,只需再次打开连接并重试。

我建议安装本地 JMS 服务器(任何都可以),将您的应用程序连接到它并停止服务器。这将为您提供案例 #2 的错误消息。然后用MockRunner编写一个单元测试来确保你的错误处理是正确的。

于 2008-12-04T12:44:17.233 回答
1

我所知道的标准 JMS 规范中没有任何内容可以确保应用程序不会看到连接问题。也许有一些供应商将其作为扩展(正如 James Strachan 所建议的那样)。

如果您想要一个不依赖于供应商扩展的健壮 JMS 客户端,您需要处理错误并进行重新连接。请参阅将 JMS 侦听器重新连接到 JBossMQ(尽管标题如此,但它不是 JBossMQ 特定的)。

于 2008-12-04T16:48:55.443 回答