[英]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上運行NettyServer
和NettyClient
,可能不會出現,但是從遠程來看,建立連接將花費更多時間。 但是我需要一個解決方案。
另一個問題是,我每隔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.