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