Hi Stefano,

Connection reset looks like the remote hung up.
In general the code looks good. One thing you could do would be to do a 
wireshark recording. Then we can identify what's going wrong.

In that case ideally create a jira issue and attach that pcapng file to that.

Chris
________________________________
Von: Stefano Bossi <[email protected]>
Gesendet: Samstag, 25. Juli 2020 09:06
An: [email protected] <[email protected]>
Betreff: Re: Connection died after disconnection


Dear Chris,

I tried to follow your suggestions but I still have some problem.

I wrote a test application to show you the problem and ask suggestions.
Basically my app fire a couple of thread which read a field in a DB 
continuously; the problem is that after some seconds one of the two thread fire 
an untrappable exception and the software dies.
Here is my code:

package it.fox;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager;

public class App {

    private static final Logger logger = LogManager.getLogger(App.class);
    public static void main(String[] args) {

        try {
            PlcConnection plcConnection = new 
PooledPlcDriverManager().getConnection("s7://192.168.1.192?controller-type=S7_1200");
            if (plcConnection.getMetadata().canRead() ) {
                Poller01 poller01 = new Poller01();
                poller01.start(plcConnection);
                Poller02 poller02 = new Poller02();
                poller02.start(plcConnection);

            } else {
                logger.error("This connection doesn't support reading.");
                Thread.sleep(5000);
            }
        } catch (Exception exception) {
            logger.error("Error connecting to the PLC", exception);
        }
    }
}


package it.fox;

import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;

public class Poller01 implements Runnable {

    private static final Logger logger = LogManager.getLogger(Poller01.class);
    private Thread thread;
    private PlcConnection plcConnection;

    @Override
    public void run() {
        PlcReadRequest.Builder requestBuilder = 
plcConnection.readRequestBuilder();
        requestBuilder.addItem("data", "%DB1:262.0:INT");
        PlcReadRequest readRequest = requestBuilder.build();
        while(true){
            try {
                PlcReadResponse response = readRequest.execute().get(5000, 
TimeUnit.MILLISECONDS);
                if (response != null){
                    logger.info("poller01 = {}", response.getPlcValue("data") );
                    Thread.sleep( (int) Math.floor(Math.random() * 100) );
                } else {
                    logger.error("No response from PLC in reading polling 
variable");
                    break;
                }
            } catch (Exception e) {
                logger.error("Poller01 Exception", e);
            }
        }
    }

    /**
     * Start the thread
     */
    public void start(PlcConnection plcConnection) {
        this.plcConnection = plcConnection;
        logger.info("Starting poller01 thread");
        if (thread == null) {
            thread = new Thread(this, "poller01");
            thread.start();
        }
    }

}


package it.fox;

import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;

public class Poller02 implements Runnable{

    private static final Logger logger = LogManager.getLogger(Poller02.class);
    private Thread thread;
    private PlcConnection plcConnection;

    @Override
    public void run() {
        PlcReadRequest.Builder requestBuilder = 
plcConnection.readRequestBuilder();
        requestBuilder.addItem("data", "%DB1:0.0:DINT");
        PlcReadRequest readRequest = requestBuilder.build();
        while(true){
            try {
                PlcReadResponse response = readRequest.execute().get(5000, 
TimeUnit.MILLISECONDS);
                if (response != null){
                    logger.info("poller02 = {}", response.getPlcValue("data") );
                    Thread.sleep( (int) Math.floor(Math.random() * 500) );
                } else {
                    logger.error("No response from PLC in reading polling 
variable");
                    break;
                }
            } catch (Exception e) {
                logger.error("Poller01 Exception", e);
            }
        }
    }

    /**
     * Start the thread
     */
    public void start(PlcConnection plcConnection) {
        this.plcConnection = plcConnection;
        logger.info("Starting poller02 thread");
        if (thread == null) {
            thread = new Thread(this, "poller02");
            thread.start();
        }
    }
}


The exception the code throw is:

[INFO ] 22:59:19.767 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Instantiating new PLC Driver Manager with class loader 
jdk.internal.loader.ClassLoaders$AppClassLoader@55054057
[INFO ] 22:59:19.770 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Registering available drivers...
[INFO ] 22:59:19.774 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Registering driver for Protocol s7 (Siemens S7 (Basic))
[INFO ] 22:59:19.908 
org.apache.plc4x.java.transport.tcp.TcpChannelFactory.configureBootstrap() - 
Configuring Bootstrap with Configuration{local-rack=1, local-slot=1, 
remote-rack=0, remot-slot=0, pduSize=1024, maxAmqCaller=8, maxAmqCallee=8, 
controllerType='S7_1200'}
[INFO ] 22:59:20.158 it.fox.Poller01.start() - Starting poller01 thread
[INFO ] 22:59:20.160 it.fox.Poller02.start() - Starting poller02 thread
[INFO ] 22:59:20.244 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.286 it.fox.Poller02.run() - poller02 = 12139
[INFO ] 22:59:20.347 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.400 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.530 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.661 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.726 it.fox.Poller02.run() - poller02 = 12139
[INFO ] 22:59:20.786 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:20.913 it.fox.Poller01.run() - poller01 = 7
[INFO ] 22:59:21.035 it.fox.Poller02.run() - poller02 = 12139
[WARN ] 22:59:21.046 
io.netty.channel.DefaultChannelPipeline.onUnhandledInboundException() - An 
exceptionCaught() event was fired, and it reached at the tail of the pipeline. 
It usually means the last handler in the pipeline did not handle the exception.
java.net.SocketException: Connection reset
    at 
sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:345) 
~[?:?]
SocketChannelImpl.java:345
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:376) ~[?:?]
SocketChannelImpl.java:376
    at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
PooledByteBuf.java:253
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
AbstractByteBuf.java:1133
    at 
io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
 ~[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioSocketChannel.java:350
    at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
 [netty-transport-4.1.47.Final.jar:4.1.47.Final]
AbstractNioByteChannel.java:148
    at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) 
[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioEventLoop.java:714


or in another run:

[INFO ] 22:58:32.997 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Instantiating new PLC Driver Manager with class loader 
jdk.internal.loader.ClassLoaders$AppClassLoader@55054057
[INFO ] 22:58:33.000 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Registering available drivers...
[INFO ] 22:58:33.005 org.apache.plc4x.java.PlcDriverManager.<init>() - 
Registering driver for Protocol s7 (Siemens S7 (Basic))
[INFO ] 22:58:33.138 
org.apache.plc4x.java.transport.tcp.TcpChannelFactory.configureBootstrap() - 
Configuring Bootstrap with Configuration{local-rack=1, local-slot=1, 
remote-rack=0, remot-slot=0, pduSize=1024, maxAmqCaller=8, maxAmqCallee=8, 
controllerType='S7_1200'}
[INFO ] 22:58:33.388 it.fox.Poller01.start() - Starting poller01 thread
[INFO ] 22:58:33.389 it.fox.Poller02.start() - Starting poller02 thread
[INFO ] 22:58:33.472 it.fox.Poller02.run() - poller02 = 12139
[WARN ] 22:58:33.473 
io.netty.channel.DefaultChannelPipeline.onUnhandledInboundException() - An 
exceptionCaught() event was fired, and it reached at the tail of the pipeline. 
It usually means the last handler in the pipeline did not handle the exception.
java.net.SocketException: Connection reset
    at 
sun.nio.ch.SocketChannelImpl.throwConnectionReset(SocketChannelImpl.java:345) 
~[?:?]
SocketChannelImpl.java:345
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:376) ~[?:?]
SocketChannelImpl.java:376
    at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
PooledByteBuf.java:253
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133) 
~[netty-buffer-4.1.47.Final.jar:4.1.47.Final]
AbstractByteBuf.java:1133
    at 
io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
 ~[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioSocketChannel.java:350
    at 
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
 [netty-transport-4.1.47.Final.jar:4.1.47.Final]
AbstractNioByteChannel.java:148
    at 
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) 
[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioEventLoop.java:714
    at 
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
 [netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioEventLoop.java:650
    at 
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) 
[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioEventLoop.java:576
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) 
[netty-transport-4.1.47.Final.jar:4.1.47.Final]
NioEventLoop.java:493
    at 
io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
 [netty-common-4.1.47.Final.jar:4.1.47.Final]
SingleThreadEventExecutor.java:989
    at 
io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) 
[netty-common-4.1.47.Final.jar:4.1.47.Final]
ThreadExecutorMap.java:74
    at 
io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
 [netty-common-4.1.47.Final.jar:4.1.47.Final]
FastThreadLocalRunnable.java:30
    at java.lang.Thread.run(Thread.java:830) [?:?]


Is there some sort of race condition?

Regards,
Stefano Bossi

​

Reply via email to