Netty:如何将对象传递给特定的处理程序?

时间:2018-03-14 13:02:39

标签: java netty

我正在使用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);

如果是,这是一个好方法吗?或者我保证会得到一些开销或错误?或者我必须通过管道中的所有处理程序传递一个对象?

感谢。

1 个答案:

答案 0 :(得分:1)

这不是设计应用程序的好方法。 Netty ChannelPipeline定义了处理程序的序列,每个处理程序都可以转换通过它的数据。实质上,传入/传出数据通过管道中的所有入站/出站处理程序传递。它不是一个“条件派遣”机制,而是您正在寻找的机会。

看起来你正在构建一个REST服务;您只需要一个通用的HTTP管道和一个单个入站处理程序,它将根据HTTP方法调度到您的应用程序代码。这意味着您的示例(GetEventHandler等)中的处理程序都不需要扩展ChannelInboundHandlerAdapter - 它们可以是没有特定于netty的代码的简单Java类。这将为您提供协议和业务逻辑之间的良好分离。