Rising Sun

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            148 隨筆 :: 0 文章 :: 22 評論 :: 0 Trackbacks

                在使用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停止。

          Java代碼 復制代碼
          1. connector.setWorkerTimeout(1);   //1秒鐘(默認超時60秒)  

          PS:Worker定義在SocketConnector類中,內部直接實現管理

          MINA2.0

          可以調用connector的dispose()方法。該方法通過調用ExecutorService的shutdown()方法停止業務處理線程,并設置內部disposed標志位標識需要停止連接管理器;Worker線程通過該標識停止。

          Java代碼 復制代碼
          1. connector.dispose();  

          PS: Worker定義在AbstractPollingIoConnector類中,disposed標志在AbstractIoService類中,通過dispose()方法停止ExecutorService并設置disposed標志

          posted on 2009-06-04 13:18 brock 閱讀(2882) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 龙游县| 小金县| 张家口市| 新泰市| 永平县| 温州市| 新竹县| 宝兴县| 米泉市| 绵阳市| 桂平市| 舟曲县| 怀柔区| 沁水县| 磐石市| 霍山县| 哈尔滨市| 岢岚县| 临猗县| 博乐市| 永州市| 曲阜市| 沛县| 桃园市| 阳信县| 高阳县| 高州市| 大庆市| 湄潭县| 乾安县| 涟源市| 银川市| 德化县| 宁南县| 探索| 包头市| 杭州市| 邳州市| 肇源县| 尉氏县| 宣城市|