This is an automated email from the ASF dual-hosted git repository.
riemer pushed a commit to branch
2890-websocket-server-stops-sending-message-when-the-pipeline-instantiating-it-is-stopped-and-restarted-even-without-any-modification
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to
refs/heads/2890-websocket-server-stops-sending-message-when-the-pipeline-instantiating-it-is-stopped-and-restarted-even-without-any-modification
by this push:
new 076ec07acf fix(#2890): Properly cleanup WS connection
076ec07acf is described below
commit 076ec07acff078b5c7bcc5a1256a2267d9b69542
Author: Dominik Riemer <[email protected]>
AuthorDate: Wed May 22 10:19:32 2024 +0200
fix(#2890): Properly cleanup WS connection
---
pom.xml | 2 +-
.../sinks/brokers/jvm/websocket/SocketServer.java | 17 ++++++++----
.../brokers/jvm/websocket/WebsocketServerSink.java | 32 +++++++++++-----------
.../runtime/StandaloneEventProcessorRuntime.java | 1 +
.../runtime/StandaloneEventSinkRuntime.java | 1 +
5 files changed, 30 insertions(+), 23 deletions(-)
diff --git a/pom.xml b/pom.xml
index 9a713f93ea..f6b8e02d64 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@
<jakarta-servlet-api.version>6.0.0</jakarta-servlet-api.version>
<jakarta-xml-bind-api.version>4.0.0</jakarta-xml-bind-api.version>
<javax.xml.bind.version>2.4.0-b180725.0427</javax.xml.bind.version>
- <java-websocket.version>1.5.0</java-websocket.version>
+ <java-websocket.version>1.5.6</java-websocket.version>
<jaxb-runtime.version>2.3.2</jaxb-runtime.version>
<javax-websocket-api.version>1.1</javax-websocket-api.version>
<jakarta-persistence-api.version>3.0.1</jakarta-persistence-api.version>
diff --git
a/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/SocketServer.java
b/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/SocketServer.java
index b42cbad301..babd6f8a3f 100644
---
a/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/SocketServer.java
+++
b/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/SocketServer.java
@@ -24,16 +24,21 @@ import org.apache.streampipes.model.runtime.Event;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.net.InetSocketAddress;
import java.util.Map;
public class SocketServer extends WebSocketServer {
- private JsonDataFormatDefinition dataFormatDefinition;
+ private static final Logger LOG =
LoggerFactory.getLogger(SocketServer.class);
+
+ private final JsonDataFormatDefinition dataFormatDefinition;
public SocketServer(int port) {
super(new InetSocketAddress(port));
+ setReuseAddr(true);
dataFormatDefinition = new JsonDataFormatDefinition();
}
@@ -42,27 +47,27 @@ public class SocketServer extends WebSocketServer {
conn.send("Welcome!"); //This method sends a message to the new client
broadcast(
"New connection: " + handshake.getResourceDescriptor()); //This method
sends a message to all clients connected
-
System.out.println(conn.getRemoteSocketAddress().getAddress().getHostAddress()
+ " connected.");
+ LOG.info("{} connected.",
conn.getRemoteSocketAddress().getAddress().getHostAddress());
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote)
{
- // do nothing special
+ LOG.info("{} closed.",
conn.getRemoteSocketAddress().getAddress().getHostAddress());
}
@Override
public void onMessage(WebSocket conn, String message) {
- System.out.println(conn + ": " + message);
+ LOG.debug(" {}: {}", conn, message);
}
@Override
public void onError(WebSocket conn, Exception ex) {
- ex.printStackTrace();
+ LOG.error("Error in websocket connection", ex);
}
@Override
public void onStart() {
- System.out.println("Server started!");
+ LOG.info("Server started at port {}", getPort());
setConnectionLostTimeout(0);
setConnectionLostTimeout(100);
}
diff --git
a/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/WebsocketServerSink.java
b/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/WebsocketServerSink.java
index d4b4aaae3f..c602ce8dcf 100644
---
a/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/WebsocketServerSink.java
+++
b/streampipes-extensions/streampipes-sinks-brokers-jvm/src/main/java/org/apache/streampipes/sinks/brokers/jvm/websocket/WebsocketServerSink.java
@@ -19,32 +19,32 @@
package org.apache.streampipes.sinks.brokers.jvm.websocket;
import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataSink;
+import org.apache.streampipes.extensions.api.pe.config.IDataSinkConfiguration;
import
org.apache.streampipes.extensions.api.pe.context.EventSinkRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataSinkParameters;
import org.apache.streampipes.model.DataSinkType;
-import org.apache.streampipes.model.graph.DataSinkDescription;
import org.apache.streampipes.model.runtime.Event;
import org.apache.streampipes.sdk.builder.DataSinkBuilder;
import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
+import org.apache.streampipes.sdk.builder.sink.DataSinkConfiguration;
import org.apache.streampipes.sdk.helpers.EpRequirements;
import org.apache.streampipes.sdk.helpers.Labels;
import org.apache.streampipes.sdk.helpers.Locales;
import org.apache.streampipes.sdk.utils.Assets;
-import org.apache.streampipes.wrapper.params.compat.SinkParams;
-import org.apache.streampipes.wrapper.standalone.StreamPipesDataSink;
-import java.io.IOException;
-
-public class WebsocketServerSink extends StreamPipesDataSink {
+public class WebsocketServerSink implements IStreamPipesDataSink {
private static final String PORT_KEY = "port";
- private Integer port;
private SocketServer server;
@Override
- public DataSinkDescription declareModel() {
- return
DataSinkBuilder.create("org.apache.streampipes.sinks.brokers.jvm.websocket", 0)
+ public IDataSinkConfiguration declareConfig() {
+ return DataSinkConfiguration.create(
+ WebsocketServerSink::new,
+
DataSinkBuilder.create("org.apache.streampipes.sinks.brokers.jvm.websocket", 0)
.category(DataSinkType.MESSAGING)
.withLocales(Locales.EN)
.withAssets(Assets.DOCUMENTATION, Assets.ICON)
@@ -53,12 +53,13 @@ public class WebsocketServerSink extends
StreamPipesDataSink {
.requiredProperty(EpRequirements.anyProperty())
.build())
.requiredIntegerParameter(Labels.withId(PORT_KEY))
- .build();
+ .build());
}
@Override
- public void onInvocation(SinkParams parameters, EventSinkRuntimeContext
runtimeContext) throws SpRuntimeException {
- port = parameters.extractor().singleValueParameter(PORT_KEY,
Integer.class);
+ public void onPipelineStarted(IDataSinkParameters params,
+ EventSinkRuntimeContext runtimeContext) {
+ var port = params.extractor().singleValueParameter(PORT_KEY,
Integer.class);
server = new SocketServer(port);
server.setReuseAddr(true);
server.start();
@@ -70,11 +71,10 @@ public class WebsocketServerSink extends
StreamPipesDataSink {
}
@Override
- public void onDetach() throws SpRuntimeException {
+ public void onPipelineStopped() {
try {
- server.stop();
- server = null;
- } catch (IOException | InterruptedException e) {
+ server.stop(0);
+ } catch (InterruptedException e) {
throw new SpRuntimeException(e.getMessage());
}
}
diff --git
a/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventProcessorRuntime.java
b/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventProcessorRuntime.java
index c2b70c5401..356f57b8c7 100644
---
a/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventProcessorRuntime.java
+++
b/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventProcessorRuntime.java
@@ -96,6 +96,7 @@ public class StandaloneEventProcessorRuntime extends
StandalonePipelineElementRu
@Override
protected void afterStop() {
disconnectInputCollectors();
+ pipelineElement.onPipelineStopped();
outputCollector.disconnect();
}
diff --git
a/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventSinkRuntime.java
b/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventSinkRuntime.java
index 7c7f407c14..8dc453924b 100644
---
a/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventSinkRuntime.java
+++
b/streampipes-wrapper-standalone/src/main/java/org/apache/streampipes/wrapper/standalone/runtime/StandaloneEventSinkRuntime.java
@@ -81,6 +81,7 @@ public class StandaloneEventSinkRuntime extends
StandalonePipelineElementRuntime
@Override
protected void afterStop() {
inputCollectors.forEach(is -> is.unregisterConsumer(instanceId));
+ pipelineElement.onPipelineStopped();
postDiscard();
}
}