#Solace - 为安慰实施 DR Java JMS 发布者

#Solace - Implementing DR for solace Java JMS publisher

我有一个现有应用程序 运行 在 solace jar v7.1.2 上以 pub/sub 模式执行。现在我们已经升级到 v10.1.1 并且作为实施 DR 设置(灾难恢复)的一部分,我在配置中添加了一台以逗号分隔的主机。 应用程序可以成功连接到主主机,但在切换期间(即从主主机到 DR)应用程序连接失败,我收到以下错误。如果我重新启动我的应用程序,它会连接到 DR 主机。

com.solacesystems.jcsmp.JCSMPErrorResponseException: 400: Unknown Flow Name [Subcode:55]
        at com.solacesystems.jcsmp.impl.flow.PubFlowManager.doPubAssuredCtrl(PubFlowManager.java:266)
        at com.solacesystems.jcsmp.impl.flow.PubFlowManager.notifyReconnected(PubFlowManager.java:452)
        at com.solacesystems.jcsmp.protocol.impl.TcpClientChannel$ClientChannelReconnect.call(TcpClientChannel.java:2097)
        ... 5 more
|EAI-000376|||ERROR|    |EAI-000376 JMS Exception occurred, Description: `Error sending message - unknown flow name ((JCSMPTransportException)

需要帮助了解我们是否需要一些配置来重新连接到 DR 主机以顺利切换。

在 7.1.2.226 之前的 Solace JMS API 版本中,客户端发布保证消息的任何会话都将在 DR 切换后被销毁。为了指示发布者流断开和丢失,JMS API 将生成此异常。收到这些异常后,客户端应用程序应创建一个新会话。建立新会话后,客户端应用程序可以重新发布任何已发送但未在上一个会话中确认的保证消息,因为这些消息可能尚未保留和复制。

但是,此行为在 7.1.2.226 及更高版本中得到了改进,因此 API 可以透明地处理此问题。不再需要实现代码来捕获此异常。您能否确认该应用程序未使用 API 更早的 7.1.2.226?这可以通过启用 debug-level 日志来完成。

正如 Alexandra 指出的那样,在使用有保证的消息传递时,从版本 7.1.2 开始,Solace JMS API 即使在故障转移的情况下也能保证传递。收到“Error Response (400) - Unknown Flow Name”的 INFO 级日志消息是正常的,这并不表示有问题,但异常(带有堆栈跟踪) 一个问题并表明无法保证送达。

背景:如果客户端和代理(在 Solace 服务器上)之间的连接意外终止,代理将保持流状态——但仅持续三分钟。状态也被复制到 HA mate broker 以支持故障转移(但不复制到复制 mate)。如果客户端在三分钟内重新连接,它可以从中断处恢复。如果它在三分钟后重新连接,服务器将响应以下内容(将回显到日志中):

2019-01-04 10:00:59,999 INFO  [com.solacesystems.jcsmp.impl.flow.PubFlowManager] (Context_2_Thread_reconnect_service) Error Response (400) - Unknown Flow Name
2019-01-04 10:00:59,999 INFO  [com.solacesystems.jcsmp.impl.PubADManager] (Context_2_Thread_reconnect_service) Unknown Publisher Flow (flowId=36) recovered: 1 messages renumbered and resent (lastMessageIdSent =0)

没关系:客户端 JMS 库将自动重新发送任何必要的消息,因此保证消息传递仍然有保证。

另外,确认一下,jar 名称表示版本,所以sol-jms-10.1.1.jar 使用版本 10.1.1。