My I/O Fluss folgt:Netty - Feuer ReadTimeoutHandler wenn mehrere liest in Kanal
- Client sendet 1 Daten #
- Server (handler) empfängt von Datenbankdaten zum Kanal, um die Client-Daten nach und sendet es an den Client
- Client sendet Daten # 2
- Server (handler) empfängt Daten wieder auf Kanal von der Datenbank die Clientdaten nach und sendet sie zurück an den Client und beendet Kanal
Wenn der erste eingelesene Kanal zu lange dauert, löst ReadTimeoutHandler die Ausnahme wie erwartet aus. Aber wenn das erste Lesen ok ist (= schnell genug) und das zweite Einlesen der Kanäle zu lange dauert, wird keine TimeoutException ausgelöst und der Handler wartet 5 Minuten, bis er den Kanal schließt. Es scheint, dass ReadTimeoutHandler nur für den ersten eingelesenen Kanal funktioniert. Ist es überhaupt möglich ReadTimeoutHandler mit mehreren Reads im Channel zu arbeiten?
Gebrauchte Netty Version: 4.0.12
public class MyServer {
private static final class MyInitializer extends ChannelInitializer<SocketChannel> {
...
@Override
public void initChannel(SocketChannel channel) throws Exception {
channel.pipeline().addLast(
new ReadTimeoutHandler(5, TimeUnit.SECONDS),
new MyHandler(server, serverConnection));
}
...
}
}
public class MyHandler erweitert SimpleChannelInboundHandler {
private static final Logger LOG = LoggerFactory.getLogger(MyHandler.class);
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
super.channelActive(ctx);
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
Message message = database.getMessage(msg);
ChannelFuture operation = ctx.writeAndFlush(message)
if (message.isEnd()) operation.addListener(new CloseConverstationListener(ctx));
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
if (cause instanceof ReadTimeoutException) {
LOG.error("ReadTimeoutException");
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
}
private class CloseConverstationListener implements GenericFutureListener<ChannelFuture> {
private final ChannelHandlerContext ctx;
private CloseConverstationListener(ChannelHandlerContext ctx) {
this.ctx = ctx;
}
@Override
public void operationComplete(ChannelFuture future) throws Exception {
future.channel().close().sync();
}
}
}
Sind Sie sicher, dass Sie Ihre vollständige Pipeline veröffentlicht haben? Es gibt keine Konversation von Bytes zu Strings. – Ferrybig