毕业设计用到了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>