簡體   English   中英

Netty客戶端多個請求

[英]Netty client multiple requests

首先,我將解釋這種情況和我要實現的邏輯:

  • 我有多個線程,每個線程都將其工作,將一些名為Result對象放入隊列QueueToSend

  • 我的NettyClient在線程中運行,每隔1毫秒從QueueToSend獲取Result ,並且應連接到服務器並發送一條消息,該消息是從Result創建的。 我還需要這種連接才能發出請求。 因此,我需要NettyHandler知道Result列表以發送正確的消息並處理正確的結果,然后再次發送響應。

所以我初始化NettyClient引導程序

bootstrap = new ClientBootstrap(
                new NioClientSocketChannelFactory(
                        Executors.newCachedThreadPool(),
                        Executors.newCachedThreadPool()));

並在應用啟動時設置一次管道。 然后,每隔一毫秒,我從QueueToSend獲取Result對象並連接到服務器

ChannelFuture future = bootstrap.connect(new InetSocketAddress(host,port);
ResultConcurrentHashMap.put(future.getChannel().getId(), result);

我決定使用靜態ConcurrentHashMap來保存從與通道QueueToSend獲取的每個結果對象。

當我嘗試從ResultConcurrentHashMap與通道關聯的Result對象時,第一個問題發生在方法channelConnected的NettyHandler中。

@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
       Channel channel = ctx.getPipeline.getChannel();
       Result result = ResultConcurrentHashMap.get(channel.getId());
}

但是有時result為null(50之1),甚至認為它應該在ResultConcurrentHashMap 我認為發生這種情況是因為在NettyClient運行此代碼之前發生了channelConnected事件:

ResultConcurrentHashMap.put(future.getChannel().getId(), result);

如果我不是同時在localhost上運行NettyServerNettyClient ,可能不會出現,但是從遠程來看,建立連接將花費更多時間。 但是我需要一個解決方案。

另一個問題是,我每隔1毫秒就會異步發送一次消息,並且我認為消息可能是混合的,服務器無法正確讀取它們。 如果我一一運行它們就可以了:

future.getChannel().getCloseFuture().awaitUninterruptibly();

但是我需要異步發送,並處理與通道相關的正確結果並發送響應。 我應該實施什么?

ChannelFutures在事件觸發之前異步執行。 例如,通道連接將來會在觸發通道連接事件之前完成。

因此,您必須在調用bootstrap.connect()之后注冊一個通道將來的偵聽器,並在偵聽器中編寫代碼以初始化HashMap,然后處理程序才能看到它。

        ChannelFuture channelFuture = bootstrap.connect(remoteAddress, localAddress);

        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                resultConcurrentHashMap.put(future.getChannel().getId(), result);
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM