This is an automated email from the ASF dual-hosted git repository. reiern70 pushed a commit to branch improvement/reiern70/WICKET-6954-ping-pong-keep-alive in repository https://gitbox.apache.org/repos/asf/wicket.git
commit d705894bd2b3956e3abf6786076fd4de1ee8f5a3 Author: reiern70 <[email protected]> AuthorDate: Sat Feb 5 10:46:39 2022 -0500 [WICKET-6954] initial work --- .../wicket/protocol/ws/WebSocketSettings.java | 18 ++++++- .../ws/api/AbstractWebSocketProcessor.java | 19 ++++++-- .../protocol/ws/api/IWebSocketProcessor.java | 5 ++ .../ws/api/message/PongMessageMessage.java | 55 ++++++++++++++++++++++ .../protocol/ws/javax/JavaxWebSocketProcessor.java | 1 - 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java index dd59f49..27237a0 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/WebSocketSettings.java @@ -94,6 +94,7 @@ public class WebSocketSettings private final AtomicInteger port = new AtomicInteger(); private final AtomicInteger securePort = new AtomicInteger(); + /** * Holds this WebSocketSettings in the Application's metadata. * This way wicket-core module doesn't have reference to wicket-native-websocket. @@ -177,7 +178,12 @@ public class WebSocketSettings */ private Executor heartBeatsExecutor = new HeartBeatsExecutor(); - // internal heartbeats timer. + /** + * Whether messages are broadcast when receiving pong messages + */ + private boolean sendMessagesOnPong = false; + + // internal heartbeat's timer. private Timer heartBeatsTimer; /** @@ -589,6 +595,16 @@ public class WebSocketSettings } } + public void setSendMessagesOnPong(boolean sendMessagesOnPong) + { + this.sendMessagesOnPong = sendMessagesOnPong; + } + + public boolean isSendMessagesOnPong() + { + return sendMessagesOnPong; + } + private void sendHeartBeats(String application) { sendHeartBeats(Application.get(application)); diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java index 0290544..d5aef01 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/AbstractWebSocketProcessor.java @@ -47,6 +47,7 @@ import org.apache.wicket.protocol.ws.api.message.ConnectedMessage; import org.apache.wicket.protocol.ws.api.message.ErrorMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketMessage; import org.apache.wicket.protocol.ws.api.message.IWebSocketPushMessage; +import org.apache.wicket.protocol.ws.api.message.PongMessageMessage; import org.apache.wicket.protocol.ws.api.message.TextMessage; import org.apache.wicket.protocol.ws.api.registry.IKey; import org.apache.wicket.protocol.ws.api.registry.IWebSocketConnectionRegistry; @@ -149,12 +150,22 @@ public abstract class AbstractWebSocketProcessor implements IWebSocketProcessor this.connectionFilter = webSocketSettings.getConnectionFilter(); } - @Override - public void onPong(ByteBuffer byteBuffer) { + public void onPong(ByteBuffer byteBuffer) + { IKey key = getRegistryKey(); - IWebSocketConnection webSocketConnection = connectionRegistry.getConnection(getApplication(), getSessionId(), key); - webSocketConnection.onPong(byteBuffer); + WebApplication application = getApplication(); + String sessionId = getSessionId(); + IWebSocketConnection webSocketConnection = connectionRegistry.getConnection(application, sessionId, key); + if (webSocketConnection != null) + { + webSocketConnection.onPong(byteBuffer); + if (webSocketSettings.isSendMessagesOnPong()) + { + // if we want to deliver messages on pong deliver them + broadcastMessage(new PongMessageMessage(application, sessionId, key, byteBuffer)); + } + } } @Override diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java index 5aa9391..708002f 100644 --- a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/IWebSocketProcessor.java @@ -44,6 +44,11 @@ public interface IWebSocketProcessor WebSocketSettings.Holder.get(application).getSocketSessionConfigurer().configureSession(webSocketSession); } + /** + * Called when remote peer answers to ping with pong message. + * + * @param byteBuffer Contains application specific content + */ void onPong(ByteBuffer byteBuffer); /** diff --git a/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java new file mode 100644 index 0000000..0708f82 --- /dev/null +++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/message/PongMessageMessage.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.protocol.ws.api.message; + +import java.nio.ByteBuffer; + +import org.apache.wicket.Application; +import org.apache.wicket.protocol.ws.api.registry.IKey; +import org.apache.wicket.util.lang.Args; + +/** + * A {@link IWebSocketMessage message} with Pong message data + * + * @since 6.0 + */ +public class PongMessageMessage extends AbstractClientMessage +{ + private final ByteBuffer byteBuffer; + + /** + * + * @param application + * the Wicket application + * @param sessionId + * the id of the http session + * @param key + * the page id or resource name + * @param byteBuffer + * the message sent from the client + */ + public PongMessageMessage(Application application, String sessionId, IKey key, ByteBuffer byteBuffer) + { + super(application, sessionId, key); + this.byteBuffer = Args.notNull(byteBuffer, "byteBuffer"); + } + + public ByteBuffer getByteBuffer() + { + return byteBuffer; + } +} diff --git a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java index cd3adf8..85f78ea 100644 --- a/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java +++ b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/org/apache/wicket/protocol/ws/javax/JavaxWebSocketProcessor.java @@ -70,7 +70,6 @@ public class JavaxWebSocketProcessor extends AbstractWebSocketProcessor @Override public void onMessage(PongMessage message) { - IKey key = getRegistryKey(); JavaxWebSocketProcessor.this.onPong(message.getApplicationData()); } }
