Apache Mina 文档翻译 - 第十七章 - Spring整合

第十七章-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");
}

相关推荐