MINA2官方教程翻译(10)与Spring整合

我们通过这篇文章来介绍如何与Spring框架整合MINA应用。

程序结构

我们将编写一个简单的MINA应用程序,其组成包括:

  • 一个Handler
  • 两个Filter - Logging Filter和ProtocolCodec Filter
  • 数据报Socket

初始化代码

让我们先看一下代码。为了简化,我们做了一些省略。

public void initialize() throws IOException {	// Create an Acceptor	NioDatagramAcceptor acceptor = new NioDatagramAcceptor();	// Add Handler	acceptor.setHandler(new ServerHandler());	acceptor.getFilterChain().addLast("logging", new LoggingFilter());	acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new SNMPCodecFactory()));	// Create Session Configuration	DatagramSessionConfig dcfg = acceptor.getSessionConfig();    dcfg.setReuseAddress(true);    logger.debug("Starting Server......");    // Bind and be ready to listen    acceptor.bind(new InetSocketAddress(DEFAULT_PORT));    logger.debug("Server listening on "+DEFAULT_PORT);}

 

整合过程

与Spring框架整合,我们需要以下操作:

  • 设置IO handler
  • 创建Filters并将它们加入到Filter链
  • 创建Socket并设置相关参数

注意:如同MINA之前的release,最近release的版本中并没有Spring特定的包,目前这个包叫做Integration Beans,它用来实现与所有的DI框架整合而不仅限于Spring。

让我们看一下Spring的xml文件。我删除了通用部分,只保留了与我们实现整合相关的内容。这个例子脱胎于MINA实例中的Chat应用,请参考该实例中完整的xml文件。现在我们开始整合,首先是定义IO Handler:

<!-- The IoHandler implementation --><bean id="trapHandler" class="com.ashishpaliwal.udp.mina.server.ServerHandler" />

 然后创建Filter链:

<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" /><!-- The 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>

 这里,我们创佳了自己的IoFilter实例。对于ProtocolCodec来说,注入SNMPCodecFactory时我们使用了构造注入。Logging Filter是被直接创建的,没有注入其他属性。一旦我们定义了所有filters的bean定义,我们就可以将它们组装成Filter链。我们定义一个id为FilterChainBuidler的bean,然后将定义好的filter bean注入其中。万事俱备了,我们只差创建Socket并调用bind()方法。

让我们完成最后一部分,创建Socket并使用Filter链:

<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><!-- The IoAcceptor which binds to port 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链。现在我们需要编写一个方法去读取Spring的xml文件并启动应用,代码如下:

public void initializeViaSpring() throws Exception {    new ClassPathXmlApplicationContext("trapReceiverContext.xml");}

 现在我们需要从main方法运行程序,MINA应用便可以初始化。

来源://作者:/更新时间:2013-03-29
相关文章
评论:
验证码:
匿名评论:

最新文章

文章排行