Netty 当共享内存warethreadpoolexecutor';达到了什么阈值?

Netty 当共享内存warethreadpoolexecutor';达到了什么阈值?,netty,Netty,当达到MemoryWareThreadPoolExecutor的通道或总阈值时,通道会发生什么情况?MemoryWareThreadPoolExecutor被设置为ExecutionHandler,它位于I/O处理程序之前的每个管道上 我目前的信息状况: 我发现:channel.setReadable(false)被调用。这意味着所有通道上的所有读取操作都将停止,对吗?所以传入的数据不会被传送到任何管道,不是吗? 如果我做对了,您应该将管道末端的代码分为非阻塞业务处理程序和阻塞业务处理程序,在阻

当达到MemoryWareThreadPoolExecutor的通道或总阈值时,通道会发生什么情况?MemoryWareThreadPoolExecutor被设置为ExecutionHandler,它位于I/O处理程序之前的每个管道上

我目前的信息状况:

我发现:
channel.setReadable(false)
被调用。这意味着所有通道上的所有读取操作都将停止,对吗?所以传入的数据不会被传送到任何管道,不是吗? 如果我做对了,您应该将管道末端的代码分为非阻塞业务处理程序和阻塞业务处理程序,在阻塞处理程序之前有一个执行处理程序。 示例:->解码器、编码、非阻塞处理器、ExecutionHandler、I/O处理器

在这方面,我认为最好是将消息至少发送到执行处理程序之前的最后一个处理程序。如果我是对的,则在执行处理程序的线程池再次低于阈值之前,不需要由I/O处理程序处理的消息将不会进入非阻塞处理程序

我承认,这并不能保证消息按每个通道的接收顺序执行。但是让我们假设这是没有必要的


向纳蒂致以最良好的问候和干杯

Channel.setReadable(false)只会影响其被称为无其他通道的通道。

Channel.setReadable(false)只会影响其被称为无其他通道的通道。

当达到给定通道的通道阈值时,Channel.setReadable(false)将被调用,从而防止从该通道进一步读取。当处理了足够的数据时,将调用channel.setReadable(true),允许再次读取数据。同时,任何未读数据都将存储在操作系统网络堆栈缓冲区中或备份到发送主机

当达到总阈值时,尝试排队的IO线程将被阻止,直到处理了足够的数据。您必须非常小心,因为在以下情况下可能会导致死锁:

  • 通道(或多个通道)接收数据的速度快于可处理的速度
  • 通道队列超过总阈值限制,阻塞IO线程
  • 线程池线程将一些数据写回通道,并等待其完成
  • 线程池线程永远不会释放,因为IO线程在等待其返回时被阻塞,因此无法处理写入请求


    还有一件事,除非您在线程池中排队使用ChannelBuffers,否则您确实需要创建ObjectSizeEstimator的自定义实现,以确保线程池能够正确管理阈值。

    当达到给定通道的通道阈值时,channel.setReadable(false)将被调用,从而防止从该通道进一步读取。当处理了足够的数据时,将调用channel.setReadable(true),允许再次读取数据。同时,任何未读数据都将存储在操作系统网络堆栈缓冲区中或备份到发送主机

    当达到总阈值时,尝试排队的IO线程将被阻止,直到处理了足够的数据。您必须非常小心,因为在以下情况下可能会导致死锁:

  • 通道(或多个通道)接收数据的速度快于可处理的速度
  • 通道队列超过总阈值限制,阻塞IO线程
  • 线程池线程将一些数据写回通道,并等待其完成
  • 线程池线程永远不会释放,因为IO线程在等待其返回时被阻塞,因此无法处理写入请求

    还有一件事,除非您正在线程池中排队ChannelBuffers,否则您确实需要创建ObjectSizeEstimator的自定义实现,以确保线程池能够正确管理阈值