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