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
java.naming.factory.initial = ActiveMQInitialContextFactory
connection.ConnectionFactory=tcp://localhost:8080?retryInterval=1000&retryIntervalMultiplier=1.5&maxRetryInterval=60000&reconnectAttempts=1000
如果您使用 JMS,但直接实例化 JMS 连接工厂,您可以在创建后立即在 ActiveMQConnectionFactory 上使用适当的 setter 方法指定参数。
如果您使用核心 API 并直接实例化 ServerLocator 实例,您也可以在创建后立即使用 ServerLocator 上的适当 setter 方法指定参数。
如果您的客户端能够成功重新连接,但会话在服务器上不再可用,例如,如果服务器重新启动或超时,客户端将无法重新连接,并且将调用连接或会话中注册的任何 Exception 实例。
Listener 或 FailureListener
ExceptionListeners 和 SessionFailureListeners
请注意,当客户端重新连接或重新连接时,将调用任何注册的 JMS ExceptionListener 或 core API SessionFailureListener。