You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/01/04 14:14:15 UTC

[camel] branch main updated: camel-plc4x: Added autoReconnect uri parameter (#8971)

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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new bcf6b1b181f camel-plc4x: Added autoReconnect uri parameter (#8971)
bcf6b1b181f is described below

commit bcf6b1b181fa3b335dc9a81cf754b51f3c5654fd
Author: Stein Overtoom <st...@overtoom.email>
AuthorDate: Wed Jan 4 15:14:08 2023 +0100

    camel-plc4x: Added autoReconnect uri parameter (#8971)
    
    * camel-plc4x: Added autoReconnect uri parameter
    
    * camel-plc4x: fix autoReconnect parameter style
    
    * camel-plc4x: autoReconnect parameter, log level to warn (code review)
    
    Co-authored-by: Stein Overtoom <st...@triopsys.nl>
---
 .../camel/component/plc4x/Plc4XEndpointConfigurer.java   |  6 ++++++
 .../camel/component/plc4x/Plc4XEndpointUriFactory.java   |  3 ++-
 .../org/apache/camel/component/plc4x/plc4x.json          |  1 +
 .../org/apache/camel/component/plc4x/Plc4XConsumer.java  | 16 ++++++++++++++++
 .../org/apache/camel/component/plc4x/Plc4XEndpoint.java  | 11 +++++++++++
 .../org/apache/camel/component/plc4x/Plc4XProducer.java  | 10 ++++++++++
 6 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointConfigurer.java b/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointConfigurer.java
index 2e7690a3f9d..2537be5a0d8 100644
--- a/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointConfigurer.java
+++ b/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointConfigurer.java
@@ -21,6 +21,8 @@ public class Plc4XEndpointConfigurer extends PropertyConfigurerSupport implement
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
         Plc4XEndpoint target = (Plc4XEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autoreconnect":
+        case "autoReconnect": target.setAutoReconnect(property(camelContext, boolean.class, value)); return true;
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
         case "exceptionhandler":
@@ -39,6 +41,8 @@ public class Plc4XEndpointConfigurer extends PropertyConfigurerSupport implement
     @Override
     public Class<?> getOptionType(String name, boolean ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autoreconnect":
+        case "autoReconnect": return boolean.class;
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return boolean.class;
         case "exceptionhandler":
@@ -58,6 +62,8 @@ public class Plc4XEndpointConfigurer extends PropertyConfigurerSupport implement
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         Plc4XEndpoint target = (Plc4XEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
+        case "autoreconnect":
+        case "autoReconnect": return target.isAutoReconnect();
         case "bridgeerrorhandler":
         case "bridgeErrorHandler": return target.isBridgeErrorHandler();
         case "exceptionhandler":
diff --git a/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointUriFactory.java b/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointUriFactory.java
index 76fd27c6389..4119a71ee01 100644
--- a/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointUriFactory.java
+++ b/components/camel-plc4x/src/generated/java/org/apache/camel/component/plc4x/Plc4XEndpointUriFactory.java
@@ -21,7 +21,8 @@ public class Plc4XEndpointUriFactory extends org.apache.camel.support.component.
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(8);
+        Set<String> props = new HashSet<>(9);
+        props.add("autoReconnect");
         props.add("bridgeErrorHandler");
         props.add("driver");
         props.add("exceptionHandler");
diff --git a/components/camel-plc4x/src/generated/resources/org/apache/camel/component/plc4x/plc4x.json b/components/camel-plc4x/src/generated/resources/org/apache/camel/component/plc4x/plc4x.json
index 107b2544ad4..4acf94aa598 100644
--- a/components/camel-plc4x/src/generated/resources/org/apache/camel/component/plc4x/plc4x.json
+++ b/components/camel-plc4x/src/generated/resources/org/apache/camel/component/plc4x/plc4x.json
@@ -28,6 +28,7 @@
   },
   "properties": {
     "driver": { "kind": "path", "displayName": "Driver", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "PLC4X connection string for the connection to the target" },
+    "autoReconnect": { "kind": "parameter", "displayName": "Auto Reconnect", "group": "common", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to reconnect when no connection is present upon doing a request" },
     "tags": { "kind": "parameter", "displayName": "Tags", "group": "common", "label": "", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tags to read as Map containing the tag name associated to its query" },
     "period": { "kind": "parameter", "displayName": "Period", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Interval on which the Trigger should be checked" },
     "trigger": { "kind": "parameter", "displayName": "Trigger", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Query to a trigger. On a rising edge of the trigger, the tags will be read once" },
diff --git a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XConsumer.java b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XConsumer.java
index c7b74c8aefc..69bd8f56e8b 100644
--- a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XConsumer.java
+++ b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XConsumer.java
@@ -30,6 +30,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.support.DefaultConsumer;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.scraper.config.JobConfigurationImpl;
@@ -85,6 +86,15 @@ public class Plc4XConsumer extends DefaultConsumer {
     }
 
     private void startUnTriggered() {
+        if (plc4XEndpoint.isAutoReconnect() && !plcConnection.isConnected()) {
+            try {
+                plc4XEndpoint.reconnect();
+                LOGGER.debug("Successfully reconnected");
+            } catch (PlcConnectionException e) {
+                LOGGER.warn("Unable to reconnect, skipping request", e);
+                return;
+            }
+        }
         PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
         for (Map.Entry<String, Object> tag : tags.entrySet()) {
             try {
@@ -116,9 +126,15 @@ public class Plc4XConsumer extends DefaultConsumer {
 
         TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, (job, alias, response) -> {
             try {
+                if (plc4XEndpoint.isAutoReconnect() && !plcConnection.isConnected()) {
+                    plc4XEndpoint.reconnect();
+                    LOGGER.debug("Successfully reconnected");
+                }
                 Exchange exchange = plc4XEndpoint.createExchange();
                 exchange.getIn().setBody(response);
                 getProcessor().process(exchange);
+            } catch (PlcConnectionException e) {
+                LOGGER.warn("Unable to reconnect, skipping request", e);
             } catch (Exception e) {
                 getExceptionHandler().handleException(e);
             }
diff --git a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XEndpoint.java b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XEndpoint.java
index b714c93a853..7a1a70b2118 100644
--- a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XEndpoint.java
+++ b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XEndpoint.java
@@ -54,6 +54,9 @@ public class Plc4XEndpoint extends DefaultEndpoint {
     @UriParam
     @Metadata(label = "consumer", description = "Interval on which the Trigger should be checked")
     private int period;
+    @UriParam
+    @Metadata(description = "Whether to reconnect when no connection is present upon doing a request")
+    private boolean autoReconnect;
 
     private PlcDriverManager plcDriverManager;
     private PlcConnection connection;
@@ -86,6 +89,14 @@ public class Plc4XEndpoint extends DefaultEndpoint {
         plcDriverManager = new PooledPlcDriverManager();
     }
 
+    public void setAutoReconnect(boolean autoReconnect) {
+        this.autoReconnect = autoReconnect;
+    }
+
+    public boolean isAutoReconnect() {
+        return autoReconnect;
+    }
+
     public PlcConnection getConnection() throws PlcConnectionException {
         if (this.connection == null) {
             this.connection = plcDriverManager.getConnection(this.uri);
diff --git a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XProducer.java b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XProducer.java
index f73d867f1da..77ca0244d15 100644
--- a/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XProducer.java
+++ b/components/camel-plc4x/src/main/java/org/apache/camel/component/plc4x/Plc4XProducer.java
@@ -26,6 +26,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.support.DefaultAsyncProducer;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
@@ -59,6 +60,15 @@ public class Plc4XProducer extends DefaultAsyncProducer {
 
     @Override
     public void process(Exchange exchange) throws Exception {
+        if (plc4XEndpoint.isAutoReconnect() && !plcConnection.isConnected()) {
+            try {
+                plc4XEndpoint.reconnect();
+                log.debug("Successfully reconnected");
+            } catch (PlcConnectionException e) {
+                log.warn("Unable to reconnect, skipping request", e);
+                return;
+            }
+        }
         Message in = exchange.getIn();
         Object body = in.getBody();
         PlcWriteRequest.Builder builder = plcConnection.writeRequestBuilder();