Hi guys,
I just will resend this message in case you missed it.
Hi guys,
I can send you this code, which doesn't have much business logic, and all
params are renamed.
public abstract class LalelDriver<T extends Message> extends
GeneratedDriverBase<T> {
private final ChannelHandler handler;
@Override
public String getProtocolName() {
return "Lalel";
}
@Override
protected Class<? extends Configuration> getConfigurationType() {
return LalelConfiguration.class;
}
@Override
protected String getDefaultTransport() {
return "tcp";
}
@Override
protected boolean canSubscribe() {
return true;
}
@Override
protected LalelFieldHandler getFieldHandler() {
return new LalelFieldHandler();
}
@Override
protected void initializePipeline(ChannelFactory channelFactory) {
try {
final Channel channel =
channelFactory.createChannel(this.handler);
channelFactory.initializePipeline(channel.pipeline());
} catch (PlcConnectionException e) {
log.error("Failed to create channel");
}
}
}
public classLalelDriverTcp extends LalelDriver<EthernetMessage> {
public LalelDriverTcp(final ChannelHandler handler){
super(handler);
}
@Override
public String getProtocolCode() {
return "lalel-tcp";
}
@Override
protected ProtocolStackConfigurer<EthernetMessage> getStackConfigurer()
{
return DriverUtils.buildStackConfigurer(
EthernetMessage.class, EthernetMessageIO.class,
LalelProtocolLogicTcp.class, ByteLengthEstimator.class
);
}
/**
* Estimate the Length of a Packet
*/
public static class ByteLengthEstimator implements
ToIntFunction<ByteBuf> {
@Override
public int applyAsInt(ByteBuf byteBuf) {
if (byteBuf.readableBytes() >= 2) {
return byteBuf.getUnsignedShortLE(byteBuf.readerIndex());
}
return -1;
}
}
}
And connection code:
this.connection = driver.getConnection(connectionString);
this.connection.connect();
Kind regards,
Vlad
Kind regards,
Vlad
чт, 17 сент. 2020 г. в 12:09, Christofer Dutz <[email protected]>:
> Hi Vlad,
>
> 0.8.0-SNAPSHOT is the current development version ...
> we'll be releasing that as soon as we tied up some things we're currently
> working on.
>
> Chris
>
>
>
> Am 17.09.20, 11:02 schrieb "Vladyslav Milutin" <[email protected]>:
>
> Hi Stefano,
>
> I'm curious about the 0.8.0 version, where I can find it? Since maven
> repo
> contains the latest version 0.7.0.
>
> Kind regards,
> Vlad
>
> ср, 16 сент. 2020 г. в 17:30, Stefano Bossi <[email protected]>:
>
> > Hi Vlad,
> >
> > this seems similar to a bug fixed some time ago, I am not really
> sure but
> > it worth to try to use the 0.8.0 version where this fix is present.
> >
> > You should try to build the version and here you could fine some
> help:
> > https://plc4x.apache.org/developers/index.html
> >
> > Regards,
> > Stefano
> >
> > On 16/09/2020 14:32, Vladyslav Milutin wrote:
> >
> > Hello guys,
> >
> > I'm writing to you with a hope that you can help me with exception
> > handling.
> > Currently after a long time connection can be reset by peer. See
> stacktrace
> > below.
> >
> > I've tried to add a custom ChannelHandler which Overrides
> exceptionCaught()
> > and add it in Driver#initializePipeline() see code below. Also has
> tried to
> > add a channel that can be obtained from DefaultNettyPlcConnection.
> And none
> > of them actualy was added to the pipeline where this exception was
> thrown.
> >
> > plc4x version: 0.7.0
> >
> > StatckTrace:
> > 2020-09-16 13:50:03.340 WARN [nioEventLoopGroup-58-1]
> > [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.io.IOException: Connection reset by peer
> > at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)
> > at java.base/sun.nio.ch
> .SocketDispatcher.read(SocketDispatcher.java:39)
> > at
> java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
> > at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:233)
> > at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)
> > at java.base/sun.nio.ch
> .SocketChannelImpl.read(SocketChannelImpl.java:358)
> > at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
> > at
> io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133)
> > at
> >
> io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
> > at
> >
> io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
> > at
> >
> io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
> > at
> >
> io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
> > at
> >
> io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
> > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
> > at
> >
> io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
> > 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)
> >
> > Driver#initializePipeline:
> > try {
> > final Channel channel =
> > channelFactory.createChannel(this.handler);
> > channelFactory.initializePipeline(channel.pipeline());
> >
> > } catch (PlcConnectionException e) {
> > log.error("Failed to create channel");
> > }
> >
> > ChannelHandler:
> > @Override
> > public void exceptionCaught(ChannelHandlerContext ctx, Throwable
> cause)
> > {
> > log.warn("ExceptionCaught in worker: ctx = [{}], cause =
> [{}, {}],
> > workerName = [{}]",
> > ctx, cause.getClass(), cause.getMessage(),
> workerName);
> > if (cause instanceof ConnectTimeoutException) {
> > log.warn("ConnectionTimeout caught: workerName = [{}]",
> > workerName);
> > }
> > if ((cause instanceof IOException) &&
> > cause.getMessage().contains("Connection reset by peer")) {
> > log.warn("Connection reset by peer caught: workerName =
> [{}]",
> > workerName);
> > } else {
> > log.info("Unexpected exception caught: workerName =
> [{}]",
> > workerName);
> > }
> >
> > this.callback.accept(cause);
> > }
> >
> > DefaultNettyPlcConnection#channel:log.info("Trying to get
> connection channel: worker name = [{}]",
> > this.workerName);
> > final Channel channel = ((DefaultNettyPlcConnection)
> > this.connection).getChannel();
> > log.info("Channel obtained successfully. Adding custom
> > channelHandler to it: channel = [{}], workerName = [{}]", channel,
> > this.workerName);
> > channel.pipeline().addLast(this.channelHandler);
> > log.info("ChannelHandler added: channel = [{}],
> channelHandler =
> > [{}], workerName = [{}]", channel, this.channelHandler,
> this.workerName);
> >
> > Kind regards,
> > Vlad
> >
> >
> >
> >
>
>