Chapter 34. 客户端重新连接与会话恢复

通过配置,HornetQ的客户端在与服务器的连接出现故障时,可以自动地重新建立连接并恢复与服务器的通迅。

34.1. 100%透明的会话恢复(re-attachment)

如果网络出现暂时性连接故障,并且服务器没有重启的情况下,当前的会话还会存在服务器中,其状态如同客户端 没有断开超过连接TTLChapter 17, 失效连接的检测时间。

在这种情况下,当客户端重新连接上服务器后,HornetQ自动将客户端和会话与服务器端的会话重新连接起来。整个过程 对于客户端是完全透明的,在客户端就好像什么都没有发生一样。

具体工作原理如下:

客户端再向服务器发送命令时,它将每个命令保存到内存的一块缓存中。当连接出现故障时客户端会尝试与该服务 器恢复会话。做为恢复协议的一部分,服务器在会话恢复时通知客户端最后一个成功接收的命令id。

根据这个命令id,客户端可以判断它的缓存中是否有命令还未被服务器成功接收。如果有,客户端可以重新发送 这些命令。

缓存的大小由ConfirmationWindowSize参数决定。当服务器成功接收了 ConfirmationWindowSize字节的命令时,会向客户端发送一个命令确认,以使客户端 及时清除缓存。

如果使用JMS服务,并且JMS的连接工厂是注册到JNDI的话,相应的参数是hornetq-jms.xml文件中的confirmation-window-size项。如果你并不将JMS连接工厂注册到JNDI,则你需要在 HornetQConnectionFactory上使用相应的方法直接设置该参数。

如果使用核心服务,你可以直接在ClientSessionFactory实例上直接设置该参数。

参数的单位是字节。

如果该参数是值设为-1,则关闭缓存,即关闭了重新恢复功能,迫使进行重新连接。默认 值是-1(表示没有自动恢复)。

34.2. 会话重新连接

有时服务器发生故障后进行了重启。这时服务器将丢失所有当前的会话,上面所述的会话恢复就不能做到完全透明了。

在这种情况下,HornetQ自动地重新建立连接并重新创建会话 和接收者。这一过程与向备份服务器进行失效备援(failover)完全一样。

客户重新连接的功能还用在其它一些模块上,如核心桥,以使它们能够重新连接到目标服务器上。

要全面理解事务性会话和非事务性会话在失效备援/重连接情况下的细节,以及如何保证 一次并且只有一次的消息传递,请参见Section 39.2.1, “自动客户端失效备援”的有关内容。

34.3. 重新连接/会话恢复的配置参数

下面是客户端用于重新连接的参数:

  • retry-interval。可选参数。它决定了两次重新连接尝试间隔的时间。单位 是毫秒。默认值是2000毫秒。

  • retry-interval-multiplier。可选参数。它表示下一次重试时间间隔的 系数。即下一次重试的时间间隔是本次时间间隔乘以该参数。

    这样可以实现重试间隔的指数延迟(exponential backoff)

    让我们看一个例子:

    假设retry-interval1000 ms,并且我们 将retry-interval-multiplier设为2.0,如果 第一次尝试失败,则等待1000毫秒后进行第二次重试,如果再失败,则每三次重 试要在2000毫秒后进行,第四次要等待4000毫秒, 以此类推。

    默认值是1.0,表示每次重试间隔相同的时间。

  • max-retry-interval。可选参数。它决定了重试间的最大时间间隔。 使用retry-interval-multiplier可以使重试的时间间隔以指数级增加。 有可能造成时间间隔增加到一个非常大的数值。通过设置一个最大值可对其增长进行限制。默认 值是2000毫秒。

  • reconnect-attempts。可选参数。它表示要进行多少重试后才放弃 并退出。-1表示进行无限次重试。默认值是0

如果使用JMS并且将JMS的连接工厂绑定到JNDI服务中,则需要在hornetq-jms.xml 文件中对这些参数进行配置,如下例所示:

<connection-factory name="ConnectionFactory">
<connectors>
   <connector-ref connector-name="netty"/>
</connectors>
<entries>
   <entry name="ConnectionFactory"/>
   <entry name="XAConnectionFactory"/>
</entries>
<retry-interval>1000</retry-interval>
<retry-interval-multiplier>1.5</retry-interval-multiplier>
<max-retry-interval>60000</max-retry-interval>
<reconnect-attempts>1000</reconnect-attempts>
</connection-factory>          
    

如果使用JMS但是直接实例化JMS连接工厂,你可以使用适当的方法在 HornetQConnectionFactory 对象上直接设置这些参数。

如果使用核心接口直接创建 ClientSessionFactory实例,则用它的适当的方法可以设置这些参数。

如果客户端重新连接后发现会话已经丢失(如服务器重启或超时),则无法完成恢复。如果在连接上或会话上注册了 ExceptionListenerFailureListener, 它们将会被通知。

34.4. ExceptionListeners and SessionFailureListeners

请注意当客户端进行重新连接或恢复会话时,注册的JMS ExceptionListener 或核心接口的 SessionFailureListener 将会被调用。