我想知道如何获取JCSMPSession的状态-会话仍处于启动状态还是已丢失(过期会话)。如果我实现自己的JCSMPSession池,则这将很有用,这样我就可以在过时的JCSMPSession上执行内务处理,从而删除会话或重新创建会话。如果无法获取JCSMPSession的状态,我想到的一种方法是将消息发布到虚拟主题(主题没有已知订阅者),并专门捕获未经检查的StaleSessionException。还是有一种更优雅/更有效的方法来实现同一目标?
答案 0 :(得分:2)
不必检查过时的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);
答案 1 :(得分:1)
尽管我们可以在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并重试上述操作。因此,可以检测到过时的会话并在应用程序级别正常恢复。