ApachePHPMySQL 2013-06-08
第十七章-Spring整合
本章中演示了如何把MINA应用程序和Spring框架整合在一起。文章的内容来源于http://www.ashishpaliwal.com/blog/2008/11/integrating-apache-mina-with-spring/
应用程序的结构
我们创建一个标准结果的MINA应用程序:
一个IoHandler
两个Filter-LoggingFilter和ProtocolCodecFilter
基于UDP的NioDatagramSocket
初始化代码
我们先看一下代码,为了简单我们把多余的代码去掉了
public void initialize() throws IOException { // 创建一个Acceptor NioDatagramAcceptor acceptor = new NioDatagramAcceptor(); // 添加一个IoHandler acceptor.setHandler(new ServerHandler()); acceptor.getFilterChain().addLast("logging", new LoggingFilter()); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new SNMPCodecFactory())); // 创建Session Configuration DatagramSessionConfig dcfg = acceptor.getSessionConfig(); dcfg.setReuseAddress(true); logger.debug("Starting Server......"); // 绑定端口开始监听 acceptor.bind(new InetSocketAddress(DEFAULT_PORT)); logger.debug("Server listening on "+DEFAULT_PORT); }
整合
要整合到Spring环境里,要做下面的事情:
设置IoHandler
创建一个Filter并加入到过滤器链
创建Socket并设定Socket参数
注意:最新的MINA中已经不包含面向Spring整合的专用包。现在的包本身都是对整合非常友好的,也就是可以很容易的整合到所有的DI框架。
我们看一下Spring的XML配置文件。我已经移除了XML中通用的部分,只留下了跟本章相关的内容。下面的例子来至于MINA发布包中的Chat的例子。可以在那里找到完成的内容。
现在把东西放到一起。
我们来看一下Spring的环境配置文件的IoHandler
<!-- IoHandler的实现 --> <bean id="trapHandler" class="com.ashishpaliwal.udp.mina.server.ServerHandler"> 下面创建一个过滤器实例和过滤器链 <bean id="snmpCodecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter"> <constructor-arg> <bean class="com.ashishpaliwal.udp.mina.snmp.SNMPCodecFactory" /> </constructor-arg> </bean> <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" /> <!-- 过滤器链 --> <bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder"> <property name="filters"> <map> <entry key="loggingFilter" value-ref="loggingFilter"/> <entry key="codecFilter" value-ref="snmpCodecFilter"/> </map> </property> </bean>
在这里我们创建了IoFilter的实例。在ProtocolCodecFilter中我们通过构造函数注入的方式把ProtocolCodec工厂传递给ProtocolCodecFilter。LoggingFilter的创建非常直接。当我们定义好所有的过滤器实例后,开始创建过滤器链。我们定义了一个名为filterChainBuilder的bean,并把过滤器添加到里面。现在基本上都准备完毕,可以创建Socket并绑定监听端口。
下面是创建Socket相关的代码:
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress"> <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" /> </entry> </map> </property> </bean> <!-- 定义IoAccepter,绑定到161端口 --> <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioDatagramAcceptor" init-method="bind" destroy-method="unbind"> <property name="defaultLocalAddress" value=":161" /> <property name="handler" ref="trapHandler" /> <property name="filterChainBuilder" ref="filterChainBuilder" /> </bean>
现在我们已经创建了IoAcceptor,设置IoHandler和过滤器链。现在我们做一个函数来启动Spring环境,读取配置文件,进而启动我们的应用程序。代码如下:
public void initializeViaSpring() throws Exception { new ClassPathXmlApplicationContext("trapReceiverContext.xml"); }