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

内蒂:ctx。通道()。从Netty的工作线程以外的线程发送数据时,writeAndFlush(out)不工作

严朝明
2023-03-14

我在我的一个项目中使用Netty。有一个流程,我必须从其他线程(其他netty的工作线程)向客户端发送一些数据:

final ChannelFuture writeAndFlushFuture = ctx.channel().writeAndFlush(out)
                        .addListener(new GenericFutureListener<Future<? super Void>>() {
                            @Override
                            public void operationComplete(Future<? super Void> future) throws Exception {
                                LOGGER.info("=========> dsgdsfgdsfgdfsgdfsgsdgfd");
                            }
                        });

此外,我正在等待客户端接收到我的有效负载后的响应。我也将超时与它相关联,因此每当客户端在时间范围内没有回复时,我都会关闭来自服务器的上下文(假设连接错误)。

发生了一些奇怪的事情。每当我将有效负载发送给客户机时,我都不会在日志中打印它

dsgdsfgdsfgdfsgdfsgsdgfd

但是,由于超时,它是在我关闭连接之前打印的。我不确定我可能做错了什么,因为没有立即发送有效负载,而是在关闭连接之前。

这里会发生什么?

共有1个答案

丌官瀚
2023-03-14

实际上,当我将对象写入上下文时,缺少了一个刷新:

ctx.writeAndFlush(commands);

现在,它工作正常。但奇怪的是,当在Netty的工作线程中执行时,即使没有刷新,它也可以正常工作。

 类似资料:
  • 基于文档https://netty . io/4.1/API/io/netty/channel/channel pipeline . html:< br > //告诉管道在与I/O线程不同的线程中运行MyBusinessLogicHandler的事件处理程序方法 //,这样I/O线程就不会被 //阻塞,这是一项耗时的任务。 //如果您的业务逻辑是完全异步的或很快就完成了,您不需要指定一个组。 pi

  • 我正在设置一个Netty服务器来接受多个传入的客户端连接,这将反过来做一些处理,但对wroker线程组vs Handler线程感到困惑 我尝试分配10个工作线程和20个处理线程,如下所示。 我无法理解工作组的任务和创建新服务器处理程序之间的区别。据我所知,处理器线程池将分配给NettyServerHandler的每个实例。但是,创建由10个线程组成的工作组池的作用是什么呢?

  • 主线程通常被用于运行主循环,而主循环负责的都是 UI 相关的工作,所以也可以说主线程是 UI 线程。为了不影响 UI 线程的工作效率,我们会需要创建额外的线程来负责各种各样的工作,而这些线程就是工作线程。 在主循环的章节中,我们已经了解到主循环执行频率影响界面的流畅度,它的每一次循环都会按顺序执行处理定时器、处理事件队列、更新组件、渲染组件等任务,其中最容易影响到主循环的执行频率的任务是处理事件队

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?

  • 问题内容: 我试图弄清楚如何移植要使用的线程程序。我有很多代码可以围绕几个标准库进行同步,基本上是这样的: 一个线程创建值(可能是用户输入),而另一个线程对它们执行某些操作。关键是这些线程在出现新数据之前一直处于空闲状态,此时它们将唤醒并对其进行处理。 我正在尝试使用asyncio实现此模式,但是我似乎无法弄清楚如何使其“运行”。 我的尝试或多或少看起来像这样(根本不做任何事情)。 我尝试过使用协