【问题标题】:How to check a JCSMPSession state?如何检查 JCSMPSession 状态?
【发布时间】:2018-08-06 12:28:43
【问题描述】:

我想知道如何获取 JCSMPSession 的状态 - 会话是否仍在运行或已经丢失(过时会话)。如果我实现自己的 JCSMPSession 池,这将很有用,这样我就可以对陈旧的 JCSMPSession 执行内务管理,删除会话或重新创建会话。如果无法获取 JCSMPSession 的状态,我能想到的一种方法是将消息发布到虚拟主题(没有已知订阅者的主题)并专门针对未检查的 StaleSessionException 捕获。或者,是否有更优雅/更高效的方式来实现相同的目标?

【问题讨论】:

    标签: solace


    【解决方案1】:

    应该不需要检查过时的 JCSMPSession。

    API 执行keep-alive checks,如果会话中断,则有一个reconnection logic

    如果您想跟踪应用程序的会话状态,请参阅https://docs.solace.com/Solace-PubSub-Messaging-APIs/Developer-Guide/Handling-Session-Events.htm

    这是通过SessionEventHandler 完成的,这是发生特定SessionEvent 时的回调。会话为created时注册,例如

    JCSMPSession session = JCSMPFactory.onlyInstance().createSession(properties, null, evtHdlr);
    

    【讨论】:

      【解决方案2】:

      虽然我们可以在 JCSMPChannelProperties 中设置各种属性来进行重连重试逻辑控制,但是在长时间的 Solace 停机时,我们的应用程序必须能够在 Solace 在耗尽重试窗口后重新启动时重新连接。当我们将应用程序作为内部使用 JCSMP 与 Solace 通信的守护程序/服务运行时,这一点尤其重要。我们想要做的最后一件事是在长时间停机后重新启动我们的应用程序以重新连接到 Solace。当我们使用 JCSMP 实现到 Solace 的自己的连接池时,这一点也很重要。

      其实,com.solacesystems.jcsmp.SessionEvent.DOWN_ERROR 就是我所需要的。

      我们有一个实现 com.solacesystems.jcsmp.SessionEventHandler 的类,它检查 com.solacesystems.jcsmp.SessionEvent.DOWN_ERROR。检测到这一点后,我们重试以下操作:

      JCSMPSession session = JCSMPFactory.onlyInstance().createSession(properties, null, evtHdlr);
      

      我们将继续监控 SessionEvent.DOWN_ERROR 并重试上述操作。因此,可以在应用程序级别检测陈旧会话并正常恢复。

      【讨论】:

      • 感谢您发布解决方案!确保接受对您有帮助的答案。
      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 2018-01-06
      • 2018-05-01
      • 2019-01-14
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多