Как получить доступ к STOMP getSessionAttributes (), которые заполняются в перехватчике клиентского входящего канала websocket из клиентского исходящего канала? - PullRequest
0 голосов
/ 20 ноября 2018

Я использую spring-websocket и у меня есть эти два перехватчика

<websocket:client-inbound-channel>
    <websocket:executor core-pool-size="100" max-pool-size="200" keep-alive-seconds="600"/>
    <websocket:interceptors>
        <ref bean="myInterceptor"/>
    </websocket:interceptors>
</websocket:client-inbound-channel>


<websocket:client-outbound-channel>
    <websocket:executor core-pool-size="100" max-pool-size="200" keep-alive-seconds="600"/>
    <websocket:interceptors>
        <ref bean="myOutInterceptor"/>
    </websocket:interceptors>
</websocket:client-outbound-channel>

Я использую StompHeaderAccessor для переноса сообщения в preSend(Message<?> message, MessageChannel channel) в обоих перехватчиках.

Я используюследующие для доступа к атрибутам сеанса во входящем перехватчике:

...
StompHeaderAccessor sha = StompHeaderAccessor.wrap(message);
// ignore non-STOMP messages like heartbeat messages
if(sha.getCommand() == null) {
    return message;
}
String sessionId = sha.getSessionId();
Map<String, Object> sessionAttributes = sha.getSessionAttributes();
...

Проблема в том, что sha.getSessionAttributes(); во входящем перехватчике возвращает данные, но когда я вызываю sha.getSessionAttributes(); в исходящем перехватчике, он возвращает ноль.

Как я могу получить доступ к атрибутам сеанса от исходящего перехватчика?

1 Ответ

0 голосов
/ 21 ноября 2018

Это похоже на обходной путь. Вот как я это решил.

Я добавил бин, действующий как репозиторий, содержащий карту, ключи - это идентификаторы сессии, значения - это атрибуты сессии.

Во входящем перехватчике, случай ПОДПИСАТЬСЯ, я помещаю идентификатор сеанса вместе с атрибутами. И удалил его с карты в случае НЕ ПОДПИСАТЬСЯ и в случае ОТКЛЮЧИТЬ.

В исходящем перехватчике, случай MESSAGE, я получил соответствующие атрибуты sessionAttributes из этого компонента sessionAttributes = theBean.getSessionIdAndAttributes().get(sessionId) вместо того, чтобы получать его из объекта сообщения sessionAttributes = sha.getSessionAttributes().

...