是否需要维护长期居住的JMS连接?

问题描述:

我始终打开JMS连接,因为我有一个MessageListener。是否需要维护长期居住的JMS连接?

是否需要尽量减少使用长寿命JMS连接维护应用程序的常见需求?

我在想一些尝试从一些可能的常见的众所周知的故障中恢复的问题,比如临时连接故障。

标准JMS规范中没有任何内容可以确保连接问题对应用程序不可见。也许有一些供应商将这作为延伸(正如James Strachan所建议的那样)。

如果您想要一个不依赖于供应商扩展的健壮JMS客户端,您需要处理错误并重新连接。见Reconnecting JMS listener to JBossMQ(尽管标题不是JBossMQ特定的)。

你将需要处理两种情况:你和JMS服务器之间

  1. 防火墙。几个小时后,大多数防火墙都会切断“闲置”连接。如果是这种情况,请每小时发送一条消息,或者,如果可以,请启用TCP_KEEPALIVE。这是一个TCP/IP选项,它会导致底层套接字在一段时间后发送测试消息。
  2. 其他服务器重新启动。发生这种情况时,当您尝试发送下一条消息时,会出现“连接丢失”错误。在这种情况下,再次打开连接并重试。

我建议安装一个本地JMS服务器(任何都可以),将您的应用连接到它并停止服务器。这会给你错误信息期望情况#2。然后用MockRunner编写一个单元测试,以确保您的错误处理是正确的。

一个很好的JMS提供者会处理网络中断,如掉线插座或消息代理故障转移或重新启动正。例如这里是你如何enable automatic reconnectionApache ActiveMQ

重新创建所有JMS资源(连接,会话,生产者,使用者)往往是一件非常痛苦的事情 - JMS提供者更容易为您做到这一点。

如果你必须使用它可以不支持此功能的提供者 - 要么通过交换,或使用Spring JMS辅助类,可以为你做一些这方面。