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

hutcheb pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 86d9db1ff7 plc4j-driver-opcua: Move back to using session lifetime * 
75% as keepalive period (#1148)
86d9db1ff7 is described below

commit 86d9db1ff71a59425018bca477aea07402000f7e
Author: Rajmund Takács <[email protected]>
AuthorDate: Sat Oct 14 13:13:18 2023 +0200

    plc4j-driver-opcua: Move back to using session lifetime * 75% as keepalive 
period (#1148)
    
    * plc4j-driver-opcua: Move back to using session lifetime * 75% as 
keepalive period
    
    * plc4j-driver-opcua: Do not send keepalive right away, and continously 
check exit condition
---
 .../plc4x/java/opcua/context/SecureChannel.java    | 27 ++++++++++++++++------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
index 9d80a7b4e6..df9ba53a99 100644
--- 
a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
+++ 
b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.opcua.context;
 import static java.lang.Thread.currentThread;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 
+import java.time.Instant;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
@@ -365,6 +366,7 @@ public class SecureChannel {
                                 ChannelSecurityToken securityToken = 
(ChannelSecurityToken) openSecureChannelResponse.getSecurityToken();
                                 tokenId.set((int) securityToken.getTokenId());
                                 channelId.set((int) 
securityToken.getChannelId());
+                                lifetime = securityToken.getRevisedLifetime();
                                 onConnectCreateSessionRequest(context);
                             } catch (PlcConnectionException e) {
                                 LOGGER.error("Error occurred while connecting 
to OPC UA server", e);
@@ -1003,6 +1005,24 @@ public class SecureChannel {
     private void keepAlive() {
         keepAlive = CompletableFuture.supplyAsync(() -> {
                 while (enableKeepalive.get()) {
+
+                    final Instant sendNextKeepaliveAt = Instant.now()
+                            .plus(Duration.ofMillis((long) 
Math.ceil(this.lifetime * 0.75f)));
+
+                    while (Instant.now().isBefore(sendNextKeepaliveAt)) {
+                        try {
+                            Thread.sleep(1000);
+                        } catch (InterruptedException e) {
+                            LOGGER.trace("Interrupted Exception");
+                            currentThread().interrupt();
+                        }
+
+                        // Do not attempt to send keepalive, if the thread has 
already been shut down.
+                        if (!enableKeepalive.get()) {
+                            return null; // exit from keepalive loop
+                        }
+                    }
+
                     int transactionId = 
channelTransactionManager.getTransactionIdentifier();
 
                     RequestHeader requestHeader = new RequestHeader(new 
NodeId(authenticationToken),
@@ -1103,13 +1123,6 @@ public class SecureChannel {
                     } catch (SerializationException | ParseException e) {
                         LOGGER.error("Unable to to Parse Open Secure Request");
                     }
-
-                    try {
-                        Thread.sleep((long) Math.ceil(this.sessionTimeout * 
0.25f));
-                    } catch (InterruptedException e) {
-                        LOGGER.trace("Interrupted Exception");
-                        currentThread().interrupt();
-                    }
                 }
                 return null;
             },

Reply via email to