如何在 Netty 通道处理程序中安全地执行阻塞操作?

2023-12-27

我正在构建一个基于 Netty 的小型应用程序,该应用程序通过套接字连接(即 telnet/ssh)执行 I/O 操作。我正在使用 Netty 启动我的套接字服务器ServerBootstrap类,给出:

  1. 类型的事件循环NioEventLoopGroup(即不应遭受阻塞操作的共享线程池)。

  2. 类型通道NioServerSocketChannel(我相信这需要与上面的#1相对应)。

  3. 一个非常简单的管道,带有扩展的通道处理程序ChannelInboundHandlerAdapter.

我的处理程序channelRead(...)每当从客户端套接字连接接收到命令字符串时,就会调用该方法,并根据命令返回一些响应字符串。

对于不涉及阻塞操作的命令来说一切都很好。但是,我现在需要从数据库中读取或写入一些命令。这些 JDBC 调用本质上会被阻塞......尽管我could use a CompletableFuture(或其他)在单独的线程中处理它们。

但即使我通过在单独的线程中执行阻塞操作来“滚动我自己的异步”,我也不确定如何将这些生成的线程的结果重新连接回主线程中的 Netty 通道处理程序。

我看到ChannelHandlerContext类具有如下方法:

ChannelFuture writeAndFlush(Object msg, ChannelPromise promise);

...作为我当前使用的替代品:

ChannelFuture writeAndFlush(Object msg);

但我找不到任何文档或指南(甚至有用的 Javadocs)来解释如何使用它ChannelPromise在此用例中键入。它的名字表明它might相关,但也可能不相关。毕竟,writeAndFlush方法仍然将传出消息作为其第一个参数...那么,如果您需要第一个参数的结果已经在手边,那么将阻塞操作填充到“promise”第二个参数中会有什么好处呢?

这里什么才是正确的道路?是否有某种方法可以在单独的线程中处理阻塞操作,以便 Netty 的NioEventLoopGroup不阻塞?或者这根本不是 Netty 的工作方式,如果您需要支持阻塞,您应该使用不同的事件循环实现(即为每个客户端套接字连接生成一个单独的线程)?


如果 Netty 中的操作需要较长时间才能完成或阻塞,建议在handler that uses a separate ExecutorGroup这样主EventLoop线程就不会被阻塞。

您可以在管道创建期间指定。

引用一个使用执行器组进行数据库操作的示例ChannelPipeline javadoc http://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html

static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
 ...

 ChannelPipeline pipeline = ch.pipeline();

 pipeline.addLast("decoder", new MyProtocolDecoder());
 pipeline.addLast("encoder", new MyProtocolEncoder());

 // Tell the pipeline to run MyBusinessLogicHandler's event handler methods
 // in a different thread than an I/O thread so that the I/O thread is not blocked by
 // a time-consuming task.
 // If your business logic is fully asynchronous or finished very quickly, you don't
 // need to specify a group.
 pipeline.addLast(group, "handler", new MyBusinessLogicHandler());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Netty 通道处理程序中安全地执行阻塞操作? 的相关文章

  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 从 Stax XMLStreamReader 读取以解组部分

    我正在使用 Stax 游标 API 从大型 xml 文件中提取数据 当前 我转到特殊标签的开头并使用 JAXB 解组该标签 这对于格式良好的 xml 文件效果很好 但不久前我有一个文档 其中数十万个标签中有一个未关闭 JAXB 使用 XML
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 角度 2 ngIf 与可观察?

    我有一个非常简单的服务 它的工作是从 api authenticate url 获取 200 或 401 auth service ts Injectable export class AuthService constructor pri
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 在 Angular.JS 中获取数据后更改 ng-view

    我将使用 http 和 JSON 响应从服务器获取一些数据 http get 路由更改后调用 但在下载数据之前模板已更改 我的目标是 用户按下菜单中的超链接 可以更改路线 显示正在加载微调器 DOM 元素位于另一个控制器中 该控制器每次都在
  • Java中有什么好的动态SQL生成器库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都知道一些好的 Java SQL 构建器库 例如Squiggle http code googl
  • 在 Heroku Post Build 期间,找不到文件

    这是一个 React 应用程序 具有样式化的组件 并通过 Node 后端部署到 Herokugit push heroku master 我从单独的文件中导入每个组件的样式import from style 其中文件结构是 OptionsC
  • 将 pandas 数据框从分类重塑为计数

    我正在尝试重塑具有两列的数据框 ID 和分类 以便每个唯一的分类值都有一列 这是我所拥有的 ID Animal foo cat foo dog bar cat baz cat biz dog biz cow biz dog 这就是我想要的
  • 我试图掌握创建使用 SQL Server 数据库的程序的概念,但我习惯于仅在本地计算机上运行它

    如何使程序使用 SQL Server 数据库 并让该程序在安装它的任何计算机上运行 如果您今天一直在关注我的一系列问题 您就会知道我正在为中小型企业制作一个开源且免费的帮助台套件 客户端应用程序 客户端应用程序是 Windows 窗体应用程
  • 获取查询结果列中重复值的计数

    我想获取查询结果列中结果中重复的值的计数 我从复杂查询中得到的结果集是 svn rvn eng count 1 1 Boy 1 2 1 Teacher 1 3 1 Chair 1 3 2 Chairwoman 1 3 3 Chairpers
  • 如何在 Kotlin 中获取泛型类型参数的类

    我想从泛型类型获取类属性T 我决定延长至Any但我收到错误 https kotlinlang org api latest jvm stdlib kotlin any index html extension properties http
  • 如何在 rspec 中调用 rake 任务

    我正在尝试在我的 rspec 中调用 rake 任务 require rake rake Rake Application new Rake application rake rake init rake load rakefile rak
  • :focus-within 当聚焦第一个孩子而不是最后一个时

    我有一个 section 仅当第一个子元素接收焦点而不是第二个子元素时 我才想在其中设置焦点的元素 我尝试使用 not伪类 但这没有成功 值得注意的是 我仍然需要将焦点放在第二个元素上 只是不想有两个焦点元素 父元素 子元素 如下例所示 C
  • 每个请求调用 Django 自定义上下文处理器两次

    我创建了一个简单的自定义上下文处理器 只需运行 每个请求一次 添加一些日志挂钩后 我发现它 每个请求被调用两次 这是文档中遗漏的已知 功能 吗 与继承树中模板的数量有关吗 是1 03的bug吗 这不是预期的行为 上下文处理器执行一次每次实例
  • 设置输入值而不是 sendKeys() - Selenium WebDriver nodejs

    我有很长的字符串要测试sendKeys 需要太长时间 当我尝试设置的值时text程序崩溃 我知道硒sendKeys 是测试实际用户输入的最佳方法 但对于我的应用程序来说 它需要太多时间 所以我试图避免它 有没有办法立即设置该值 请参阅这个简
  • 如何从 Google Cloud 文本转语音 API 获取 SSML 时间戳

    我想用SSML标记 https www w3 org TR 2009 REC speech synthesis 20090303 edef mark通过 Google Cloud 文本转语音 API 来请求音频流中这些标记的计时 为了向用户
  • 有点复杂的sql行位置

    基本上我有相册 里面有 50 张图像 现在 如果我显示图像列表 我知道从哪一行显示 显示 50 中的 20 到 30 意味着显示 20 30 之间的 10 行 现在好了问题是 我想选择一个图像 但仍然显示它选择了哪个位置 这样我就可以来回移
  • Chrome 扩展:打开选项卡,转到网址,填写表单并提交表单

    我正在遵循这里的教程http www blackweb20 com 2010 01 11 creating your own google chrome extension http www blackweb20 com 2010 01 1
  • 提取关键词匹配列表

    我有大量的数据 没有一致的句子格式 并且我有一个我引用的关键字列表 每当数据中存在关键字时 我想将它们提取到另一列中 我希望如何提取关键字的示例 https i stack imgur com h8im7 png我不介意它是否给出 红苹果
  • 将 Windows 本地文件夹挂载到 pod 中

    我在本地 Kubernetes 环境中运行带有 SQL Server 的 Ubuntu 容器 并在 Windows 笔记本电脑上使用 Docker Desktop 现在我正在尝试安装本地文件夹 C data sql 其中包含 pod 中的数
  • 具有相对路径的 CMake 安装目标

    我试图弄清楚如何编写一个可以通过调用使用的库find package 在另一个项目中 我正在尝试遵循 Catch2 存储库CMake文件 https github com catchorg Catch2 blob master CMakeL
  • org.apache.camel.ExchangeTimedOutException:未在 30000 毫秒内收到 OUT 消息

    我正在尝试使用 fusion esb apache Camel seda activemq 公开 Web 服务 但我面临着将状态消息返回到 Web 服务调用的问题 这是我的简单骆驼路线
  • 供个人使用的高质量文本转语音引擎[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个我能买得起的高质量 TTS 引擎 假设价格低于 1000 美元 到目前为止 我已经尝试过
  • 如何在 Netty 通道处理程序中安全地执行阻塞操作?

    我正在构建一个基于 Netty 的小型应用程序 该应用程序通过套接字连接 即 telnet ssh 执行 I O 操作 我正在使用 Netty 启动我的套接字服务器ServerBootstrap类 给出 类型的事件循环NioEventLoo