You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2018/11/24 20:35:57 UTC

[incubator-plc4x] 07/09: [plc4j-scraper] Fix for S7 Connection. Further implementation.

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

jfeinauer pushed a commit to branch feature/plc4j-scraper
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 1463e49c3bf63672f4c09e4ed508d406785957bc
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sat Nov 24 18:45:39 2018 +0100

    [plc4j-scraper] Fix for S7 Connection. Further implementation.
---
 .../java/base/connection/NettyPlcConnection.java   |  2 +-
 .../org/apache/plc4x/java/scraper/ScraperTask.java | 23 ++++++++++++++++++++--
 .../org/apache/plc4x/java/scraper/ScraperTest.java | 18 +++++++++++------
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
index 2f992b1..fd1ac78 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/NettyPlcConnection.java
@@ -97,7 +97,7 @@ public abstract class NettyPlcConnection extends AbstractPlcConnection {
 
     @Override
     public boolean isConnected() {
-        return connected;
+        return connected && channel.isActive();
     }
 
     public Channel getChannel() {
diff --git a/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/ScraperTask.java b/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/ScraperTask.java
index 9bbf5e4..b762c7a 100644
--- a/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/ScraperTask.java
+++ b/plc4j/utils/scraper/src/main/java/org/apache/plc4x/java/scraper/ScraperTask.java
@@ -24,6 +24,8 @@ import org.apache.commons.lang3.time.StopWatch;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -83,7 +85,16 @@ public class ScraperTask implements Runnable {
         requestCounter.incrementAndGet();
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
-        try (PlcConnection connection = driverManager.getConnection(connectionString)) {
+        PlcConnection connection = null;
+        try {
+            CompletableFuture<PlcConnection> future = CompletableFuture.supplyAsync(() -> {
+                try {
+                    return driverManager.getConnection(connectionString);
+                } catch (PlcConnectionException e) {
+                    throw new PlcRuntimeException(e);
+                }
+            }, handlerService);
+            connection = future.get(10*requestTimeoutMs, TimeUnit.MILLISECONDS);
             LOGGER.trace("Connection to {} established: {}", connectionString, connection);
             PlcReadResponse response;
             try {
@@ -111,9 +122,16 @@ public class ScraperTask implements Runnable {
             // Handle response (Async)
             CompletableFuture.runAsync(() -> handle(transformResponseToMap(response)), handlerService);
         } catch (Exception e) {
-            failedStatistics.addValue(1.0);
             LOGGER.debug("Exception during scrape", e);
             handleException(e);
+        } finally {
+            if (connection != null) {
+                try {
+                    connection.close();
+                } catch (Exception e) {
+                    // intentionally do nothing
+                }
+            }
         }
     }
 
@@ -166,6 +184,7 @@ public class ScraperTask implements Runnable {
     }
 
     public void handleException(Exception e) {
+        LOGGER.debug("Exception: ", e);
         failedStatistics.addValue(1.0);
     }
 
diff --git a/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
index 3a25f34..bb33c1a 100644
--- a/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
+++ b/plc4j/utils/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
@@ -21,6 +21,8 @@ package org.apache.plc4x.java.scraper;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.pool2.KeyedObjectPool;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
@@ -51,16 +53,20 @@ class ScraperTest {
     public static final String CONN_STRING_TIM = "s7://10.10.64.22/0/1";
     public static final String FIELD_STRING_TIM = "%DB225:DBW0:INT";
 
-        public static final String CONN_STRING_CH = "s7://10.10.64.20/0/1";
+    public static final String CONN_STRING_CH = "s7://10.10.64.20/0/1";
     public static final String FIELD_STRING_CH = "%DB3:DBD32:DINT";
 
     @Test
     void real_stuff() throws InterruptedException {
-        PlcDriverManager driverManager = new PooledPlcDriverManager(new PooledPlcDriverManager.PoolCreator() {
-            @Override
-            public KeyedObjectPool<PoolKey, PlcConnection> createPool(PooledPlcConnectionFactory pooledPlcConnectionFactory) {
-                return null;
-            }
+        PlcDriverManager driverManager = new PooledPlcDriverManager(pooledPlcConnectionFactory -> {
+            GenericKeyedObjectPoolConfig<PlcConnection> config = new GenericKeyedObjectPoolConfig<>();
+            config.setMaxWaitMillis(-1);
+            config.setMaxTotal(3);
+            config.setMinIdlePerKey(0);
+            config.setBlockWhenExhausted(true);
+            config.setTestOnBorrow(true);
+            config.setTestOnReturn(true);
+            return new GenericKeyedObjectPool<>(pooledPlcConnectionFactory, config);
         });
 
         Scraper scraper = new Scraper(driverManager, Arrays.asList(