- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
与直接使用 ChannelHandler 链相比,使用 ChannelInitializer 有什么优势?
例如,我可以使用服务器 Bootstrap :
bootstrap.childHandler(channel_handler);
在 channel_handler 的实现中添加我将实现以下内容
class simple_channel_handler implements ChannelHandler
{
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
// TODO Auto-generated method stub
System.out.println("handler added");
ctx.pipeline().addLast(new simple_channel_handler_2());
}
}
在 ChannelInitializer 的情况下
ch.pipeline().addLast(
new channel_handler_1(),
new channel_handler_2()
);
在我可以做的每个处理程序中
class channel_handler_1 extends ChannelInboundHandlerAdapter
{
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// TODO Auto-generated method stub
System.out.println("Channel just became active");
ctx.fireChannelRead(ctx); // Fire directly to channel handler 2
}
}
那么唯一的优势是 channel 处理程序不需要了解它在何处触发 channel 读取吗?我没有看到使用 channel 初始化程序的任何其他优势
最佳答案
根据文档(参见此处 http://netty.io/wiki/user-guide-for-4.x.html)
The handler specified here will always be evaluated by a newly accepted Channel. The ChannelInitializer is a special handler that is purposed to help a user configure a new Channel. It is most likely that you want to configure the ChannelPipeline of the new Channel by adding some handlers such as DiscardServerHandler to implement your network application. As the application gets complicated, it is likely that you will add more handlers to the pipeline and extract this anonymous class into a top level class eventually.
因此 ChannelInitializer 是一种根据需要添加处理程序的简洁方法,尤其是当您有多个处理程序时。
它不会阻止让一个处理程序添加更多处理程序(就像您在第一个示例中所做的那样),例如根据上下文在管道中动态添加/删除一个处理程序,但对于“静态”或“默认”系列处理程序,使用 ChannelInitializer 是一种更简洁的方法,因为它非常接近 Bootstrap 定义,因此更具可读性。
关于java - Netty 中 ChannelInitializer 相对于 Channel Handler 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189380/
在我的应用中,我使用 IntentService 发送短信。 @Override protected void onHandleIntent(Intent intent) { Bund
Handler(android.os.Handler.Callback) 已弃用,我应该改用什么? Handler handler = new Handler(new Handler.Callback
机器人Handler类包含此方法: public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 在给定时
我不明白怎么用这个方法, sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate, H
请告诉我 handler.postAtTime 和 handler.postDelayed 在 android 中的区别,也请指导我何时使用 handler.postAtTime 以及何时使用 han
我有以下代码。 function myFun() { alert(5) } $(document).ready(fu
我有this jsfiddle 它使用 toggle event - 不要与 toggle 混淆- jQuery 版本设置为 EDGE 它突然停止工作并删除了我想要作为触发器的单元格,因为它显然恢复为
在我的应用程序中,我定义了一个自定义事件,我希望为其设置默认处理程序。如果任何 Controller /服务想要覆盖默认处理,他们可以通过添加自己的处理程序来实现。 为了实现这个场景,我在 $root
我在我的网页中使用了 jquery .toggle(between two functions) : $( ".cpUpbtnsclass" ).toggle(function() { c
我有this jsfiddle 它使用 toggle event - 不要与 toggle 混淆- jQuery 版本设置为 EDGE 它突然停止工作并删除了我想要作为触发器的单元格,因为它显然恢复为
我浏览了官方文档,但我似乎找不到 new Handler() 之间是否有任何区别和new Handler(Looper.myLooper()) new Handler() Default constr
当我在 faces-config.xml 文件中添加以下行时: " com.sun.facelets.FaceletViewHandler " eclipse 说: " view-handler re
当我使用 Handler.dispatchMessage(msg) 时,handleMessage(Message msg) 将在新线程上运行,但是当我使用 Handler.sendMessage(
如何禁用当前将模态库导航到下一张图像的鼠标滚轮处理程序和键盘箭头键? 这里是演示站点:http://blueimp.github.com/Bootstrap-Image-Gallery/ . 如果您单
我正在尝试关注 this关于 Win32 结构化异常处理的文章。这篇文章很老了,但仍然被认为是对该主题的一个很好的介绍。 我正在尝试从下面转载的文章中编译代码示例 - //==============
我正在尝试使用 HibernateValidator 使用 Spring 和 Hibernate 在 JSP 中验证一个简单的表单. JSP页面Temp.jsp如下(web.xml中的url ptte
问题几乎概括了它。我错误地导入了 java.util.logging 并且没有获得所需的功能。现在我解决了我的问题,但我想知道为什么 android 创建了两个 Handler 。我们可能会错误地导入
我有一个主页,其中有一个链接按钮。在其中一个内容页面中,我需要隐藏链接按钮并替换为图像按钮。图像按钮的单击事件处理程序应该与母版页中链接按钮的单击事件完全相同。那么有没有办法从内容页面中的图像按钮单击
我有一个用 2.5 编写的现有 Spring MVC 应用程序。 我想使用新的注释 Controller 。我在某种程度上发现它非常灵活并且可以满足我的其他需求。 我的问题是,我似乎无法将它们两者混合
使用最新的 XCode,我收到此错误: 'logInWithReadPermissions(_:handler:)' is deprecated: use logInWithReadPermissi
我是一名优秀的程序员,十分优秀!