30.9. 客户端重新连接和会话附加


JBoss EAP 消息传递客户端可以配置为在客户端和服务器之间的连接中检测到故障时自动重新连接或重新连接到服务器。

透明会话附加

如果故障是由于临时网络中断等临时原因造成,并且目标服务器没有重新启动,则该会话仍将存在于该服务器上,假设客户端未断开连接,超过 connection-ttl 的值。请参阅检测检测连接

在这种情况下,在进行重新连接时,JBoss EAP 将自动将客户端会话重新关联到服务器会话。100% 透明地完成此操作,客户可以完全像没有发生任何情况一样继续操作。

当 JBoss EAP 消息传递客户端向服务器发送命令时,它们将各个发送的命令存储在内存中缓冲区中。当连接失败并且客户端随后尝试重新连接到同一服务器时,作为重新附加协议的一部分,服务器会为客户端提供其成功收到的最后一个命令的 id。

如果客户端发送的命令超过故障转移前收到的命令,它可以重播其缓冲区中发送的任何命令,以便客户端和服务器可以协调其状态。

此缓冲区的大小由firm WindowSize 属性设置。当服务器收到 Confirm WindowSize bytes 字节并处理后,它会向客户端发回一个命令确认,客户端随后可以在缓冲区中释放空间。

如果您使用服务器上的 JMS 服务将 JMS 连接工厂实例加载到 JNDI 中,可以通过设置所选 connection-factory 的firm -window-size 属性在服务器配置中配置此属性。如果您使用 JMS 但不使用 JNDI,则您可以使用适当的 setter 方法直接在 ActiveMQConnectionFactory 实例上设置这些值,setConfirmationWindowSize。如果您使用核心 API,Server Locator 实例也公开了 setConfirmationWindowSize 方法。

confirmWindowSize 设置为 -1 (也是默认设置)会禁用任何缓冲,并防止发生任何重新附加,从而迫使重新连接。

会话重新连接

或者,服务器可能已在崩溃后实际重新启动,或者可能已被停止。在这种情况下,服务器上不再存在任何会话,且无法透明地重新连接它们。

在这种情况下,JBoss EAP 将自动重新连接连接,并在服务器上重新创建与客户端上的会话和使用者对应的任何会话和使用者。此过程与故障转移到备份服务器时所发生的情况完全相同。

客户端重新连接也由核心网桥等组件在内部使用,以允许它们重新连接到其目标服务器。

请参阅自动客户端故障部分,以深入了解如何在重新连接期间重新连接转换和非转换会话,以及维护一次且仅一次交付保证所需的操作。

配置重新连接属性

通过设置以下属性来配置客户端重新连接:

  • retryInterval.如果与目标服务器的连接失败,此可选参数设置后续重新连接尝试之间以毫秒为单位的句点。默认值为 2000 毫秒。
  • retryIntervalMultiplier.此可选参数设置一个倍数,以应用到上次重试到下一次重试的时间。这可让您在重试尝试之间实施指数回退。

    例如,如果您将 retryInterval 设置为 1000 毫秒,并将 retryIntervalMultiplier 设置为 2.0,那么如果第一次重新连接尝试失败,客户端将等待 1000 毫秒,然后在后续重新连接尝试之间等待 4000 毫秒。

    默认值为 1.0 表示 每次重新连接尝试的间隔相等。

  • maxRetryInterval.此可选参数设置要使用的最大重试间隔。在设置 retryIntervalMultiplier 时,后续重试可能会按指数增加,从而劫持巨大的值。通过设置此参数,您可以为该值设置上限。默认值为 2000 毫秒。
  • reconnectAttempts.此可选参数设置在放弃和关闭前重新连接尝试的总数。值 -1 表示无限数量的尝试。默认值为 0

如果您在客户端上使用 JMS 和 JNDI 来查找您的 JMS 连接工厂实例,则可以在 JNDI 上下文环境中指定这些参数。例如,您的 jndi.properties 文件可能类似如下:

java.naming.factory.initial = ActiveMQInitialContextFactory
connection.ConnectionFactory=tcp://localhost:8080?retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000
Copy to Clipboard Toggle word wrap

如果您使用 JMS,但直接实例化 JMS 连接工厂,您可以在创建后立即在 ActiveMQConnectionFactory 上使用适当的 setter 方法指定参数。

如果您使用核心 API 并直接实例化 ServerLocator 实例,您也可以在创建后立即使用 ServerLocator 上的适当 setter 方法指定参数。

如果您的客户端能够成功重新连接,但会话在服务器上不再可用,例如,如果服务器重新启动或超时,客户端将无法重新连接,并且将调用连接或会话中注册的任何 Exception Listener 或 FailureListener 实例。

ExceptionListeners 和 SessionFailureListeners

请注意,当客户端重新连接或重新连接时,将调用任何注册的 JMS ExceptionListener 或 core API SessionFailureListener

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat