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