Hi Łukasz,

thanks for the very quick response. It works as expected. 
Did You think the response code "REMOTE_ERROR" might more suite than 
"INTERNAL_ERROR"?

With best regards

Torsten Uhr
SQL Projekt AG  ▪ Franklinstraße 25 a  ▪ 01069 Dresden

Telefon:        (0351) 87619-0
Telefax:        (0351) 87619-99
E-Mail:         [email protected]
Web:    www.sql-ag.de 

Aufsichtsratsvorsitzender: Jürgen Bittner
Vorstand: Stefan Ehrlich, Jens Gärtner (Sprecher)
Handelsregister: HRB 38924 Amtsgericht Dresden
Die Zertifizierungsstelle der TÜV SÜD Management Service GmbH bescheinigt, dass 
die SQL Projekt AG für den Geltungsbereich "Entwicklung 
und Vertrieb von Datenbank- und Integrationslösungen sowie Beratung, Training 
und Support auf dem Gebiet datenbankgestützter 
Softwareprodukte" ein Qualitätsmanagementsystem eingeführt hat und anwendet.


Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail oder Inhalte 
ist nicht gestattet. 

This e-mail may contain confidential and/or privileged information. 
If you are not the intended recipient (or have received this e-mail in error) 
please notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure or distribution of the material in this e-mail is strictly 
forbidden.

-----Ursprüngliche Nachricht-----
Von: Łukasz Dywicki <[email protected]> 
Gesendet: Donnerstag, 21. Oktober 2021 23:21
An: [email protected]
Betreff: Re: AW: ClassCastException: class 
org.apache.plc4x.java.opcua.readwrite.ServiceFault cannot be cast to class 
org.apache.plc4x.java.opcua.readwrite.ReadResponse

Thank you for test case.

I've implemented basic fix for issue based on my sparse knowledge of OPC UA. 
Issue was missing a callback call when server returned an error.

I improved that, now you sohuld get at least failed answer back. 
Original reply is logged. I did not map yet status code from server.

Pushed to developer for 0.10, please test.

Best,
Łukasz


On 21.10.2021 14:03, Christofer Dutz wrote:
> Hi Thorsten,
> 
> first of all: Thank you for providing a Unit Test for demonstrating 
> your problem ... that makes our lives a lot easier :-)
> 
> I'm sure someone on the community will have a look at the issue soon. I'll 
> try to ping the right people for that.
> 
> Chris
> 
> -----Ursprüngliche Nachricht-----
> Von: Torsten Uhr <[email protected]>
> Gesendet: Donnerstag, 21. Oktober 2021 13:12
> An: [email protected]
> Betreff: ClassCastException: class 
> org.apache.plc4x.java.opcua.readwrite.ServiceFault cannot be cast to 
> class org.apache.plc4x.java.opcua.readwrite.ReadResponse
> 
> Hi all,
> 
> if I create an OPCUA connection (to milo) and wait 5 minutes before sending a 
> read request the error attached below is logged and the read execution blocks 
> infinitely.
> I'm used codebase 0.9.0 and 0.10.0 snapshot.
> Note: The wait simulates a connection created earlier and get from a 
> connection pool in a managed environment like application server.
> I think theres a timeout for pending connections on the server side. I would 
> expect, that the driver should throw an exception rather blocking?
> 
> [nioEventLoopGroup-2-1] WARN io.netty.channel.DefaultChannelPipeline - 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.
> io.netty.handler.codec.DecoderException: java.lang.ClassCastException: class 
> org.apache.plc4x.java.opcua.readwrite.ServiceFault cannot be cast to class 
> org.apache.plc4x.java.opcua.readwrite.ReadResponse 
> (org.apache.plc4x.java.opcua.readwrite.ServiceFault and 
> org.apache.plc4x.java.opcua.readwrite.ReadResponse are in unnamed module of 
> loader 'app')
>          at 
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98)
>          at 
> io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
>          at 
> io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
>          at 
> io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
>          at 
> io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:103)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
>          at 
> io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
>          at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
>          at 
> io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
>          at 
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
>          at 
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
>          at 
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
>          at 
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
>          at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
>          at 
> io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
>          at 
> io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
>          at 
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
>          at java.base/java.lang.Thread.run(Thread.java:834)
> Caused by: java.lang.ClassCastException: class 
> org.apache.plc4x.java.opcua.readwrite.ServiceFault cannot be cast to class 
> org.apache.plc4x.java.opcua.readwrite.ReadResponse 
> (org.apache.plc4x.java.opcua.readwrite.ServiceFault and 
> org.apache.plc4x.java.opcua.readwrite.ReadResponse are in unnamed module of 
> loader 'app')
>          at 
> org.apache.plc4x.java.opcua.protocol.OpcuaProtocolLogic.lambda$read$0(OpcuaProtocolLogic.java:177)
>          at 
> org.apache.plc4x.java.opcua.context.SecureChannel.lambda$4(SecureChannel.java:212)
>          at 
> org.apache.plc4x.java.spi.Plc4xNettyWrapper.decode(Plc4xNettyWrapper.java:175)
>          at 
> io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81)
>          at 
> io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88)
>          ... 23 more
> 
> 
> JUnit regeression test:
> 
> import org.apache.plc4x.java.PlcDriverManager;
> import org.apache.plc4x.java.api.PlcConnection;
> import org.apache.plc4x.java.api.messages.PlcReadRequest;
> import org.junit.Assert;
> import org.junit.jupiter.api.Test;
> 
> public class RegressionTest
> {
>     @Test
>     public void Timeout()
>     {
>        String connectionString = 
> "opcua:tcp://localhost:12686/milo?discovery=false";
>        final int TIMEOUT = 300 * 1000;
> 
>        try (PlcConnection plcConnection = new 
> PlcDriverManager().getConnection( connectionString ))
>        {
>           Thread.sleep( TIMEOUT );
> 
>           PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
>           builder.addItem("value", 
> "ns=2;s=HelloWorld/ScalarTypes/String");
> 
>           builder.build().execute().get();
>        }
>        catch( Throwable thr )
>        {
>           Assert.fail( thr.getMessage() );
>        }
>     }
> }
> 
> 
> With best regards
> Torsten Uhr
> 

Reply via email to