在同一个应用程序中,有时我需要跟踪websocket会话(dis)连接,有时不需要。
为了跟踪SessionConnectedEvent
s,我只是在连接时传递一些标头,例如以下示例:
stompClient.connect({
companyId:1,
messageType: 'BUSINESS_CASE_1' // all message sents using this session will be typed
}, frame => {
stompClient.subscribe('/topic/foo', response => {});
});
在服务器端,使用侦听器和StompHeaderAccator
可以轻松拦截此类事件:
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
}
}
它看起来很粗糙,但很有效。
而在断开连接时(SessionDisconnect tEvent
),我只能在StompHeaderAccess
中看到session sionId
。没有一个引用返回到原始会话/客户端信息。:-(
1)是否有比在连接上使用标头更好/更干净的方法来区分会话连接事件?
2)有没有办法在会话断开期间传递业务数据?这样我就可以根据我的应用程序中断开连接的位置处理不同的业务逻辑。
我不认为您可以在断开连接时传递参数。
您可以实现一个简单的映射,将会话id作为键,值是一个对象,其中包含您在连接时从客户端捕获的值。