Spring boot 重新连接后“用户目标没有活动会话”

问题描述 投票:0回答:1

我正在使用网络套接字编写一个测试应用程序。 有时重新连接后,Spring Boot v1.5.10.RELEASE 找不到与用户关联的会话。此问题不会不断重现。

测试:

@Test
public void receiveInCycle() throws Exception {
    for (int i = 0; i < 9999; i++) {
        receive();
    }
}

public void receive() throws Exception {
    Collection<Object> payloads = new ArrayList<>();
    //create session for "kate" user
    StompSession stompSession = createStompSession("kate");
    StompSession.Subscription subscription = stompSession.subscribe("/user/queue/messages", new StompSessionHandlerAdapter() {
        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            //save received payloads to collection
            payloads.add(payload);
        }
    });
    Thread.sleep(1000);
    subscription.unsubscribe();
    stompSession.disconnect();
    //collection should not be empty since i send events every 100 millis
    assertTrue(!payloads.isEmpty());
}

发送消息的代码:

@Scheduled(fixedDelay = 100)
public void send() {
    messagingTemplate.convertAndSendToUser("kate",
            "/queue/messages",
            format("Private UUID - '%s'!", UUID.randomUUID().toString()));
}

还在日志中,我总是看到错误

java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed 

但其频率与非工作测试的数量无关。

我还注意到 Spring 无法找到用户的会话,尽管用户已连接并订阅。

日志 - spring 找不到会话:

o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages

日志 - 用户连接并订阅:

2018-02-15 12:04:21.800 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.m.StompSubProtocolHandler        : From client: CONNECT session=9
2018-02-15 12:04:21.801 DEBUG 15876 --- [nboundChannel-2] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing CONNECT user=kate session=9
2018-02-15 12:04:21.803 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.m.StompSubProtocolHandler        : From client: SUBSCRIBE /user/queue/messages id=0 session=9
2018-02-15 12:04:21.803 DEBUG 15876 --- [nboundChannel-5] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing SUBSCRIBE /user/queue/messages id=0 session=9

经过调试,我发现出现错误是因为用户没有添加到DefaultSimpUserRegistry(它存储了会话和用户之间的关联),但我无法弄清楚为什么。 我尝试使用 Jetty 而不是 Tomcat,一切正常。

这种行为有什么解释吗?

完整日志:

2018-02-15 12:04:21.797 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.s.s.DefaultHandshakeHandler      : Processing request http://localhost:43755/test-server with headers={authorization=[kate], sec-websocket-key=[xZ67EfJb278L2ERbzCmUDw==], connection=[upgrade], sec-websocket-version=[13], host=[localhost:43755], upgrade=[websocket]}
2018-02-15 12:04:21.797 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.s.s.DefaultHandshakeHandler      : Upgrading to WebSocket, subProtocol=null, extensions=[]
2018-02-15 12:04:21.799 TRACE 15876 --- [cTaskExecutor-1] o.s.w.s.c.s.StandardWebSocketClient      : Handshake response headers: {date=[Thu, 15 Feb 2018 09:04:21 GMT], upgrade=[websocket], connection=[upgrade], sec-websocket-accept=[d7OI16/H5uovwY7a+QxLbuZKuaY=]}
2018-02-15 12:04:21.799 DEBUG 15876 --- [cTaskExecutor-1] o.s.m.simp.stomp.DefaultStompSession     : Connection established in session id=bd60b291-eadd-c8f6-5b38-060d2318debd
2018-02-15 12:04:21.800 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.m.StompSubProtocolHandler        : From client: CONNECT session=9
2018-02-15 12:04:21.801 DEBUG 15876 --- [nboundChannel-2] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing CONNECT user=kate session=9
2018-02-15 12:04:21.803 TRACE 15876 --- [-auto-1-exec-10] o.s.w.s.m.StompSubProtocolHandler        : From client: SUBSCRIBE /user/queue/messages id=0 session=9
2018-02-15 12:04:21.803 DEBUG 15876 --- [nboundChannel-5] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing SUBSCRIBE /user/queue/messages id=0 session=9
2018-02-15 12:04:21.803 TRACE 15876 --- [nboundChannel-5] o.s.m.s.u.UserDestinationMessageHandler  : Translated /user/queue/messages -> [/queue/messages-user9]
2018-02-15 12:04:21.803 DEBUG 15876 --- [nboundChannel-5] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing SUBSCRIBE destination=/queue/messages-user9 subscriptionId=0 session=9 user=kate payload=byte[0]
2018-02-15 12:04:21.826 DEBUG 15876 --- [MessageBroker-4] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - 'd890e685-9049-4773-94a1-f1334da176eb'!
2018-02-15 12:04:21.826 TRACE 15876 --- [MessageBroker-4] o.s.m.s.u.UserDestinationMessageHandler  : Translated /user/kate/queue/messages -> [/queue/messages-user7]
2018-02-15 12:04:21.826 DEBUG 15876 --- [MessageBroker-4] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/queue/messages-user7 session=null payload=Private UUID - 'd890e685-9049-4773-94a1-f1334da176eb'!
2018-02-15 12:04:21.833 TRACE 15876 --- [o-auto-1-exec-1] o.s.w.s.m.StompSubProtocolHandler        : From client: DISCONNECT session=7
2018-02-15 12:04:21.833 DEBUG 15876 --- [nboundChannel-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing DISCONNECT session=7
2018-02-15 12:04:21.834 DEBUG 15876 --- [o-auto-1-exec-1] o.s.w.s.m.SubProtocolWebSocketHandler    : Clearing session 7
2018-02-15 12:04:21.834 DEBUG 15876 --- [nboundChannel-2] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing DISCONNECT session=7
2018-02-15 12:04:21.834 DEBUG 15876 --- [tboundChannel-6] o.s.w.s.m.SubProtocolWebSocketHandler    : No session for GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT_ACK, simpDisconnectMessage=GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT, stompCommand=DISCONNECT, simpSessionAttributes={org.springframework.messaging.simp.SimpAttributes.COMPLETED=true}, simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=7}], simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=7}]
2018-02-15 12:04:21.834 DEBUG 15876 --- [tboundChannel-5] o.s.w.s.m.StompSubProtocolHandler        : Failed to send WebSocket message to client in session 7

java.lang.IllegalStateException: Message will not be sent because the WebSocket session has been closed
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.writeMessagePart(WsRemoteEndpointImplBase.java:425) ~[tomcat-embed-websocket-8.5.27.jar:8.5.27]
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:309) ~[tomcat-embed-websocket-8.5.27.jar:8.5.27]
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250) ~[tomcat-embed-websocket-8.5.27.jar:8.5.27]
    at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendPartialString(WsRemoteEndpointImplBase.java:223) ~[tomcat-embed-websocket-8.5.27.jar:8.5.27]
    at org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:49) ~[tomcat-embed-websocket-8.5.27.jar:8.5.27]
    at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage(StandardWebSocketSession.java:203) ~[spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:101) ~[spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.tryFlushMessageBuffer(ConcurrentWebSocketSessionDecorator.java:153) ~[spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator.sendMessage(ConcurrentWebSocketSessionDecorator.java:125) ~[spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.messaging.StompSubProtocolHandler.sendToClient(StompSubProtocolHandler.java:471) [spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:458) [spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:337) [spring-websocket-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:135) [spring-messaging-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_151]

2018-02-15 12:04:21.928 DEBUG 15876 --- [MessageBroker-4] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '3a223606-3fec-4def-a194-0ac35e17b757'!
2018-02-15 12:04:21.928 TRACE 15876 --- [MessageBroker-4] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.028 DEBUG 15876 --- [MessageBroker-2] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '9213c267-d2c8-44a7-bdc8-5f300220eb31'!
2018-02-15 12:04:22.028 TRACE 15876 --- [MessageBroker-2] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.129 DEBUG 15876 --- [MessageBroker-1] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '196a612b-7689-40e7-b4b3-5819f88844ad'!
2018-02-15 12:04:22.130 TRACE 15876 --- [MessageBroker-1] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.230 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - 'a4bfb498-aabc-4641-80bb-33a763fb165e'!
2018-02-15 12:04:22.231 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.332 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '37c6a440-2797-4453-9016-2ad1247eed14'!
2018-02-15 12:04:22.332 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.433 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - 'f333d450-f04f-4e0f-84df-0e310a993938'!
2018-02-15 12:04:22.433 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.533 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '95291a0a-d608-48ba-8f8e-012d64e825ef'!
2018-02-15 12:04:22.534 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.634 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - 'da26c02e-d841-4215-aa00-b42999c30a1b'!
2018-02-15 12:04:22.635 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.736 DEBUG 15876 --- [MessageBroker-3] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing MESSAGE destination=/user/kate/queue/messages session=null payload=Private UUID - '6c6732a2-9598-46cf-9797-113347965165'!
2018-02-15 12:04:22.736 TRACE 15876 --- [MessageBroker-3] o.s.m.s.u.UserDestinationMessageHandler  : No active sessions for user destination: /user/kate/queue/messages
2018-02-15 12:04:22.803 DEBUG 15876 --- [           main] o.s.m.simp.stomp.DefaultStompSession     : Connection closed in session id=bd60b291-eadd-c8f6-5b38-060d2318debd
2018-02-15 12:04:22.804 TRACE 15876 --- [o-auto-1-exec-2] o.s.w.s.m.StompSubProtocolHandler        : From client: UNSUBSCRIBE id=0 session=9
2018-02-15 12:04:22.804 DEBUG 15876 --- [nboundChannel-4] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing UNSUBSCRIBE id=0 session=9
2018-02-15 12:04:22.804 TRACE 15876 --- [o-auto-1-exec-2] o.s.w.s.m.StompSubProtocolHandler        : From client: DISCONNECT session=9
2018-02-15 12:04:22.804 DEBUG 15876 --- [nboundChannel-1] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing DISCONNECT session=9
2018-02-15 12:04:22.805 DEBUG 15876 --- [o-auto-1-exec-2] o.s.w.s.m.SubProtocolWebSocketHandler    : Clearing session 9
2018-02-15 12:04:22.805 DEBUG 15876 --- [nboundChannel-5] o.s.m.s.b.SimpleBrokerMessageHandler     : Processing DISCONNECT session=9
2018-02-15 12:04:22.806 DEBUG 15876 --- [tboundChannel-8] o.s.w.s.m.SubProtocolWebSocketHandler    : No session for GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT_ACK, simpDisconnectMessage=GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT, stompCommand=DISCONNECT, simpSessionAttributes={org.springframework.messaging.simp.SimpAttributes.COMPLETED=true}, simpHeartbeat=[J@47a1a4bc, simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=9}], simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=9}]
2018-02-15 12:04:22.807 DEBUG 15876 --- [tboundChannel-8] o.s.w.s.m.SubProtocolWebSocketHandler    : No session for GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT_ACK, simpDisconnectMessage=GenericMessage [payload=byte[0], headers={simpMessageType=DISCONNECT, stompCommand=DISCONNECT, simpSessionAttributes={org.springframework.messaging.simp.SimpAttributes.COMPLETED=true}, simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=9}], simpUser=com.example.sockettesting.configuration.WebSocketConfiguration$1$$Lambda$12/293071828@319d0266, simpSessionId=9}]
tomcat spring-boot spring-websocket
1个回答
0
投票

userDestinationBroadcast
添加到您的经纪商中继。您的 Spring 服务可能无法在分布式环境中找到您的用户目的地。启用此功能允许并行服务重试消息。请参阅文档

在多应用程序服务器场景中,用户目标可能无法解析,因为用户连接到不同的服务器。在这种情况下,您可以配置目标来广播未解析的消息,以便其他服务器有机会尝试。这可以通过 Java 配置中 MessageBrokerRegistry 的 userDestinationBroadcast 属性和 XML 中 message-broker 元素的 user-destination-broadcast 属性来完成。

© www.soinside.com 2019 - 2024. All rights reserved.