Search code examples
javaspring-websocket

How to access STOMP getSessionAttributes() that are populated in websocket client-inbound-channel interceptor from client-outbound-channel?


I am using spring-websocket and I have these two interceptors

<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>

I am using StompHeaderAccessor to wrap the message in preSend(Message<?> message, MessageChannel channel) in both interceptors.

I am using the following to access session's attributes in the inbound interceptor:

...
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();
...

The problem is, sha.getSessionAttributes(); in the inbound interceptor returns data but when I call sha.getSessionAttributes(); in the outbound interceptor it returns null.

How can I access the sessionAttributes from the outbound Interceptor?


Solution

  • It feels like a workaround. That is how I solved it.

    I added a bean acting like a repository containing a Map, keys are session ids, values are session attributes.

    In inbound interceptor, case SUBSCRIBE, I put the session id along with the attributes. And removed it from the map in case UNSUBSCRIBE and case DISCONNECT.

    In outbound interceptor, case MESSAGE, I got the relevant sessionAttributes from that bean sessionAttributes = theBean.getSessionIdAndAttributes().get(sessionId) instead of getting it from the message object sessionAttributes = sha.getSessionAttributes().