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