Лучшая практика для маршрутизации запросов, чтобы делегировать их различным методам в Netty? - PullRequest
2 голосов
/ 23 января 2012
  1. Есть ли у netty встроенная поддержка для этого?
  2. Если его нет, где я должен это сделать и как это должно быть реализовано?

1 Ответ

5 голосов
/ 23 января 2012

Я не верю, что есть встроенная поддержка. Однако это не так сложно реализовать в качестве оператора switch в вашем обработчике.

Взгляните на этот веб-сокет пример .

    @Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    Object msg = e.getMessage();
    if (msg instanceof HttpRequest) {
        handleHttpRequest(ctx, (HttpRequest) msg);
    } else if (msg instanceof WebSocketFrame) {
        handleWebSocketFrame(ctx, (WebSocketFrame) msg);
    }
}

private void handleHttpRequest(ChannelHandlerContext ctx, HttpRequest req) throws Exception {
    // Allow only GET methods.
    if (req.getMethod() != GET) {
        sendHttpResponse(ctx, req, new DefaultHttpResponse(HTTP_1_1, FORBIDDEN));
        return;
    }

    // Send the demo page and favicon.ico
    if (req.getUri().equals("/")) {
        HttpResponse res = new DefaultHttpResponse(HTTP_1_1, OK);

        ChannelBuffer content = WebSocketServerIndexPage.getContent(getWebSocketLocation(req));

        res.setHeader(CONTENT_TYPE, "text/html; charset=UTF-8");
        setContentLength(res, content.readableBytes());

        res.setContent(content);
        sendHttpResponse(ctx, req, res);
        return;
    } else if (req.getUri().equals("/favicon.ico")) {
        HttpResponse res = new DefaultHttpResponse(HTTP_1_1, NOT_FOUND);
        sendHttpResponse(ctx, req, res);
        return;
    }

    // Handshake
    WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
            this.getWebSocketLocation(req), null, false);
    this.handshaker = wsFactory.newHandshaker(req);
    if (this.handshaker == null) {
        wsFactory.sendUnsupportedWebSocketVersionResponse(ctx.getChannel());
    } else {
        this.handshaker.handshake(ctx.getChannel(), req);
    }
}

В messageReceived() мы маршрутизируем на основе типа полученного сообщения.

Затем в handleHttpRequest() мы маршрутизируем на основе URI.

Надеюсь, это поможет.

...