如何从客户端出站通道访问Websocket客户端入站通道拦截器中填充的STOMP getSessionAttributes()?

时间:2018-11-20 08:19:54

标签: java spring-websocket

我正在使用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();时,它返回null。

如何从出站拦截器访问sessionAttribute?

1 个答案:

答案 0 :(得分:0)

感觉像是一种解决方法。这就是我解决的方法。

我添加了一个类似于包含Map的存储库的bean,键是会话ID,值是会话属性。

在入站拦截器(案例为SUBSCRIBE)中,我将会话ID和属性放在一起。并将其从地图中删除,以防万一取消订阅和万一断开。

在出站拦截器(案例MESSAGE)中,我从该bean sessionAttributes = theBean.getSessionIdAndAttributes().get(sessionId)获得了相关的sessionAttributes,而不是从消息对象sessionAttributes = sha.getSessionAttributes()获得了它。