Apache MINA框架整合到Spring框架中
阿新 • • 發佈:2019-01-30
畢業設計用到了Apache公司的MINA框架作為服務端與安卓客戶端的通訊框架。
問題:服務端分為兩個部分,一個是基於javaEE平臺的後臺管理系統,另一個是基於MINA框架的服務,整個專案中需求是當tomcat伺服器啟動的時候,將MINA服務也一起啟動起來,相當於服務端程式執行起來後,開啟兩個服務。
分析:服務端的後臺管理系統是採用Spring+Hibernate框架整合搭建的,而當tomcat伺服器啟動後,會載入spring的配置檔案,而spring配置檔案中可以自定義監聽器,將啟動MINA服務的類定義成這個監聽器即可實現當tomcat伺服器啟動時接著啟動MINA服務。
MinaServer類:
import java.net.InetSocketAddress; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import com.utils.LogUtil; public class MinaServer implements ServletContextListener, HttpSessionListener { private static NioSocketAcceptor acceptor; private static final int port = 9999; private static final LogUtil logUtil = LogUtil.getLogUtil(MinaServer.class); public void sessionCreated(HttpSessionEvent se) { } public void sessionDestroyed(HttpSessionEvent se) { } // 停止MINA服務 public void contextDestroyed(ServletContextEvent sce) { try { MinaServer.acceptor.unbind(); MinaServer.acceptor.dispose(); logUtil.customLog("Mina服務停止..."); } catch (Exception e) { logUtil.customLog(e); } } // 啟動MINA服務 public void contextInitialized(ServletContextEvent sce) { try { // 建立一個非阻塞的server端的Socket acceptor = new NioSocketAcceptor(); // 設定過濾器 acceptor.getFilterChain().addLast( "serverCodec", new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); acceptor.getFilterChain().addLast("ServerFilter", new ExecutorFilter()); // 設定讀取資料的緩衝區大小 acceptor.getSessionConfig().setReadBufferSize(1024*102400); // 讀寫通道10秒內無操作進入空閒狀態 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); // 新增邏輯處理器 acceptor.setHandler(new MinaServerHandler()); // 繫結埠 try { acceptor.bind(new InetSocketAddress(port)); } catch (Exception e) { } logUtil.customLog("服務端啟動成功... 埠號為:" + port); } catch (Exception e) { logUtil.customLog("服務端啟動異常...."); } } }
web.xml配置監聽器:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.telek.mina.server.MinaServer</listener-class>
</listener>