Как проверить состояние JCSMPSession?
Интересно, как получить состояние JCSMPSession - сеанс все еще работает или уже потерян (устаревший сеанс). Это было бы полезно, если бы я реализовал свой собственный пул JCSMPSession, чтобы я мог выполнять уборку устаревшего JCSMPSession, либо удалив сеанс, либо заново создав сеанс. Если нет способа получить состояние JCSMPSession, я мог бы подумать о том, чтобы просто опубликовать сообщение в фиктивной теме (тема без известных подписчиков) и перехватить ее специально для непроверенного исключения StaleSessionException. Или есть более элегантный / эффективный способ добиться того же?
2 ответа
Не должно быть необходимости проверять устаревшую JCSMPSession.
API выполняет проверки поддержания активности и имеет логику переподключения, если сеанс завершается.
Если вы хотите отслеживать состояние сеанса в приложении, см. https://docs.solace.com/Solace-PubSub-Messaging-APIs/Developer-Guide/Handling-Session-Events.htm.
Это делается через SessionEventHandler
, который является обратным вызовом, когда конкретный SessionEvent
произошло. Он регистрируется при создании сеанса, например
JCSMPSession session = JCSMPFactory.onlyInstance().createSession(properties, null, evtHdlr);
Хотя мы можем установить различные свойства в JCSMPChannelProperties для логического управления повторным подключением, при длительном времени простоя Solace нашему приложению необходимо иметь возможность повторно подключиться, когда Solace включен после исчерпания окна повторных попыток. Это особенно важно, когда мы запускаем наше приложение как демон / сервис, который внутренне использует JCSMP для связи с Solace. Последнее, что мы хотим, - это перезапустить наше приложение, чтобы снова подключиться к Solace после длительного простоя. Это также важно, когда мы реализуем собственный пул соединений с Solace с использованием JCSMP.
На самом деле, 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 и повторите попытку. Таким образом, можно обнаружить устаревший сеанс и корректно восстановиться на уровне приложения.