From e068031aba2f73cdc7ffed58531cc829e250c864 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Sun, 24 Feb 2013 18:01:01 -0500 Subject: [PATCH] INTEXT-47 WebSocket PING Polishing Use last receive time (instead of last send) because mostly write sockets (from the server perspective) may still time out. --- ...SocketTcpConnectionInterceptorFactory.java | 24 +++++++++---------- .../WebSocketServerTests-context.xml | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketTcpConnectionInterceptorFactory.java b/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketTcpConnectionInterceptorFactory.java index 93ef3db..dc930f3 100644 --- a/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketTcpConnectionInterceptorFactory.java +++ b/spring-integration-ip-extensions/src/main/java/org/springframework/integration/x/ip/websocket/WebSocketTcpConnectionInterceptorFactory.java @@ -69,11 +69,12 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS @Override public void run() { - long pingFilter = System.currentTimeMillis() - pingInterval; + // Add 100ms to allow for heuristics + long pingFilter = System.currentTimeMillis() - pingInterval + 100; for (Entry entry : connections.entrySet()) { TcpConnection connection = entry.getKey(); String connectionId = connection.getConnectionId(); - if (entry.getValue().getLastSend() <= pingFilter) { + if (entry.getValue().getLastReceiveTime() <= pingFilter) { try { if (logger.isDebugEnabled()) { logger.debug("Sending Ping to " + connectionId); @@ -102,6 +103,11 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS this.taskScheduler = taskScheduler; } + /** + * The time between PINGs sent for idle connections. Must be less than half the + * socket timeout (if any). + * @param pingInterval + */ public void setPingInterval(long pingInterval) { this.pingInterval = pingInterval; } @@ -135,7 +141,7 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS private final EventDrivenConsumer resequencer; - private long lastSend; + private long lastReceiveTime; public WebSocketTcpConnectionInterceptor() { super(); @@ -156,8 +162,8 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS this.resequencer.start(); } - public long getLastSend() { - return lastSend; + public long getLastReceiveTime() { + return lastReceiveTime; } /** @@ -168,6 +174,7 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS */ @Override public boolean onMessage(Message message) { + this.lastReceiveTime = System.currentTimeMillis(); if (this.getTheConnection() instanceof TcpNioConnection && message.getHeaders().getCorrelationId() != null) { resequenceChannel.send(message); return true; @@ -315,13 +322,6 @@ public class WebSocketTcpConnectionInterceptorFactory extends IntegrationObjectS super.close(); } - - @Override - public void send(Message message) throws Exception { - super.send(message); - this.lastSend = System.currentTimeMillis(); - } - private void doHandshake(WebSocketFrame frame, MessageHeaders messageHeaders) throws Exception { try { WebSocketFrame handshake = this.getRequiredDeserializer().generateHandshake(frame); diff --git a/spring-integration-ip-extensions/src/test/java/org/springframework/integration/x/ip/websocket/WebSocketServerTests-context.xml b/spring-integration-ip-extensions/src/test/java/org/springframework/integration/x/ip/websocket/WebSocketServerTests-context.xml index f09d0d8..2095bf4 100644 --- a/spring-integration-ip-extensions/src/test/java/org/springframework/integration/x/ip/websocket/WebSocketServerTests-context.xml +++ b/spring-integration-ip-extensions/src/test/java/org/springframework/integration/x/ip/websocket/WebSocketServerTests-context.xml @@ -12,7 +12,7 @@