Java Netty客户端请求在发送到多个服务器时超时

Java Netty客户端请求在发送到多个服务器时超时,java,netty,future,Java,Netty,Future,首先,我将解释背景: 我已经实现了Netty框架,并且有一个客户端向超过44台服务器发送HTTP请求。服务器正在响应该请求。 在我的客户端中,我通过覆盖channelActive函数并从channelRead0函数读取响应并将所有响应存储在数据结构中来发送请求。 因为,发送HTTP请求并从44台服务器获取响应需要时间。我使用的是超时值,其结构如下所示: for (final InetAddress target : remoteIPAddresses.values()) {

首先,我将解释背景:
我已经实现了Netty框架,并且有一个客户端向超过44台服务器发送HTTP请求。服务器正在响应该请求。
在我的客户端中,我通过覆盖
channelActive
函数并从
channelRead0
函数读取响应并将所有响应存储在数据结构中来发送请求。
因为,发送HTTP请求并从44台服务器获取响应需要时间。我使用的是超时值,其结构如下所示:

      for (final InetAddress target : remoteIPAddresses.values()) {
            httpClient.connect(target);
        }
        // wait for the timeout. Hoping client send request to all
        // the targets and get response.
        Uninterruptibles.sleepUninterruptibly(timeout, TimeUnit.MILLISECONDS);
        httpClient.stop();
        fetchResults();
fetchResults从
channelRead0
connect方法包含netty实现,如下所示:

 public void connect(final InetAddress remoteAddress){
        new Bootstrap()
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
            .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
            .group(eventLoopGroup)
            .channel(NioSocketChannel.class)
            .handler(httpNettyClientChannelInitializer)
            .connect(remoteAddress, serverPort)
            .addListener(new ChannelFutureListener() {
                    @Override
                    public void operationComplete(ChannelFuture future) {
                        future.cancel(!future.isSuccess());
                    }
                });
    }  
Netty中使用的参数

connectionTimeout = 100ms  
Timeout value = 400ms    
Eventloop = 1 (Tried with 2 , 5 and 10) 
问题
在44个目标中,我有多个目标超时。目标每次都不同。使用线程睡眠不是一个好的实践,我无法想出任何其他方法来完成任务。
有更好的方法吗?我已经看过视频了。我被封锁了。任何潜在客户都会很有帮助。

与其睡觉,希望自己能得到所有必要的回复,不如使用一个。将此闩锁传递给处理程序,处理程序将在每次响应到达时对其进行倒计时(在
channelRead0
中)。然后,主线程可以使用
await()

您的处理程序可以如下所示:

@ChannelHandler.Sharable
public class HttpResponseHandler extends SimpleChannelInboundHandler<HttpObject> {

    final CountDownLatch responseLatch;

    public HttpResponseHandler(CountDownLatch responseLatch) {
        this.responseLatch = responseLatch;
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
        ....
        responseLatch.countDown();
    }
}

我没有考虑处理程序中的错误情况(套接字连接/读取超时、无效响应等),因此请确保处理这些情况。

触发了哪个超时?您正在设置的是连接超时还是聚合超时?根据服务器的响应特征,400ms可能太小。连接超时为100ms,读取超时为400ms。根据服务器的数量,增加事件循环是否是一种良好的做法。目前,我正在使用1
        CountDownLatch responseLatch = new CountDownLatch(remoteIpAddresses.size());
        HttpResponseHandler handler = new HttpResponseHandler(responseLatch);
        // your for loop to connect to servers here
        responseLatch.await(timeout, TimeUnit.MILLISECONDS);