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

只有一个netty线程正在运行

厉高逸
2023-03-14

我用的是Netty camel-Netty:jar:2 . 10 . 0 . red hat-60024。下面是我对Netty监听器的配置

荨麻:tcp://10.1.33.204:9001?textline=true

在这里,我看到基于调试日志,Netty只创建一个工作线程,所以传入的消息被阻塞,直到现有的消息被处理。

喜欢:

2014-08-23 12:36:48,394|DEBUG|w I/O工人#5|Netty消费者
|ty.handlers.ServerChannelHandler 85|126-org.apache.camel.camel-netty-2.10.0.redhat-60024

直到 5 分钟进程正在运行,但我只看到这个线程处于活动状态。仅当此线程发送响应时,它才接受下一个请求

共有1个答案

狄兴业
2023-03-14

对于TCP,Netty创建多个工作线程,并将每个连接分配给特定的工作线程。该通道的所有事件都由该线程处理(请注意,这可能会更复杂,但这就足够了)。

听起来好像你在Netty worker线程中处理你的消息。因此,在您的进程返回之前,您将阻塞该连接上的任何进一步事件的处理,以及分配给工作线程的所有其他连接。

Netty 实际上正在创建多个工作线程。您可以在调试消息中看到通道正由 I/O 工作线程 5 处理。Netty 将默认创建 2 * Runtime.availableProcessor,但除非您干预,否则每个连接都由单个线程处理。

目前尚不清楚是否可以并发和无序处理请求,或者排序是否重要。如果排序很重要,您可以告诉 Camel 使用有序线程池执行器。这将在单独的线程池中处理请求,但同一连接上的后续请求仍将被第一个请求阻止。

如果订购不重要,您有几种选择。鉴于 camel 似乎正在使用 Netty 3,并允许您创建自定义管道,您可以使用 Netty 的 MemoryAwareThreadPoolExecutor 并发处理请求。也许看看当达到共享 MemoryAwareThreadPoolExecutor 的阈值时会发生什么?如果你这样做。

骆驼可能会提供其他机制来帮助,但我对骆驼并不太熟悉。SEDA部分可能是一个很好的开始。

 类似资料:
  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 以下是问题陈述: 编写一个java程序,使用线程计算前25个素数,并计算前50个斐波那契数。将计算斐波那契数的线程的优先级设置为8,将另一个设置为5。在计算了30个斐波那契数之后,让这个线程进入睡眠状态,开始计算素数。计算完25个素数后,继续斐波那契数计算。 我的代码: 我本以为当斐波那契线停止时,其余的素数会被打印出来,但那没有发生,这背后的原因可能是什么?

  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。

  • 在Flink中,像“平面地图”、“地图”等运算符称为任务,如果我将平面地图的并行度设置为30,那么这个任务有30个子任务。 现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程? Flink会在该插槽中简单地创建30个线程,还是使用类似线程池的东西? 以上不是一个恰当的例子。 假设在作业中我有操作符flatMap和map,它们都有并行度1,我只有一个插槽,这个插槽会创

  • 我知道在Netty4中,一旦建立了一个通道,该通道的所有事件处理都在分配给特定EventLoop的同一个线程上完成。此绑定在通道创建时完成。 我不明白的部分是,实际需要多少线程来接受新连接、创建新通道和进行绑定?

  • 我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。