如何使用netty在单独的线程池中执行业务逻辑处理程序

2023-12-01

我有一个需要执行一些业务逻辑的处理程序,我希望它在单独的线程池中执行,以免阻塞 io 事件循环。我已将 DefaultEventExecutorGroup 添加到管道中,如中指定的http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.htmljavadoc 和http://netty.io/wiki/new-and-noteworthy-in-4.0.html#no-more-executionhandler---its-in-the-core wiki:

ch.pipeline().addLast(new DefaultEventExecutorGroup(10), new ServerHandler());

出于测试目的,我的 ServerHandler 只是让当前线程休眠 5 秒:

protected void channelRead0(ChannelHandlerContext ctx, Command cmd) throws Exception {
    System.out.println("Starting.");

    try {
        Thread.currentThread().sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Finished.");        
}

但显然业务逻辑仍然是同步执行的:

Starting.
Finished.
Starting.
Finished.
Starting.
Finished.

我缺少什么?


如果您的目标不是阻止 IO 事件循环 - 您做对了。但由于 netty 特定,您的处理程序将始终附加到 EventExecutorGroup 的同一线程,因此您上面描述的行为是预期的。

如果您想在阻塞操作到达时立即并行执行,则需要使用另一种方式 - 单独ThreadPoolExecutor。像这样:

ch.pipeline().addLast(new ServerHandler(blockingThreadPool));

where blockingThreadPool是有规律的ThreadPoolExecutor.

例如:

ExecutorService blockingThreadPool = Executors.newFixedThreadPool(10);

现在,在逻辑处理程序中,您可以向此执行程序提交阻塞任务,如下所示:

protected void channelRead0(ChannelHandlerContext ctx, Command cmd) throws Exception {

    blockingIOProcessor.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("Starting.");

            try {
                Thread.currentThread().sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("Finished.");
        }
    });

}

您还可以将上下文传递给此可运行对象,以便在处理完成时返回响应(如果需要)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用netty在单独的线程池中执行业务逻辑处理程序 的相关文章

随机推荐

  • mod_rewrite 删除 GET 变量

    我正在尝试采取 example com home lang fr foo bar 并重定向到 example com fr home foo bar I tried RewriteCond QUERY STRING lang a z 2 R
  • 传递给线程的 lambda 内的调用函数

    我正在尝试创建一个对象 可以为它的构造函数提供一个函数及其参数 然后 此类将在 lambda 中调用给定函数 并将该函数传递给线程 类似的东西 class worker public template
  • 通过单个函数返回另一个函数的多个参数

    由于我选择了一个误导性的问题标题 因此该问题被作为完全相同的重复问题关闭 这没有错 但提出了一个经常讨论的问题 例如在这个问题 由于内容涉及 Stackoverflow 上从未涉及的更具体的主题 因此我希望重新讨论该问题 现在发生了这种情况
  • Android ProgressDialog 存在线程问题

    我在进程运行时使用 ProgressDialog 时遇到问题 我已经尝试了所有可能的错误方法 并且查看了许多网站 这些网站提供了我正在尝试做的事情的示例 但是 我仍然遇到线程在 ProgressDialog 出现之前运行的问题 这是我的最新
  • Oracle 中 MySQL 临时表的替代方案

    我注意到这两个系统中临时表的概念是不同的 我沉思了一下 我在MySQL中有以下场景 删除临时表 a 如果存在 创建临时表 a 通过存储过程用数据填充它 在另一个存储过程中使用数据 如何在Oracle中实现相同的场景 我可以 最好在一个过程中
  • R,时间序列,Arima模型,预测,每日数据[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我试图用2012年1月16日到2013年10月10日的每日数据进行一些需求预测 但预测结果很糟糕 有什么线索吗 这就是数据在图中的样子 存在每周和每月的季节性 即 工作日期间需求较多
  • 拆分表达式

    我必须根据所有括号字符串都应拆分的标准将字符串拆分为子字符串列表 可以说我有 9 2 3 4 2 那我应该得到 4 2 3 6 and 9 2 18 基本目标是我知道哪个内括号将首先被执行 然后执行它 请帮忙 如果您能建议一种使用 re 模
  • 函数内部“.append”和“+”语义差异

    我很难理解这 3 个示例之间的区别 example1 list1 1 2 3 4 list1 list1 6 list1 append 1000 print Example 1 list1 example 2 def f j j j 6 j
  • 更改 Xcode 项目的单一语言

    如何在不进行本地化的情况下更改项目使用的默认语言 如果我希望我的应用程序是日语或意大利语怎么办 仅使用日语或意大利语文本就足够了吗 如何更改 iTunes 上显示的语言 使其显示为日语或意大利语 通常 您放入主文件夹中的资源被假定位于Def
  • 通过AJAX将表单数据传递到mySQL

    我使用 JavaScript 和 AJAX 将表单数据发送到 php 处理文件 然后填充 SQL 数据库 而无需刷新初始表单页面 php SQL 连接正常 但表单数据未正确发送 有两个字段 一个称为 选择 的单选组 以及一个称为 评论 的文
  • 使用多个参数调用特征文件

    我想调用具有 3 个参数的功能文件 第一个参数用于创建具有该名称的实体 其余 2 个参数用于验证创建的实体是否具有特定字段所需的值 我怎样才能在空手道中做到这一点 您可以将所有输入保存在一个 JSON 中 并将其传递给您的功能 如本文档中所
  • 如何使用密码保护已有的 PDF?

    如何为现有的PDF设置密码 你有没有看过加密 pdf我书第12章中的例子 就这么简单 public void encryptPdf String src String dest throws IOException DocumentExce
  • SELECT TOP 1 返回多条记录

    我将在下面链接我的数据库 我有一个名为 TestMonday1 的查询 它的作用是返回 NoOfFrees 最少的学生 并将查询结果插入到课程表中 运行查询应该有助于解释我的意思 我遇到的问题是我的 SQL 代码有 SELECT TOP 1
  • 在多个页面上绘制

    我正在尝试编写一个绘制 ggplot 的函数facet wrap绘制多个页面 这只是一个 hack 因为这个功能似乎在 ggplot2 功能待办事项列表中 我做了一些小计算来找到我需要的页数 我的行数data frame我非常有信心这一切都
  • 在没有 pdfkit 的情况下将 Pandas DataFrame 保存为 PDF 文件格式

    我想将 pandas 数据框保存为 pdf 格式 import pdfkit as pdf config pdf configuration wkhtmltopdf C Program Files wkhtmltopdin wkhtmlto
  • XSLT - 不得复制节点值

    我想使用 XSLT 转换一些 xmi 文件 一切正常 但我不明白为什么标记值 Version 1 0 和 EAUML Version 1 0 由我的模板 packagedElement 复制 请参阅输出 xmi 文件
  • SQL Server GUID 排序算法。为什么?

    唯一标识符的问题 我们有一个现有的数据库 它广泛使用唯一标识符 不幸的是 作为主键和一些表的一些可为空的列 我们遇到过这样的情况 在这些表上运行的一些报告对这些唯一标识符进行排序 因为表中没有其他列可以提供有意义的排序 这不是很讽刺吗 目的
  • 从 ID 列表中删除 mysql 服务器中的行 C#

    我正在尝试从 C 中的 ID 列表中删除 MySQL 表中的一系列行 表中有一个employeeID 行 基本上我的问题是我会使用什么样的语法 你可能会使用IN你的条款DELETE DELETE FROM EmployeeTable WHE
  • 如何使用 getUsermedia 和 mediaRecorder 下载录音并给出视频规格?

    navigator mediaDevices getUserMedia then stream gt a recorder is created var mediaRecorder new MediaRecorder stream star
  • 如何使用netty在单独的线程池中执行业务逻辑处理程序

    我有一个需要执行一些业务逻辑的处理程序 我希望它在单独的线程池中执行 以免阻塞 io 事件循环 我已将 DefaultEventExecutorGroup 添加到管道中 如中指定的http netty io 4 0 api io netty