В процессе получения экспертизы по этому фреймворку, хотелось бы получить ответы на некоторые затыки, которые сам не смог решить.
Каналы отличная абстракция, но кажется, что на каждое сообщение создавать канал не очень производительное решение. Есть ли у кого опыт заворачивания прогонки батча сообщений в один канал
или это не стоит того ?
То есть хотелось бы уйти от
bootstrap.connect().addListener(
(ChannelFutureListener) connectionFuture -> connectionFuture.channel().writeAndFlush(msg));
на каждое сообщение.
Самый главный вопрос, в моем приложении мне нужно получить финальный респонс от сервера, в котором будет статус код.
Не нашел элегантного решения, кроме как складывать статус в аттрибут канала. К тому же, чтобы гарантированно дождаться ответа с респонзом нужно вызывать sync(), что ударяет про перформансу обработки пайплайна. Хотелось бы уйти от sync() и как-то решить вопрос откуда мне забирать статус и куда его соответственно сохранять.
pipelineFuture.channel().closeFuture().sync().addListener( // здесь хотелось бы урать метод sync(), но пока без него мы не гарантируем получения статус кода
(ChannelFutureListener) future -> {
if (future.isSuccess()) {
AttributeKey<Integer> status = AttributeKey.valueOf(future.channel().id().asShortText());
Integer statusCode = future.channel().attr(status).get();
// deal with status code
}
});
сторим статус в финальном хендлере
@Override
public void channelRead(ChannelHandlerContext ctx, Object in) {
//...
ctx.channel().attr(AttributeKey.valueOf(channelId)).set(statusCode);
}
java, netty