@Override
    public Channel createChannel(ChannelHandler channelHandler) throws PlcConnectionException {
        try {
            Bootstrap bootstrap = createBootstrap();

            EventLoopGroup workerGroup = getEventLoopGroup();
            if (workerGroup != null) {
                bootstrap.group(workerGroup);
            }

            bootstrap.channel(getChannel());
            // Callback to allow subclasses to modify the Bootstrap

            configureBootstrap(bootstrap);
            bootstrap.handler(channelHandler);
            // Start the client.
            final ChannelFuture f = (localAddress == null) ?
                bootstrap.connect(remoteAddress) : bootstrap.connect(remoteAddress, localAddress);
            f.addListener(future -> {
                if (!future.isSuccess()) {
                    logger.info("Unable to connect, shutting down worker thread.");
                    if (workerGroup != null) {
                        workerGroup.shutdownGracefully();
                    }
                }
            });

            final Channel channel = f.channel();

            if (workerGroup != null) {
                // Shut down the workerGroup when channel closing to avoid open too many files
                channel.closeFuture().addListener(future -> workerGroup.shutdownGracefully());
                // Add to event-loop group
                eventLoops.put(channel, workerGroup);
            }

            // It seems the embedded channel operates differently.
            // Intentionally using the class name as we don't want to require a
            // hard dependency on the test-channel.
            if (!"Plc4xEmbeddedChannel".equals(channel.getClass().getSimpleName())) {
                // Wait for sync
                f.sync();
                // Wait till the session is finished initializing.
                f.awaitUninterruptibly(); // jf: unsure if we need that
            }

            return channel;
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new PlcConnectionException("Error creating channel.", e);
        } catch (Throwable t) {
            throw new PlcConnectionException("Error creating channel.", t);
        }
    }
Event Loop Group to use.
Has to be in accordance with {@link #getChannel()}
otherwise a Runtime Exception will be produced by Netty
<p>
By Default Netty's {@link NioEventLoopGroup} is used.
Transports which have to use a different EventLoopGroup have to override {#getEventLoopGroup()}.
plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java