QuanticPony opened a new issue, #900: URL: https://github.com/apache/plc4x/issues/900
### What happened? ## Summary When a connection stored in the connection-cache breaks due to a network failure, the connection is not removed from the cache and blocks future uses of the same connection string. ## Context Encountered while trying to solve a similar problem as https://github.com/apache/plc4x/issues/623 in the NiFi integration: When a processor is running and the network connection to the PLC is interrupted, the processors continues to throw errors even if the network connection is restored. This was brought up in a mail by me (https://lists.apache.org/thread/xm38nh8xzh1m1kj0y74dx0goo81cos82) that sparked a pull request by [heyoulin](https://github.com/spnettec) (https://github.com/apache/plc4x/pull/818), an issue by [splatch](https://github.com/splatch) (https://github.com/apache/plc4x/issues/821) and a commit from [@chrisdutz ](https://github.com/chrisdutz) (https://github.com/apache/plc4x/commit/9b06c2de0c77a7c1bbcb730bb5285c4435002c93). The commit (https://github.com/apache/plc4x/commit/9b06c2de0c77a7c1bbcb730bb5285c4435002c93) did not fully addressed the problem, so I bring my attempt to fix it. ## Replicate the problem In order to replicate the problem use the code at the end and follow the steps: 1) Start the main below 2) Disconnect network 3) Wait until errors are shown in the stdout 4) You will see the connection is been used after it fails: ``` 16:38:22.486 [main] DEBUG o.a.p.j.u.c.CachedPlcConnectionManager.getConnection:72 - Reusing exising connection Failed to read due to: java.util.concurrent.TimeoutExceptio ``` 5) Reconnect network. The problem persists. ## Possible Solution The LeasedConnection returns a Future that encapsulates the Future that connects to the PLC. The second one is the one that can mark the connection as invalid for removal. For the moment I have been able to work around this by overriding the `get` method of the first Future: ```java @Override public PlcReadResponse get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { try { return super.get(timeout, unit); } catch (TimeoutException e) { future.completeExceptionally(e); throw e; } } ``` You can see my solution in the zylklab fork (https://github.com/zylklab/plc4x/tree/Fix/nifi-integration-timeout). If you could give me some feedback I would like to make this into a PR as soon as posible. _____ ```java public class ManualTest { public static void main(String[] args) throws InterruptedException { CachedPlcConnectionManager cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).withMaxLeaseTime(Duration.ofMinutes(5)).build(); for (int i = 0; i < 100; i++){ Thread.sleep(1000); try (PlcConnection connection = cachedPlcConnectionManager.getConnection("s7://10.105.143.7:102?remote-rack=0&remote-slot=1&controller-type=S7_1200")) { PlcReadRequest.Builder plcReadRequestBuilder = connection.readRequestBuilder(); plcReadRequestBuilder.addTagAddress("foo", "%DB1:DBX0.0:BOOL"); PlcReadRequest plcReadRequest = plcReadRequestBuilder.build(); PlcReadResponse plcReadResponse = plcReadRequest.execute().get(1000, TimeUnit.MILLISECONDS); System.out.printf("Run %d: Value: %f%n", i, plcReadResponse.getFloat("foo")); } catch (Exception e) { System.out.println("Failed to read due to: "); e.printStackTrace(); } } } } ``` ### Version v0.11.0-SNAPSHOT ### Programming Languages - [X] plc4j - [ ] plc4go - [ ] plc4c - [ ] plc4net ### Protocols - [ ] AB-Ethernet - [ ] ADS /AMS - [ ] BACnet/IP - [ ] CANopen - [ ] DeltaV - [ ] DF1 - [ ] EtherNet/IP - [ ] Firmata - [ ] KNXnet/IP - [ ] Modbus - [ ] OPC-UA - [ ] S7 -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: dev-unsubscr...@plc4x.apache.org.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org