客户端重新连接与会话恢复
通过配置,HornetQ的客户端在与服务器的连接出现故障时,可以自动地重新建立连接并恢复与服务器的通迅。
100%透明的会话恢复(re-attachment)
如果网络出现暂时性连接故障,并且服务器没有重启的情况下,当前的会话还会存在服务器中,其状态如同客户端
没有断开超过连接TTL时间。
在这种情况下,当客户端重新连接上服务器后,HornetQ自动将客户端和会话与服务器端的会话重新连接起来。整个过程
对于客户端是完全透明的,在客户端就好像什么都没有发生一样。
具体工作原理如下:
客户端再向服务器发送命令时,它将每个命令保存到内存的一块缓存中。当连接出现故障时客户端会尝试与该服务
器恢复会话。做为恢复协议的一部分,服务器在会话恢复时通知客户端最后一个成功接收的命令id。
根据这个命令id,客户端可以判断它的缓存中是否有命令还未被服务器成功接收。如果有,客户端可以重新发送
这些命令。
缓存的大小由ConfirmationWindowSize参数决定。当服务器成功接收了
ConfirmationWindowSize字节的命令时,会向客户端发送一个命令确认,以使客户端
及时清除缓存。
如果使用JMS服务,并且JMS的连接工厂是注册到JNDI的话,相应的参数是hornetq-jms.xml文件中的confirmation-window-size项。如果你并不将JMS连接工厂注册到JNDI,则你需要在
HornetQConnectionFactory上使用相应的方法直接设置该参数。
如果使用核心服务,你可以直接在ClientSessionFactory实例上直接设置该参数。
参数的单位是字节。
如果该参数是值设为-1,则关闭缓存,即关闭了重新恢复功能,迫使进行重新连接。默认
值是-1(表示没有自动恢复)。
会话重新连接
有时服务器发生故障后进行了重启。这时服务器将丢失所有当前的会话,上面所述的会话恢复就不能做到完全透明了。
在这种情况下,HornetQ自动地重新建立连接并重新创建会话
和接收者。这一过程与向备份服务器进行失效备援(failover)完全一样。
客户重新连接的功能还用在其它一些模块上,如核心桥,以使它们能够重新连接到目标服务器上。
要全面理解事务性会话和非事务性会话在失效备援/重连接情况下的细节,以及如何保证
一次并且只有一次的消息传递,请参见的有关内容。
重新连接/会话恢复的配置参数
下面是客户端用于重新连接的参数:
retry-interval。可选参数。它决定了两次重新连接尝试间隔的时间。单位
是毫秒。默认值是2000毫秒。
retry-interval-multiplier。可选参数。它表示下一次重试时间间隔的
系数。即下一次重试的时间间隔是本次时间间隔乘以该参数。
这样可以实现重试间隔的指数延迟(exponential backoff)。
让我们看一个例子:
假设retry-interval为1000 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实例,则用它的适当的方法可以设置这些参数。
如果客户端重新连接后发现会话已经丢失(如服务器重启或超时),则无法完成恢复。如果在连接上或会话上注册了
ExceptionListener或FailureListener,
它们将会被通知。
ExceptionListeners and SessionFailureListeners
请注意当客户端进行重新连接或恢复会话时,注册的JMS ExceptionListener 或核心接口的 SessionFailureListener
将会被调用。