客户端重新连接与会话恢复 通过配置,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-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, 它们将会被通知。
ExceptionListeners and SessionFailureListeners 请注意当客户端进行重新连接或恢复会话时,注册的JMS ExceptionListener 或核心接口的 SessionFailureListener 将会被调用。