Mina框架学习笔记(六)

在前面章节中介绍了 Apache MINA 的基本概念和具体用法,下面讨论一些高级话题。

Apache MINA 中的很多操作都是异步的,比如连接的建立、连接的关闭、还有数据的发送等。在编写网络应用的时候,需要考虑这一点。比如 IoConnector的 connect方法,其返回值是 org.apache.mina.core.future.ConnectFuture类的对象。通过此对象,可以查询连接操作的状态。清单 3 中已经使用了 ConnectFuture。另外一个常用的是发送数据时使用的 org.apache.mina.core.future.WriteFuture,如 清单 11 所示。


IoSession session = ...; // 获取 I/O 会话对象
WriteFuture future = session.write("Hello World"); // 发送数据
future.awaitUninterruptibly(); // 等待发送数据操作完成
if(future.isWritten()) 
{ 
    // 数据已经被成功发送
} 
else 
{ 
    // 数据发送失败
}

由于这样的需求很常见,I/O 处理器中提供了 messageSent方法,当数据发送成功的时候,该方法会被调用。

Apache MINA 可以集成 JMX 来对网络应用进行管理和监测。下面通过对前面给出的计算器服务进行简单修改,来说明如何集成 JMX。所需的修改如 清单 12 所示。


MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
IoAcceptor acceptor = new NioSocketAcceptor(); 
IoServiceMBean acceptorMBean = new IoServiceMBean(acceptor); 
ObjectName acceptorName = new ObjectName(acceptor.getClass() 
    .getPackage().getName() 
    + ":type=acceptor,name=" + acceptor.getClass().getSimpleName()); 
mBeanServer.registerMBean(acceptorMBean, acceptorName); 

如 清单 12 所示,首先获取平台提供的受控 bean 的服务器,接着创建受控 bean(MBean)来包装想要管理和监测的对象,这里使用的是 I/O 连接器对象。最后把创建出来的受控 bean 注册到服务器即可。

在启动计算器服务应用的时候,添加下面的启动参数:-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8084 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false,就启用了 JMX。接着通过 JVM 提供的“Java 监视和管理控制台”(运行 jconsole)就可以连接到此应用进行管理和监测了。监测的结果如 图 6 所示。



 

Apache MINA 可以和流行的开源框架 Spring 进行集成,由 Spring 来管理 Apache MINA 中的对象。与 Spring 集成的方式也比较简单,只需要编写相应的 Spring 配置文件即可。清单 13 中给出了与 Spring 集成之后的计算器服务的配置文件。


     
     
  1.  <?xml version="1.0" encoding="UTF-8"?>   
  2. <beans>   
  3.     <bean id="calculatorHandler" class="calculator.CalculatorHandler" />   
  4.   
  5.     <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />   
  6.   
  7.     <bean id="calculatorCodecFilter" class="org.apache.mina.filter.   
  8.         codec.ProtocolCodecFilter">   
  9.         <constructor-arg>   
  10.             <bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" />   
  11.         </constructor-arg>   
  12.     </bean>   
  13.   
  14.     <bean id="filterChainBuilder"  
  15.         class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">   
  16.         <property name="filters">   
  17.             <map>   
  18.                 <entry key="loggingFilter" value-ref="loggingFilter" />   
  19.                 <entry key="codecFilter" value-ref="calculatorCodecFilter" />   
  20.                 </map>   
  21.         </property>   
  22.     </bean>   
  23.   
  24.     <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">   
  25.         <property name="customEditors">   
  26.             <map>   
  27.               <entry key="java.net.SocketAddress">   
  28.                 <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor"/>   
  29.               </entry>   
  30.             </map>   
  31.         </property>   
  32.     </bean>   
  33.   
  34.     <bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"  
  35.         init-method="bind" destroy-method="unbind">   
  36.         <property name="defaultLocalAddress" value=":10010" />   
  37.         <property name="handler" ref="calculatorHandler" />   
  38.         <property name="filterChainBuilder" ref="filterChainBuilder" />   
  39.     </bean>   
  40. </beans>  

清单 13 中创建 I/O 处理器和 I/O 过滤器的方式很直接。由于不能直接从 I/O 接受器获取过滤器链,这里创建了一个org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder类的 bean,用来构建过滤器链。由 Apache MINA 提供的网络地址编辑器org.apache.mina.integration.beans.InetSocketAddressEditor允许以“主机名 : 端口”的形式指定网络地址。在声明 I/O 接受器的时候,通过 init-method指明了当 I/O 接受器创建成功之后,调用其 bind方法来接受连接;通过 destroy-method声明了当其被销毁的时候,调用其 unbind来停止监听。




回页首

Apache MINA 是一个很好的网络应用框架,它通过事件驱动的 API 为开发网络应用提供了良好的架构基础,同时也提供了丰富的 I/O 服务和 I/O 过滤器的实现,使得开发网络应用变得简单。本文详细介绍了 Apache MINA 中的基本概念,包括 I/O 服务、I/O 会话、I/O 过滤器和 I/O 处理器等,同时介绍了如何利用状态机来实现逻辑复杂的 I/O 处理器。除此之外,还讨论了 Apache MINA 如何与 JMX 和 Spring 进行集成。本文提供了一个简单的计算器服务和复杂的俄罗斯方块联机游戏作为示例,可以帮助读者更好的掌握基于 Apache MINA 的网络应用开发。




回页首

1 描述 名字 大小 下载方法 计算器服务示例源代码
CalculatorMina.zip 7 KB HTTP
关于下载方法的信息

注意:

  1. 源代码中包含了与 JMX 和 Spring 集成的代码,运行需要 Apache Maven。

学习

  • 查看 Apache MINA 的更多文档。 
  • 了解 JMX
  • 查看 Spring 框架的更多信息。
  • 在 developerWorks Java 技术专区 上可以找到数百篇其他的 Java 参考资料。
  • 转自:https://www.ibm.com/developerworks/cn/java/j-lo-mina2/#code1

    最新源码在:http://code.google.com/p/tetris-mina/

     

    你可能感兴趣的:(apache,spring,框架,bean,Mina)