在使用MINA做客戶端程序時,發現雖然調用了session.close()方法,通過日志也確實看到當前session已經被關閉了,但未什么客戶端程序進程卻沒有停止呢?即MINA客戶端沒有根本的關閉。這個現象在版本1和2中都存在。這是MINA的bug嗎???其實不然...
我們可以啟動2個服務器端,然后用同一個connector實例來連接這2臺服務器,通過結果可以發現2個連接是相互獨立工作的,及connector和session不是一對一的。
通過查閱API和源代碼,我們可以發現這里的connector實際是一個連接管理器,其內部通過一個connectQueue隊列同步存儲一個連接列表。并在調用connect()方法時,將當前連接請求注冊到隊列中;同時connector中啟動著一個內部的Worker(工作線程)來管理這些連接。當我們關閉某個session之后,只是關閉了某個請求,工作線程其實并沒有被關閉,所以出現程序沒有停止的現象。
MINA1.1.7
可以通過設置工作超時來關閉連接,當所有的連接都被關閉后worker線程將停止,即connector停止。
- connector.setWorkerTimeout(1);
connector.setWorkerTimeout(1); //1秒鐘(默認超時60秒)
PS:Worker定義在SocketConnector類中,內部直接實現管理
MINA2.0
可以調用connector的dispose()方法。該方法通過調用ExecutorService的shutdown()方法停止業務處理線程,并設置內部disposed標志位標識需要停止連接管理器;Worker線程通過該標識停止。
connector.dispose();
PS: Worker定義在AbstractPollingIoConnector類中,disposed標志在AbstractIoService類中,通過dispose()方法停止ExecutorService并設置disposed標志