This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch 
3099-plc-adapters-do-not-recover-from-connection-failures
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to 
refs/heads/3099-plc-adapters-do-not-recover-from-connection-failures by this 
push:
     new 3b25e53753 fix(#3099): Remove broken connection from connection pool
3b25e53753 is described below

commit 3b25e537534efad0662469c19a78982308204b81
Author: Dominik Riemer <[email protected]>
AuthorDate: Fri Aug 2 16:49:56 2024 +0200

    fix(#3099): Remove broken connection from connection pool
---
 .../management/connect/PullAdapterScheduler.java   | 38 ++++++++++++++--------
 .../connection/ContinuousPlcRequestReader.java     |  4 +++
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git 
a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/PullAdapterScheduler.java
 
b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/PullAdapterScheduler.java
index de9a1b4146..7795d40bfb 100644
--- 
a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/PullAdapterScheduler.java
+++ 
b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/PullAdapterScheduler.java
@@ -33,27 +33,39 @@ import java.util.concurrent.TimeoutException;
 
 public class PullAdapterScheduler {
 
-  protected static final Logger LOGGER = 
LoggerFactory.getLogger(PullAdapterScheduler.class);
+  protected static final Logger LOG = 
LoggerFactory.getLogger(PullAdapterScheduler.class);
 
   private ScheduledExecutorService scheduler;
 
   public void schedule(IPullAdapter pullAdapter,
                        String adapterElementId) {
-    final Runnable task = () -> {
-      try {
-        pullAdapter.pullData();
-      } catch (ExecutionException | InterruptedException e) {
-        SpMonitoringManager.INSTANCE.addErrorMessage(
-            adapterElementId,
-            SpLogEntry.from(System.currentTimeMillis(), SpLogMessage.from(e)));
-      } catch (TimeoutException e) {
-        LOGGER.warn("Timeout occurred", e);
+    scheduler = Executors.newSingleThreadScheduledExecutor();
+    final Runnable task = new Runnable() {
+      @Override
+      public void run() {
+        try {
+          pullAdapter.pullData();
+        } catch (ExecutionException | InterruptedException | TimeoutException 
e) {
+          LOG.error("Error while pulling data", e);
+          SpMonitoringManager.INSTANCE.addErrorMessage(
+              adapterElementId,
+              SpLogEntry.from(System.currentTimeMillis(), SpLogMessage.from(e))
+          );
+        } finally {
+          scheduler.schedule(
+              this,
+              pullAdapter.getPollingInterval().value(),
+              pullAdapter.getPollingInterval().timeUnit()
+          );
+        }
       }
     };
 
-    scheduler = Executors.newScheduledThreadPool(1);
-    scheduler.scheduleAtFixedRate(task, 1,
-        pullAdapter.getPollingInterval().value(), 
pullAdapter.getPollingInterval().timeUnit());
+    scheduler.schedule(
+        task,
+        pullAdapter.getPollingInterval().value(),
+        pullAdapter.getPollingInterval().timeUnit()
+    );
   }
 
   public void shutdown() {
diff --git 
a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
 
b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
index befc54a234..80086d20d2 100644
--- 
a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
+++ 
b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
@@ -55,6 +55,10 @@ public class ContinuousPlcRequestReader
       var event = eventGenerator.makeEvent(readResponse);
       collector.collect(event);
     } catch (Exception e) {
+      // ensure that the cached connection manager removes the broken 
connection
+      if (connectionManager instanceof CachedPlcConnectionManager) {
+        ((CachedPlcConnectionManager) 
connectionManager).removeCachedConnection(settings.connectionString());
+      }
       LOG.error("Error while reading from PLC with connection string {} ", 
settings.connectionString(), e);
     }
   }

Reply via email to