本文将说明mina如何与Spring整合使用。原文请看http://mina.apache.org/integrating-with-spring.html
应用程序结构
我们将要构造一个如下内容的工程
- 一个Handler
- 两个Filter - Logging Filter 和 ProtocolCodec Filter
- NioDatagram Socket
初始化代码
让我们先看看代码,我们省略了部分代码
- public void initialize() throws IOException {
- // 创建一个 Acceptor
- NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
- // 加入 Handler
- 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);
- }
public void initialize() throws IOException {// 创建一个 AcceptorNioDatagramAcceptor acceptor = new NioDatagramAcceptor();// 加入 Handleracceptor.setHandler(new ServerHandler());acceptor.getFilterChain().addLast("logging",new LoggingFilter());acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new SNMPCodecFactory()));// 创建 Session ConfigurationDatagramSessionConfig dcfg = acceptor.getSessionConfig(); dcfg.setReuseAddress(true); logger.debug("Starting Server......"); // 绑定并监听 acceptor.bind(new InetSocketAddress(DEFAULT_PORT)); logger.debug("Server listening on "+DEFAULT_PORT);}
整合处理
与Spring整合我们需要以下步骤
- 设置IO handler
- 创建Filter并加入chain中
- 创建并设置Socket
注意:最新版本的Mina并不像早起版本一样包含Spring连接的包。 The package is now named Integration Beans, to make the implementation work for all DI frameworks.
让我们看看Spring的配置文件。请注意观察我从配置文件中摘取的部分
这个例子源于mina发行版中的Chat example ,请参考例子中的XML文件。
让我们在Spring的上下文(Context)中设置IO Handler
- <bean id="trapHandler" class="com.ashishpaliwal.udp.mina.server.ServerHandler" />
<bean id="trapHandler" class="com.ashishpaliwal.udp.mina.server.ServerHandler" />
让我们创建Filter Chain
- <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" />
- <!-- filter chain. -->
- <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>
<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" /> <!-- filter chain. --> <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>
在这里我们创建了一个Filter实例。在ProtocolCodec factory中我们使用了构造器注入,在后面是loggingFilter。我们定义完成了将要使用的Filter,然后我们接着定义执行这些Filter的Filter Chain,定义一个ID为“FilterChainBuidler”的Bean,然后将Filter注入其中。我们即将完成我们的整合,现在只需要创建一个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>
- <!-- IoAcceptor 绑定在 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>
<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><!-- IoAcceptor 绑定在 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并设置IO handler 和 Filter Chain。在Spring里写一个函数来读取配置文件。
- public void initializeViaSpring() throws Exception {
- new ClassPathXmlApplicationContext("trapReceiverContext.xml");
- }
public void initializeViaSpring() throws Exception { new ClassPathXmlApplicationContext("trapReceiverContext.xml");}
我们只需要写一个main函数来调用这个方法就可以初始化mina了。