1. 程式人生 > >Apache MINA框架整合到Spring框架中

Apache MINA框架整合到Spring框架中

畢業設計用到了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>