当前位置: 首页 > 知识库问答 >
问题:

触发按需TCP消息到可重新连接、不可共享的Netty管道的正确方法是什么?

顾学真
2023-03-14

我有一个棘手的问题。x TCP客户端应用程序具有重新连接侦听器,我想不出实现将写入套接字通道的触发器(HTTP、MQ等)的方法。

到目前为止,我尝试通过以下另一个示例向我的ChannelInboundHandler添加write(ByteBuf msg),但是使用我的reconnect listener,我在重新连接时遇到以下异常:

... is not a @Sharable handler, so can't be added or removed multiple times.

我对Netty是新手,所以我不确定用户事件触发器是否可以解决这个问题。

重新连接代码:

if (!future.isSuccess()) {
    future.channel().eventLoop().schedule(() -> {
        bootstrap.connect().addListener(this);
    }, reconnectDelayTimeNanos, TimeUnit.NANOSECONDS);
} else {
    future.channel().closeFuture().addListener((ChannelFuture cf) -> {
        bootstrap.connect().addListener(this);
    });
}

引导代码:

final MyHandler myHandler = new MyHandler();
final EventLoopGroup requestGroup = new NioEventLoopGroup();
final Bootstrap requestBootstrap = new Bootstrap()
        .group(requestGroup)
        .channel(NioSocketChannel.class)
        .remoteAddress("localhost", 9999)
        .option(ChannelOption.SO_KEEPALIVE, true);
requestBootstrap.handler(new ChannelInitializer<SocketChannel>() {
    @Override
    protected void initChannel(final SocketChannel ch) {
        ch.pipeline().addLast(myHandler);
    }
});

为了能够从我的处理程序中使用写(ByteBuf msg)方法,处理程序需要在Channel初始器之外有一个引用。

我希望能够从触发器(HTTP、MQ等)向管道、非共享处理程序等发送消息

目前,我得到以下例外情况:

... is not a @Sharable handler, so can't be added or removed multiple times.

共有1个答案

澹台成龙
2023-03-14

您需要通过使用@sharable或重写isSharable()方法将您的MyHandler标记为可共享。也就是说,在这种情况下,您需要确保处理程序是线程安全的。

 类似资料:
  • 我刚刚开始学习Netty,想慢慢来真正理解它是如何工作的。我有一个基于独立套接字测试程序的初始用例: 从客户端连接到服务器时,立即发送消息并处理响应 很简单...或者我是这么想的。我已经看了好几天了,不太明白为什么它的表现不如预期。 这是最初的测试程序,它再次简单地连接到远程服务器,并立即向服务器写入字节缓冲区。然后服务器立即发送一个ack响应,该响应被写入控制台。 我用Netty做了同样的测试,

  • 自定义ByteToMessageEncoder不接收在相同tcp连接中发送的字节,而是接收在不同tcp消息中发送的字节。 我被指派解决一个问题,一个几年前的系统开始出现不良行为。在我看来,有一个tcp服务器是由其他一些开发人员用netty编写的,它接收带有静态长度头和可变长度主体的二进制消息。正文长度由a头字段定义,该字段告诉消息类型。我们维护一个消息类型及其长度的地图。 所面临的问题是,在正确解

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 我正在将我的“普通NIO”(=我直接使用了JDK中的软件包)TCP服务器迁移到Netty 4。 我有向所有客户端发送消息的线程,例如运行状况检查数据包,聊天消息广播,直接聊天消息到单个客户端,...使用我保留在某处集合。 我如何在Netty中做到这一点?在一个Netty处理程序和需要发送消息的线程之间共享一个ChannelGroup是否明智?该通道将如下所示: 在所有线程中,我将简单地执行以下操作

  • 问题内容: 我的Go服务器上有一个有效的TCP套接字设置。我接受传入连接,运行for循环并使用net.Conn.Read函数读取传入数据。 但这对我来说毫无意义。如何知道已收到完整的消息以便继续返回消息大小? 这是我目前的代码: 可以说我的应用程序发送的消息长度为6个字节(可以是任意大小)。怎么知道收到消息后才继续呢? 我的经验主要在于C#,所以Go在这里并不常见。对于我的C#应用​​程序,消息具