Вокруг этого вопроса есть несколько постов. Но то, что я ищу, совсем другое.
Netty-клиент будет заблокирован при ответе сервера и продолжит работу с любой бизнес-логикой после получения ответа от сервера.
Большинство примеров в netty не показывают, как клиент получает ответ блокирующим образом и обрабатывает его.
Я бросаю вокруг изменяемого объекта и спрашиваю обработчик, чтобы установить объект ответа.
Вот то, что у меня сейчас есть, что я чувствую себя взволнованным
public class MutableObj {
FullHttpResponse response;
}
MutableObj mutable = new MutableObj();
Bootstrap bootstap = new Bootstrap()
.group(bossGroup())
.channel(NioSocketChannel.class)
.handler(MyChannelInitializer(mutable));
Channel ch = bootstrap.connect(addr).sync().channel();
ChannelFuture f = ch.writeAndFlush(obj);
f.sync();
ch.closeFuture().sync();
//since connection was blocked, I will have response object populated
FullHttpResonse response = mutable.getResponse();
//now process the response
MyHandler extends ChannelInboundHandlerAdapter {
MutableObj obj;
public MyHandler(MutableObj obj) {
this.obj=obj;
}
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) {
System.out.println("foo bar");
if (msg instanceof FullHttpResponse) {
obj.setResponse((FullHttpResponse) msg);
}
// The following line automatically closes the channel:
ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
}
public class MyChannelIntializer extends ChannelInitializer<SocketChannel> {
private MutableObj obj;
@Override
public void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(new HttpClientCodec());
p.addLast(new HttpObjectAggregator(1024 * 1024, true));
p.addLast(new MyHandler(obj));
}
}
Приведенное выше решение звучит хакерским и небезопасно.
как правильно делать здесь?
Соответствующие сообщения, которые я прочитал
Обработка ответа от сервера в Netty клиенте
Netty - Как получить ответ сервера в клиенте
Как получить ответ сервера с помощью netty клиента