В Netty 4 пример прокси AUTO_READ выключен, что в соответствии с этот ответ так, что канал, отправляющий много данных на прокси-сервер не слишком израсходован много буферов, что имеет смысл.
Тем не менее, я понимаю, что в HTTP / 2 вы никогда не должны задерживать чтение, а вместо этого иметь дело с управлением потоком на основе потока за потоком. Я не могу понять, как это сделать в Netty.
Такое ощущение, что этого следует достичь, возвращая 0 в onDataRead
на Http2ConnectionHandler
. Следующий надуманный пример - это то, как я ожидал, что он будет работать, где байты не потребляются в течение 100 мс:
@Override
public int onDataRead(ChannelHandlerContext ctx, int streamId, ByteBuf data,
int padding, boolean endOfStream) throws Http2Exception {
int processed = data.readableBytes() + padding;
Http2LocalFlowController flowController = decoder().flowController();
Http2Stream stream = connection().stream(streamId);
executorService.schedule(() -> {
ctx.executor().execute(() -> {
try {
// ...do stuff...
flowController.consumeBytes(stream, processed);
} catch (Http2Exception e) {
e.printStackTrace(); // now what?
}
});
}, 100, TimeUnit.MILLISECONDS);
return 0;
}
Когда я использую это, исключение не выдается, и клиент просто отключается. Поэтому я предполагаю, что вызов consumeBytes
не приводит к отправке WINDOW_UPDATE
кадров. (Обратите внимание, что если я вызову вызов consumeBytes
перед возвратом, т. Е. Не в другом потоке, он будет работать.)
Даже если это сработало, у DefaultHttp2ConnectionDecoder
достаточно логики в обработке исключений, поэтому я не хочу его повторно реализовывать. Так как же вы регулируете чтение потока в HTTP / 2 с помощью Netty?