2012-10-15 71 views
0

下面我演示瞭如何使用Netty連接NioClientSocketChannelFactory。連接返回一個未來,我可以檢查連接是否成功/失敗 。爲什麼Netty客戶端連接future.operationComplete在調用者線程中被調用?

我的理解是,連接過程是非鎖定的,所以operationComplete方法將由netty線程(不在調用者線程內)調用,因此調用者線程將退出。

大多數情況下,它的工作方式是這樣的,在我的各種Windows部署中。

但是在其中的一個部署中,我注意到當連接失敗時,operationComplete方法在我的調用者線程中調用,而不是在netty線程中調用。 拋出的異常也會在調用者線程中捕獲。我沒有想到這一點。

在我的代碼,連接失敗時,我再次嘗試連接(下面沒有證明)......而且由於它在我的調用程序線程發生了,我從來沒有從我的連接調用返回,因爲 的operationComplete被稱爲在我的來電顯示線。

我在做什麼錯?注 - 我沒有任何呼叫future.awaitUninterruptibly

public static void main(String[] args) 
{ 
     String host = "localhost"; 
     int port = 5555; 
     ChannelFactory factory = new NioClientSocketChannelFactory(Executors 
         .newCachedThreadPool(), Executors.newCachedThreadPool()); 
     MyHandler handler = new MyHandler(); 
     PipelineFactory factory = new PipelineFactory(handler); 
     ClientBootstrap bootstrap = new ClientBootstrap(factory); 
     ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port)); 

     future.addListener(new ChannelFutureListener() 
     { 
       @Override 
       public void operationComplete(ChannelFuture future) throws Exception 
       { 
        if (future.isSuccess()) { 
         // SUCCESS 
        } 
        else 
        { 
         // FAILURE 
        } 
       } 
     }); 
} 

回答

1

你不應該做任何假設,通知實際的ChannelFutureListener線程。大多數情況下,這將是Netty的IO-Thread(Worker),但有時這也可以是調用者Thread。

我還是不明白爲什麼在這種情況下它不會「返回」你。

+0

它不會返回,因爲我試圖重新連接馬上 - 假設我在IO線程:(。好吧我會改變代碼以消除這種假設。這通常適用於任何併發類型的實現,其中未來返回?我認爲如果一個方法(java世界中的任何人)返回未來,未來的偵聽器總是被另一個線程調用。 – FatherFigure

相關問題