`
pjwqq
  • 浏览: 81311 次
社区版块
存档分类
最新评论

mina的ExecutorFilter使用方式

    博客分类:
  • nio
阅读更多

    昨天群里讨论mina的ExecutorFilter,有点不明白的地方,早上看了下mina的ExecutorFilter源码,感觉主要逻辑还是很简单的。 

   源码头的注释:

 /**
38   * A filter that forwards I/O events to {@link Executor} to enforce a certain
39   * thread model while allowing the events per session to be processed
40   * simultaneously. You can apply various thread model by inserting this filter
41   * to a {@link IoFilterChain}.*/

    1.该过滤器,使用特定的线程模型,使每个session的evens得以同时执行,线程模型可定制。
	(就是你可以指定线程池类型)
42   /* 
43   * <h2>Life Cycle Management</h2>
44   * 
45   * Please note that this filter doesn't manage the life cycle of the {@link Executor}.
46   * If you created this filter using {@link #ExecutorFilter(Executor)} or similar
47   * constructor that accepts an {@link Executor} that you've instantiated, you have
48   * full control and responsibility of managing its life cycle (e.g. calling
49   * {@link ExecutorService#shutdown()}.
50   * <p> 
51   * If you created this filter using convenience constructors like
52   * {@link #ExecutorFilter(int)}, then you can shut down the executor by calling
53   * {@link #destroy()} explicitly.
54   */
	2.生命周期管理:
	注意:ExecutorFilter不负责线程池的生命周期管理,你自己负责

55   /* <h2>Event Ordering</h2>
56   * 
57   * All convenience constructors of this filter creates a new
58   * {@link OrderedThreadPoolExecutor} instance.  Therefore, the order of event is
59   * maintained like the following:
60   * <ul>
61   * <li>All event handler methods are called exclusively.
62   *     (e.g. messageReceived and messageSent can't be invoked at the same time.)</li>
63   * <li>The event order is never mixed up.
64   *     (e.g. messageReceived is always invoked before sessionClosed or messageSent.)</li>
65   * </ul>
66   * However, if you specified other {@link Executor} instance in the constructor,
67   * the order of events are not maintained at all.  This means more than one event
68   * handler methods can be invoked at the same time with mixed order.  For example,
69   * let's assume that messageReceived, messageSent, and sessionClosed events are
70   * fired.
71   * <ul>
72   * <li>All event handler methods can be called simultaneously.
73   *     (e.g. messageReceived and messageSent can be invoked at the same time.)</li>
74   * <li>The event order can be mixed up.
75   *     (e.g. sessionClosed or messageSent can be invoked before messageReceived
76   *           is invoked.)</li>
77   * </ul>
78   * If you need to maintain the order of events per session, please specify an
79   * {@link OrderedThreadPoolExecutor} instance or use the convenience constructors.
80   */
	3.event顺序
	默认线程池为OrderedThreadPoolExecutor,因此,管理event顺序如下:
		1. 任何event处理方法是排它的,比如messageReceived和messageSent不可能同时执行。
		2. event顺序不可能混淆,比如messageReceived一般先于sessionClosed或messageSent.
	如果你不使用OrderedThreadPoolExecutor,event的顺序会变得混乱:
        1. 所有的event处理方法可能会同时执行。
        2. event顺序变得混乱,比如sessionClosed或者messageSent先于messageReceived执行
	总之,如果你想每个session的event变得有序,请使用默认的线程池:)
	(不用的话好像后果很严重呵呵)

81   /* <h2>Selective Filtering</h2>
82   * 
83   * By default, all event types but <tt>sessionCreated</tt>, <tt>filterWrite</tt>,
84   * <tt>filterClose</tt> and <tt>filterSetTrafficMask</tt> are submitted to the
85   * underlying executor, which is most common setting.
86   * <p>
87   * If you want to submit only a certain set of event types, you can specify them
88   * in the constructor.  For example, you could configure a thread pool for
89   * write operation for the maximum performance:
90   * <pre><code>
91   * IoService service = ...;
92   * DefaultIoFilterChainBuilder chain = service.getFilterChain();
93   * 
94   * chain.addLast("codec", new ProtocolCodecFilter(...));
95   * // Use one thread pool for most events.
96   * chain.addLast("executor1", new ExecutorFilter());
97   * // and another dedicated thread pool for 'filterWrite' events.
98   * chain.addLast("executor2", new ExecutorFilter(IoEventType.WRITE));
99   * </code></pre>
100  */
	4.选择性过滤
	默认情况下,所有的event,除了sessionCreated之外,都会交给线程池去执行处理。
	但是如果你只想把某些event交给线程池,那可以这么做:
	IoService service = ...;
	DefaultIoFilterChainBuilder chain = service.getFilterChain();
	chain.addLast("codec", new ProtocolCodecFilter(...));
	// 使用这个线程池处理大部分event
    chain.addLast("executor1", new ExecutorFilter());
    // 使用这个线程池处理filterWrite这个event
    chain.addLast("executor2", new ExecutorFilter(IoEventType.WRITE));

 

 

   ExecutorFilter可以针对特定的event交给线程池执行,这点比较灵活,看下messageReceived的处理:

 

     public final void messageReceived(NextFilter nextFilter, IoSession session, Object message) {
         if (eventTypes.contains(IoEventType.MESSAGE_RECEIVED)) {
             IoFilterEvent event = new IoFilterEvent(nextFilter, IoEventType.MESSAGE_RECEIVED, session, message);
             fireEvent(event);
         } else {
             nextFilter.messageReceived(session, message);
         }
     }
 

   1.检查该event是否要交给线程执行.

   2.将它封装成IoFilterEvent

   3.提交线程池

  fireEvent(event);

protected void fireEvent(IoFilterEvent event) {
   executor.execute(event);
}

  来看看IoFilterEvent的fire方法(其实就是Runnable的run)

switch (type) {
          case MESSAGE_RECEIVED:
             Object parameter = getParameter();
              nextFilter.messageReceived(session, parameter);
              break;

  

  所以,如果使用了ExecutorFilter,在它之后的过滤器(nextFilter),以及handler,都会放在线程池中去执行,注意到粒度是event,当然默认是全部event。如此IO线程可摆脱其它业务逻辑,提升对客户端的响应效率。

  另外,ExecutorFilter中的默认OrderedThreadPoolExecutor,最好还是不要替代,个人看法。

1
2
分享到:
评论

相关推荐

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...

    mina框架的使用

    在描述中提到的"mina简单事例"博客文章,作者可能详细解释了如何使用MINA框架创建一个简单的网络应用。通常,这样的示例会包含以下步骤: 1. **设置项目**: 创建一个新的Java项目,并引入MINA的依赖库。 2. **创建...

    mina框架使用总结

    `ExecutorFilter` 提供了一种将任务分发到线程池执行的方式,而 `ProtocolCodecFilter` 则用于数据编码和解码,这里使用了自定义的 `WebDecoder` 和 `WebEncoder` 来处理特定的协议格式。 3. 日志过滤器...

    Mina框架使用demo

    在LongConnectionDemo中,我们可以看到这两个组件的具体使用方式。 接着,心跳服务在长连接中起着至关重要的作用。由于网络环境的不稳定,长时间保持的连接可能会因为各种原因断开,但双方可能并未察觉。心跳服务...

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和...同时,这也有助于你理解如何将Mina与其他技术(如Spring框架)结合使用,提升整体系统的灵活性和可维护性。

    mina使用例子

    通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...

    Android Mina框架使用

    Mina框架允许配置不同的端口,以确保每个连接使用独立的通信通道,从而避免端口占用冲突。 5. **MinaClientDemo项目** 提供的`MinaClientDemo`示例项目可能包含了以下部分: - `MinaClient`:客户端实现,包含...

    mina框架使用总结.doc

    mina 框架使用总结 mina 框架是对 Java 的 NIO 包的一个封装,简化了 NIO 程序开发的难度,封装了很多底层的细节,使开发者把精力集中到业务逻辑上来。下面是对 mina 框架使用的总结。 1. MINA 框架概述 MINA ...

    MINA框架使用jar包(Android)

    压缩包中的Apache_Mina_Server_2.0中文参考手册V1.0.pdf提供了关于MINA的详细文档,可以帮助开发者理解MINA的架构和使用方法。Mina源码解析.zip和mina-example.zip可能包含了MINA的源代码分析和示例项目,对于深入...

    MINA_API+MINA_DOC+mina

    最后,`Apache_Mina_Server_2.0中文参考手册V1.0.pdf` 是MINA服务器端的中文参考手册,对于想要使用MINA构建服务器端应用的开发者来说尤其有用。这份手册可能详细解析了MINA服务器的搭建步骤、配置选项,以及如何...

    基于Android开发MINA框架使用详解

    在MINA的Filter中设置合适的编码器和解码器,例如使用CharsetEncoder和CharsetDecoder。 4. **Android客户端接收消息问题** - 异步消息处理:由于Android主线程不能直接处理网络I/O,所以需要在后台线程中进行,...

    MINA使用札记(CumulativeProtocolDecoder使用)

    《MINA使用札记——CumulativeProtocolDecoder使用详解》 MINA(Java Multithreaded Network Application Framework)是一个强大的、高性能的Java网络应用框架,它主要用于构建可伸缩的、高性能的服务端应用,如...

    Android平台MINA框架使用详细解析

    在使用MINA进行网络通信时,如果处理不当,中文字符可能会出现乱码。这通常是由于字符编码不一致导致的。在MINA中,我们可以在设置输入流和输出流时指定正确的字符编码,例如UTF-8。对于TCP连接,我们可以在创建`...

    mina连接 mina心跳连接 mina断线重连

    在提供的文件"minaConnect"中,可能包含了使用Mina实现上述功能的相关代码示例和配置。通过分析这些文件,可以更具体地了解如何在实际项目中应用Mina的连接、心跳和断线重连机制。不过,具体的实现细节和优化策略需...

    mina新手教程源码 mina+springboot+idea最简单的案例。

    mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...

    Mina+Socket通信

    Mina(全称“MINA: Minimalistic Application Networking API”)是Apache软件基金会的一个开源项目,它为开发者提供了一种简单而高效的方式来构建高性能、跨平台的网络应用。Mina的核心优势在于它的事件驱动和异步I...

    基于spring的Mina框架

    在Spring框架的支持下,Mina的使用变得更加便捷,能够更好地融入到Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)体系中,从而实现服务的灵活配置和管理。 **1. Mina框架的核心组件** ...

    java-mina通信框架详解.docx

    Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当...

    mina编解码器Demo

    MINA框架的核心在于它的异步I/O模型,它允许开发者以非阻塞的方式处理网络连接,提高了系统资源的利用率。而编解码器在MINA中扮演着至关重要的角色,它是数据在网络间传输时进行转换的关键组件。编解码器负责将应用...

    Mina框架在android上的使用范例

    在Android上使用Mina框架,可以极大地简化TCP通信的实现过程。TCP是一种面向连接的、可靠的传输层协议,适用于需要稳定数据传输的应用场景。Mina提供了一种事件驱动的模型,允许开发者通过异步方式处理网络I/O操作,...

Global site tag (gtag.js) - Google Analytics