You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by re...@apache.org on 2022/02/05 15:46:59 UTC
[wicket] 02/02: [WICKET-6954] initial work
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 <re...@gmail.com>
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());
}
}