Description
I have a spring framework application and a swing application which communicates with the spring app (tomcat) via websockets.
Locally I cannot reproduce this issue, but in a cloud environment it is reproducible.
The swing application has an auto-reconnect job which checks if the websocket is disconnected, and if it is it reconnects.
My assumption is that when the swing client disconnects (because it doesn't receive heartbeats from the server), the server does not notice this and keeps the sessions alive.
The log in tomcat looks like this
[snippet from the log]
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 899019 ms. Closing WebSocketServerSockJsSession[id=838e557837c74ef2a23bcd1bb72cec9c].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 1134777 ms. Closing WebSocketServerSockJsSession[id=0b0d711972344aa09395006e90ba83e1].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 323835 ms. Closing WebSocketServerSockJsSession[id=26f17a9feec3402982b1eba5ad0bde7d].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 805026 ms. Closing WebSocketServerSockJsSession[id=6816a489125d4161991935172939e50a].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 452725 ms. Closing WebSocketServerSockJsSession[id=005db3a02a9d445389441e61a737cbbc].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 605709 ms. Closing WebSocketServerSockJsSession[id=f02769867e3a4504b17c0adce5a29cc4].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 746056 ms. Closing WebSocketServerSockJsSession[id=f3641dd2ed904e519bf41815a9138497].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 617321 ms. Closing WebSocketServerSockJsSession[id=2b5cb43b57b947e0bf4d668b4f669bf4].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 148400 ms. Closing WebSocketServerSockJsSession[id=684868babebc4a31b1c19678b6d60023].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 699036 ms. Closing WebSocketServerSockJsSession[id=c20bdd087a914016ab67d368e85b4db6].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 1122979 ms. Closing WebSocketServerSockJsSession[id=eef41fbe669a4b1a9bb54c429e5d5453].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 347276 ms. Closing WebSocketServerSockJsSession[id=749c7af7447b4326b3dd075f8551cf83].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 1052356 ms. Closing WebSocketServerSockJsSession[id=a152d5653145419eabca743be7264d77].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 663907 ms. Closing WebSocketServerSockJsSession[id=7ffa907967d145bda0aeb47374ce152c].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 828531 ms. Closing WebSocketServerSockJsSession[id=cab6085d5f6b4715850e611e7a556906].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 101438 ms. Closing WebSocketServerSockJsSession[id=c3ca9b8b5f0e4ea2acd2b3cb1ea01a0d].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 570379 ms. Closing WebSocketServerSockJsSession[id=28b0d8b124e242acbb5532dd55c98ed3].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 218556 ms. Closing WebSocketServerSockJsSession[id=72d98d863d1241ea8a1395c589dc2237].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 288750 ms. Closing WebSocketServerSockJsSession[id=67962e5785344dc6a31e0efdfbb806a0].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 734328 ms. Closing WebSocketServerSockJsSession[id=f99634fbeb744bfda64a9c6f367c88c8].
2024-01-30 13:53:53 INFO SubProtocolWebSocketHandler:503 - No messages received after 863701 ms. Closing WebSocketServerSockJsSession[id=5181f2406c1149219affd012491c2b90].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 487918 ms. Closing WebSocketServerSockJsSession[id=c4f684581c2e42c69771d35f5ed28a5d].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 358939 ms. Closing WebSocketServerSockJsSession[id=141d1c84a5dc4152b272a64be10d970a].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 312150 ms. Closing WebSocketServerSockJsSession[id=12b30f3b3b89445583936d601578c07b].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 476291 ms. Closing WebSocketServerSockJsSession[id=e3f1f65e14ac449c8569ff94eb5538e1].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 934254 ms. Closing WebSocketServerSockJsSession[id=4451c723925b4ab689b979581407822b].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 405862 ms. Closing WebSocketServerSockJsSession[id=0faf90546b7f46b6ab05fb4233ccc4b9].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 265358 ms. Closing WebSocketServerSockJsSession[id=4dc1ec3422b74beb8d77e6af801dfe7f].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 440993 ms. Closing WebSocketServerSockJsSession[id=87672dcc5c6542758156d0ae504bac87].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 499644 ms. Closing WebSocketServerSockJsSession[id=1d3ce99766884f4b8fa6b59ad5f91ce6].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1075868 ms. Closing WebSocketServerSockJsSession[id=c0d82ff27bc04618bd24e732fd206582].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 523268 ms. Closing WebSocketServerSockJsSession[id=5e9eb26093df44a0b4f9f2104fb55f66].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 981544 ms. Closing WebSocketServerSockJsSession[id=b095f6b892b54f378812649e603c0aa5].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 910673 ms. Closing WebSocketServerSockJsSession[id=5116b157ed24403bba49ce71709bc137].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 558508 ms. Closing WebSocketServerSockJsSession[id=a7f2174b5c154e99920836ebfdddb988].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 183551 ms. Closing WebSocketServerSockJsSession[id=4d7e2af66ab0495ab5b07f4a753dbc5d].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 206850 ms. Closing WebSocketServerSockJsSession[id=d5fc5f07b6064b64abe21f190ece09c6].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 136655 ms. Closing WebSocketServerSockJsSession[id=dedbdc7d5e8947b4a798326594495210].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 793166 ms. Closing WebSocketServerSockJsSession[id=a47f59c5ba4f4391a1e7f22cf509fa70].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1099473 ms. Closing WebSocketServerSockJsSession[id=1c387dbaf9b14bb8a6581a3544fda7e7].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 851999 ms. Closing WebSocketServerSockJsSession[id=d7cce468c28746f2977bc74df9e9897d].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 710846 ms. Closing WebSocketServerSockJsSession[id=f111560133f04e54a15035bd33af2a0f].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1240907 ms. Closing WebSocketServerSockJsSession[id=312b15c8b0a9405390710e1e1db882fb].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1217247 ms. Closing WebSocketServerSockJsSession[id=0b8b10d2f8a84694ae6d767d902605e6].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 769425 ms. Closing WebSocketServerSockJsSession[id=f780343ac0a14247a70671dd6fa05785].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 840296 ms. Closing WebSocketServerSockJsSession[id=15032180aed9426db864a6ac4616b1fc].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1087685 ms. Closing WebSocketServerSockJsSession[id=88a8d1a67d52424bb7969757514496f8].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1264368 ms. Closing WebSocketServerSockJsSession[id=4f2c66e9302a4efd8e25e617450eb697].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 1252667 ms. Closing WebSocketServerSockJsSession[id=70021c8bea4940c6a94f628ae57d369e].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 77837 ms. Closing WebSocketServerSockJsSession[id=ba1f324f20704c06a382be73fd4262ff].
2024-01-30 13:53:54 INFO SubProtocolWebSocketHandler:503 - No messages received after 253665 ms. Closing WebSocketServerSockJsSession[id=23cd562d6f1f4f818b40797818dec8ef].
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
var taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.initialize();
config.enableSimpleBroker("/endpint1","/endpoint2")
.setHeartbeatValue(new long[] {10000, 10000})
.setTaskScheduler(taskScheduler);
config.setUserDestinationPrefix("/user")
.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/endpint1").setAllowedOrigins(allowedOrigins.split(",")).
setHandshakeHandler(handshakeHandler()).withSockJS().setInterceptors(proxyConfig);
registry.addEndpoint("/endpoint2").setAllowedOrigins(allowedOrigins.split(",")).withSockJS();
}
@Override public void configureWebSocketTransport(final WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(500 * 1024);
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
registration.interceptors(customChannelInterceptor);
}
@Bean
CustomHandshakeHandler handshakeHandler() {
return new CustomHandshakeHandler();
}
}
And client connects like this:
var stompSession = stompClient.connect(StringUtil.getURLString(model.getServer(), "/api2/endpoint1"), headers, new StompSessionHandlerAdapter() {
@Override public void afterConnected(StompSession session, StompHeaders connectedHeaders) {... }
@Override public void handleTransportError(StompSession session, Throwable exception) {
// disconnects websocket on exception
}).get();
stompSession.subscribe("/user/**", stompFrameHandler)
Is there a way to check on the client that there is a websocket connection active or not ?
I also found this comment where the log above comes from:
/**
* When a session is connected through a higher-level protocol it has a chance
* to use heartbeat management to shut down sessions that are too slow to send
* or receive messages. However, after a WebSocketSession is established and
* before the higher level protocol is fully connected there is a possibility for
* sessions to hang. This method checks and closes any sessions that have been
* connected for more than 60 seconds without having received a single message.
*/
What exactly is a 'session that is to slow to send or receive messages' ?
How would i be able to simulate this?
It's worth mentioning that when the websocket request in the CLOUD is made the following http request are performed:
/api2/endpoint1/info
/api2/endpoint1/29/4f2c66e9302a4efd8e25e617450eb697/websocket
/api2/endpoint1/xhr_streaming
/api2/endpoint1/xhr
Locally I only get
/api2/endpoint1/info
/api2/endpoint1/29/4f2c66e9302a4efd8e25e617450eb697/websocket
I'm using spring framework 6.0.14
Did not have this many issues with 6.0.8
Did something change between the 2 versions?
Thanks