繁体   English   中英

净值和多个处理程序

[英]Netty and multiple handlers

如何通过netty执行以下操作:

  1. 如果uri以“ / static / *”路径开始,请使用StaticHttpHandler
  2. 如果其他uri使用HttpHandler
  3. 如果“ / ws”使用WebSocketHandler

现在我有这段代码:

public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline p = ch.pipeline();
        p.addLast(new HttpServerCodec());
        p.addLast(new HttpHandler());

        // Other pipelene handlers?
    }
}

我可以在管道中使用“ swither”之类的东西吗? 否则这没有意义,我需要在处理程序中处理请求uri。 但是如何确定websocket协议呢?

在您自己的HttpHandler中,您必须先检查uri,然后再决定要运行哪个“真实”处理程序。 为此,有2种方法:

  • 在您的业务代码(HttpHandler)中已经分配或新分配了必要的对象(StaticHttpHandler和WebSocketHandler),然后通过显式调用它们将请求手动传递给它们(因此它们不再是“标准” Netty处理程序)
  • 要么有一个特定的处理程序(例如HttpRouteHandler),它决定将哪个处理程序添加到此请求的管道中,并将当前请求传递给下一个处理程序

第一个是最简单但不容易扩展的。

第二个要难一些,您必须确保/清除每个请求都到达正确的处理程序。 例如,

  • 连接通道后,所有请求都进入相同的性质吗? 如果是这样,那么您可以安全地添加必要的处理程序,甚至删除HttpRouteHandler。
  • 如果不是,那么对于每个请求,您必须决定根据需要添加/删除必要的处理程序,并将HttpRouteHandler保留在管道中以处理新的上下文

简而言之,您正在尝试在Web服务中实现路由解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM