在同一个应用程序中,有时我需要跟踪websocket会话(dis)连接,有时不需要。
为了跟踪SessionConnectedEvent
,我只是在连接时传递一些标题,例如在以下示例中:
stompClient.connect({
companyId:1,
messageType: 'BUSINESS_CASE_1' // all message sents using this session will be typed
}, frame => {
stompClient.subscribe('/topic/foo', response => {});
});
在服务器端,使用监听器和StompHeaderAccessor
很容易拦截此类事件:
public class SessionConnectedEventListener implements ApplicationListener<SessionConnectedEvent> {
@Override
public void onApplicationEvent(SessionConnectedEvent event) {
StompHeaderAccessor sha = StompHeaderAccessor.wrap(event.getMessage());
String messageType = StompUtils.getHeaderValue("messageType", sha);
// handle business cases depending on the message type
}
}
它看起来很酷,但它确实有用。
在断开连接(SessionDisconnectEvent
)时,除sessionId
内的StompHeaderAccessor
外,我看不到任何其他内容。没有一个引用回原始会话/客户端信息。 : - (
1)是否存在更好/更清晰的方式来区分会话连接事件而不是使用连接上的标头?
2)在会话断开连接期间有没有办法传递业务数据?因此,我可以处理不同的业务逻辑,具体取决于我的应用程序中断开连接的位置。
答案 0 :(得分:0)
我认为你不能在断开连接时传递参数。
您可以实现一个将会话ID作为键的简单映射,该值是一个对象,其中包含您在连接时从客户端捕获的值。