在使用Spring Websockets的Spring Boot 1.5.9应用程序中,使用SPR-16323的实现拦截了Web套接字订阅:
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHelper.accessor(message);
StompCommand command = accessor.getCommand();
if (null != command) {
StompHelper.authentication(message, tokenHandler);
switch (command) {
case SUBSCRIBE:
this.stompHandler.subscribe(message);
break;
case UNSUBSCRIBE:
this.stompHandler.unsubscribe(message);
break;
// ...
}
}
return super.preSend(message, channel);
}
捕获订户和目的地,以便发送特定于订户的消息。在Web套接字控制器中,@SubscribeMapping
实现向订阅者发布初始化数据。但@SubscribeMapping
和ChannelInterceptorAdapter.preSend
在不同的线程中被调用,因此@SubscribeMapping
偶尔会在ChannelInterceptorAdapter.preSend
完成之前执行,这会导致订阅者无法获取初始化数据。
这看起来像是一个Spring Websocket设计问题,但是有一种(优雅的)解决方法吗?
更新:提交了一个错误:{{3}}