0

我正在使用 Webflux 创建一个带有 Netty 的 TCP 服务器。在从 ChannelInboundHandlerAdapter 扩展的处理程序中,我toFuture().get()用来阻止 MongoDB 数据库操作并获取数据,但是当我调用 时channelHandlerContext.writeAndFlux(data),我得到java.io.IOException: Connection reset by peer .

TCP服务器的channelRead中处理数据库操作的正确方法是什么?

 @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        String data = new String((byte[]) msg);
        byte[] response = parseData((byte[]) data);
        ctx.writeAndFlush(response);
    }

    public byte[] parseData(byte[] data){
      Device device = getDeviceFrom(data);
      ...
      History history = historyService.getFirst(device.id).toFuture().get();
      .....
      return history.toBytes();
    }

如果我打电话block(),没有数据返回。如果我打电话.toFuture().get(),我会得到例外。

TPC 服务器的创建方式如下:

private void createTcpServer() {
        TcpServer.create()
                .handle((in,out) -> {
                    in.receive()
                            .asByteArray()
                            .subscribe();
                    return Flux.never();

                }) 
                .doOnConnection(conn ->
                        conn.addHandler("decode",new TcpDecoderHandler())
                                .addHandler("read",new TcpReadHandler(deviceService,historyService))
                                .addHandler("encode",new TcpEncoderHandler())
                )
                .port(9999)
                .bindNow();
    }
4

0 回答 0