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 閱讀(2881) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 庆城县| 永泰县| 土默特左旗| 云林县| 会泽县| 高碑店市| 石家庄市| 鄯善县| 富阳市| 榕江县| 新竹县| 古田县| 滨州市| 休宁县| 巫山县| 舟曲县| 娱乐| 会宁县| 巴里| 阿荣旗| 瑞安市| 札达县| 平凉市| 浠水县| 克什克腾旗| 鄯善县| 荥阳市| 和林格尔县| 台北市| 游戏| 城口县| 苏尼特左旗| 虎林市| 德格县| 图们市| 民县| 汕头市| 达日县| 察雅县| 图木舒克市| 建昌县|