连接处理属性指定了要连接到的代理地址,以及如何检测连接故障并尝试重新连接(如果要求)。表 16–1 概要介绍了这些属性。
最重要的连接处理属性是 imqAddressList ,该属性指定了要与之建立连接的一个或多个代理。该属性的值是一个字符串,它包含一个代理地址或者以逗号分隔的多个地址(如果是代理群集)。根据要使用的连接服务(请参见连接服务)和建立连接的方法,代理地址可以使用各种寻址方案:
mq,该方案使用代理的端口映射器为 jms 或 ssljms 连接服务动态指定端口。
mqtcp,该方案通过使用 jms 连接服务绕过端口映射器,而直接连接到指定端口。
mqssl,该方案通过使用 ssljms 连接服务与指定端口建立安全套接字层 (Secure Socket Layer, SSL) 连接。
http,该方案通过使用 httpjms 连接服务与指定 URL 处的 Message Queue 隧道 Servlet 建立超文本传输协议 (Hypertext Transport Protocol, HTTP) 连接。
https,该方案通过使用 httpsjms 连接服务与指定 URL 处的 Message Queue 隧道 Servlet 建立安全超文本传输协议 (Secure Hypertext Transport Protocol, HTTPS) 连接。
表 16–2 概述了这些寻址方案。
每个代理地址的通用格式为:
scheme://address
其中 scheme 是上面列出的寻址方案之一,而 address 表示代理地址本身。用于指定地址的准确语法因寻址方案而异,如表 16–2 中的最后一列所示。表 16–3 提供了各种地址格式的示例。
在多代理群集环境中,地址列表可能包含多个代理地址。如果第一次连接尝试失败,Message Queue 客户端运行时环境将尝试连接到列表中的另一个地址,依此类推,直到尝试完列表中的所有地址为止。其他两个连接工厂属性控制上述操作的执行方式:
imqAddressListBehavior 指定了尝试连接指定地址的顺序。如果将此属性设置为字符串 PRIORITY,将按地址在地址列表中的显示顺序尝试连接。如果属性值为 RANDOM,将按随机顺序尝试连接地址;这种方式非常有用,例如,当许多 Message Queue 客户端共享同一个连接工厂对象时,这种方式有助于防止所有客户端尝试连接到同一个代理地址。
imqAddressListIterations 指定了循环访问列表的次数,超过该次数后,将放弃尝试并报告故障。值为 -1 表示不限制重复次数:客户端运行时环境将一直尝试下去,直到成功建立连接或到达结束时间为止(以最先出现的情况为准)。
通过将连接工厂的 imqReconnectEnabled 属性设置为 true,可以使客户端在连接失败时自动重新连接到代理。imqReconnectAttempts 属性控制尝试重新连接到给定代理地址的次数;imqReconnectInterval 指定了两次尝试之间等待的时间间隔(以毫秒为单位)。
在代理地址列表 (imqAddressList ) 指定了多个地址的代理群集中,不但可以在原始代理上恢复失败的连接,而且还可以在群集中的其他代理上恢复失败的连接。如果重新连接到原始代理失败,则客户端运行时环境将尝试连接列表中的其他地址。imqAddressListBehavior 和 imqAddressListIterations 属性控制尝试连接地址的顺序和循环访问列表的次数,如前面一节所述。将以 imqReconnectInterval 的值(毫秒)作为时间间隔反复尝试连接每个地址,直到达到 imqReconnectAttempts 指定的最大尝试次数为止。
自动重新连接支持消息使用的所有客户端确认模式。重新建立连接之后,代理将重新传送以前传送过的所有未确认消息,并使用重新传送标志对其进行标记。应用程序代码可以使用此标志确定消息是否已使用但尚未得到确认。(但是,对于非长期订户,代理在关闭连接后不会保留消息。因此,在关闭连接时为这些订户生成的所有消息都将丢失,而不能在重新连接后进行传送。)在自动重新连接过程中将禁止生成消息;消息生成方无法向代理发送消息,直到重新建立连接为止。
自动重新连接提供连接故障转移,但不提供数据故障转移:客户端重新连接到其他代理实例时,因出现故障或断开连接的代理而保存的持久性消息和其他状态信息会丢失。尝试重新建立连接时,Message Queue 会维护客户端运行时环境提供的对象(如会话、消息使用方和消息生成方)。当连接失败时,系统也会维护临时目的地一段时间,因为客户端可能会重新连接并再次访问它们;在客户端重新连接并使用这些目的地之后,代理将会删除它们。如果重新连接时无法在代理上完全恢复客户端状态(例如,在使用事务会话时,客户端状态只在连接期间存在),将不会进行自动重新连接,而是调用该连接的异常处理程序。然后由应用程序代码捕获异常、重新连接并恢复状态。
可以将 Message Queue 客户端运行时环境配置成定期测试或 "ping" 连接,从而可以尽早检测出连接故障,以免在尝试传输消息时失败。对于只使用消息而不生成消息的客户端应用程序而言,这种测试尤为重要,因为如果不进行测试,这些应用程序将无法检测到连接失败。只是偶尔生成消息的客户端也可以利用此功能。
连接工厂属性 imqPingInterval 指定了 ping 连接的频率(以秒为单位)。默认情况下将此时间间隔设置为 30 秒;如果值为 -1,则表示禁用 ping 操作。
对失败的 ping 操作的响应因操作系统平台而异。在某些操作系统上,会立即向客户端应用程序的异常侦听器抛出异常。(如果客户端没有异常侦听器,则当它下次尝试使用连接时将会失败。)其他系统可能会继续尝试与代理建立连接,并缓冲后续的 ping 操作,直到某次尝试成功或缓冲区溢出为止。