как получить ответ от Netty Client? - PullRequest
0 голосов
/ 23 мая 2019

Вокруг этого вопроса есть несколько постов. Но то, что я ищу, совсем другое.

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 клиента

...