我正在使用Netty编写一些http服务器。
让我们想象我有这样的东西(在初始化程序中,所有处理程序都扩展为ChannelInboundHandlerAdapter
):
// REST API handlers
pipeline.addLast(new CreateEventHandler());
pipeline.addLast(new GetEventHandler());
pipeline.addLast(new UpdateEventHandler());
pipeline.addLast("delete", new DeleteEventHandler());
我的问题是我可以将对象传递给这样的特定处理程序(例如,CreateEventHandler
中的某个地方):
ChannelInboundHandlerAdapter h = (ChannelInboundHandlerAdapter) ctx.pipeline().get("delete");
h.channelRead(ctx, msg);
如果是,这是一个好方法吗?或者我保证会得到一些开销或错误?或者我必须通过管道中的所有处理程序传递一个对象?
感谢。
答案 0 :(得分:1)
这不是设计应用程序的好方法。 Netty ChannelPipeline定义了处理程序的序列,每个处理程序都可以转换通过它的数据。实质上,传入/传出数据通过管道中的所有入站/出站处理程序传递。它不是一个“条件派遣”机制,而是您正在寻找的机会。
看起来你正在构建一个REST服务;您只需要一个通用的HTTP管道和一个单个入站处理程序,它将根据HTTP方法调度到您的应用程序代码。这意味着您的示例(GetEventHandler
等)中的处理程序都不需要扩展ChannelInboundHandlerAdapter
- 它们可以是没有特定于netty的代码的简单Java类。这将为您提供协议和业务逻辑之间的良好分离。