我正在对 Netty 应用程序进行负载测试。
根据诺曼·毛尔的建议,该应用程序大量使用向EventExecutor
可访问对象ChannelHandlerContext#executor()
提交任务。(我以这种方式提交的任务保留了对提交时生效的引用。)ChannelHandlerContext
在观察到应用程序中的奇怪行为后,我记录了ChannelHandlerContext.pipeline().toMap()
这些任务之一的输出,因为它由EventExecutor
(定义)事件循环执行。
如此记录的管道令人惊讶(对我而言)是空的。
(我从更传统的channelRead
方法中记录了管道,不用说它不是空的。)
我的应用程序中没有任何逻辑可以从ChannelPipeline
.
我没有关闭任何通道(客户端要求连接保持活动状态)。
我很确定我一定做错了什么——也许我不清楚 a 何时ChannelPipeline
超出范围或以其他方式“清除”。当一个ChannelPipeline
由Netty中清除出去?
Netty 本身不会从管道中删除处理程序。ChannelPipeline
当不再使用时(通道保持ChannelPipeline
关闭)由 GC 收集为常规 Java 对象。
因此,要么您在代码中执行此操作(但您没有执行此操作),要么使用通道销毁管道。在您进行负载测试时,我的建议是:
在负载下,这个 ChannelHandlerContext “被删除”,因此提交的写入任务在事件循环运行时不能发生。
这是预期的。频道可能随时不可用。因此,如果您将任务委托给某个线程池,您应该检查通道是否仍然处于活动/可写状态,或者您可以ChannelFuture
从write()
操作中使用它。
更新:
根据您的需要,您有多种选择。您可以在实际写入之前检查通道是否可写:
if (ctx.channel().isWritable()) {
//write
}
您可以检查ChannelFuture
写操作的结果:
ChannelFuture cf = ctx.writeAndFlush();
//cf has a bunch of method + listeners that you can use
您也可以使用ChannelPromise
并覆盖所需的方法。
Netty 非常灵活,并提供了许多可能的流程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句