вызов синхронизации на channelFuture не блокирует поток - PullRequest
0 голосов
/ 23 мая 2019

У меня нетти-клиент, который подключается к удаленному серверу для цикла запрос-ответ. Я хочу заблокировать, пока удаленное соединение не будет успешным, и я проанализировал ответ.

Вот что я делаю

Channel ch = bootstrap.connect(addr).sync().channel();
            ChannelFuture f = ch.writeAndFlush(obj);
            f.sync();
            f.channel().close();
       System.out.println("hello world");

На моем обработчике

MyHandler extends ChannelInboundHandlerAdapter {

     static Map<String,Object> = new HashMap<>();
       @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) {
       System.out.println("foo bar");
        if (msg instanceof FullHttpResponse) {
            parseAndPutInMap(msg);
         }
        ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
    }
}

То, что я заметил, вызывает f.sync (), а не блокирует. Я вижу "привет мир", напечатанный сразу перед "foo bar". Я также прошел через отладчик и не увидел нажатия ChannelRead сразу после вызова f.sync ().

так что здесь не так? Я хочу, чтобы эта операция блокировалась, поскольку мне нужно обработать ответ, прежде чем я решу, что делать.

1 Ответ

1 голос
/ 23 мая 2019

Ваша операция фактически блокируется, она ждет, пока "запись" будет завершена.

Но это проблема для вас, так как вы хотите подождать, пока "чтение" не закончится.

Одна из вещей, которые вы могли бы сделать, - это "синхронизировать" ближайшее будущее канала, а затем закрыть канал в обработчике чтения, когда вы закончите чтение.

Channel ch = bootstrap.connect(addr).sync().channel();
ChannelFuture f = ch.writeAndFlush(obj);
f.sync(); // Also sync on this, so its error automatically get thrown
ch.closeFuture().sync();
System.out.println("hello world");
MyHandler extends ChannelInboundHandlerAdapter {

     static Map<String,Object> = new HashMap<>();
       @Override
    public void channelRead(final ChannelHandlerContext ctx, Object msg) {
       System.out.println("foo bar");
        if (msg instanceof FullHttpResponse) {
            parseAndPutInMap(msg);
         }
        // The following line automatically closes the channel:
        ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
    }
}
...