昨天群里讨论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,最好还是不要替代,个人看法。
相关推荐
在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...
在描述中提到的"mina简单事例"博客文章,作者可能详细解释了如何使用MINA框架创建一个简单的网络应用。通常,这样的示例会包含以下步骤: 1. **设置项目**: 创建一个新的Java项目,并引入MINA的依赖库。 2. **创建...
`ExecutorFilter` 提供了一种将任务分发到线程池执行的方式,而 `ProtocolCodecFilter` 则用于数据编码和解码,这里使用了自定义的 `WebDecoder` 和 `WebEncoder` 来处理特定的协议格式。 3. 日志过滤器...
在LongConnectionDemo中,我们可以看到这两个组件的具体使用方式。 接着,心跳服务在长连接中起着至关重要的作用。由于网络环境的不稳定,长时间保持的连接可能会因为各种原因断开,但双方可能并未察觉。心跳服务...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和...同时,这也有助于你理解如何将Mina与其他技术(如Spring框架)结合使用,提升整体系统的灵活性和可维护性。
通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...
Mina框架允许配置不同的端口,以确保每个连接使用独立的通信通道,从而避免端口占用冲突。 5. **MinaClientDemo项目** 提供的`MinaClientDemo`示例项目可能包含了以下部分: - `MinaClient`:客户端实现,包含...
mina 框架使用总结 mina 框架是对 Java 的 NIO 包的一个封装,简化了 NIO 程序开发的难度,封装了很多底层的细节,使开发者把精力集中到业务逻辑上来。下面是对 mina 框架使用的总结。 1. MINA 框架概述 MINA ...
压缩包中的Apache_Mina_Server_2.0中文参考手册V1.0.pdf提供了关于MINA的详细文档,可以帮助开发者理解MINA的架构和使用方法。Mina源码解析.zip和mina-example.zip可能包含了MINA的源代码分析和示例项目,对于深入...
最后,`Apache_Mina_Server_2.0中文参考手册V1.0.pdf` 是MINA服务器端的中文参考手册,对于想要使用MINA构建服务器端应用的开发者来说尤其有用。这份手册可能详细解析了MINA服务器的搭建步骤、配置选项,以及如何...
在MINA的Filter中设置合适的编码器和解码器,例如使用CharsetEncoder和CharsetDecoder。 4. **Android客户端接收消息问题** - 异步消息处理:由于Android主线程不能直接处理网络I/O,所以需要在后台线程中进行,...
《MINA使用札记——CumulativeProtocolDecoder使用详解》 MINA(Java Multithreaded Network Application Framework)是一个强大的、高性能的Java网络应用框架,它主要用于构建可伸缩的、高性能的服务端应用,如...
在使用MINA进行网络通信时,如果处理不当,中文字符可能会出现乱码。这通常是由于字符编码不一致导致的。在MINA中,我们可以在设置输入流和输出流时指定正确的字符编码,例如UTF-8。对于TCP连接,我们可以在创建`...
在提供的文件"minaConnect"中,可能包含了使用Mina实现上述功能的相关代码示例和配置。通过分析这些文件,可以更具体地了解如何在实际项目中应用Mina的连接、心跳和断线重连机制。不过,具体的实现细节和优化策略需...
mina新手案例,mina新手教程源码 mina+springboot最简单的案例。用的IDEA * mina服务端 * 1、添加@Controller注解和 @PostConstruct注解,代表启动springboot项目时也调用该类下的该方法, * 启动springboot项目...
Mina(全称“MINA: Minimalistic Application Networking API”)是Apache软件基金会的一个开源项目,它为开发者提供了一种简单而高效的方式来构建高性能、跨平台的网络应用。Mina的核心优势在于它的事件驱动和异步I...
在Spring框架的支持下,Mina的使用变得更加便捷,能够更好地融入到Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)体系中,从而实现服务的灵活配置和管理。 **1. Mina框架的核心组件** ...
Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当...
MINA框架的核心在于它的异步I/O模型,它允许开发者以非阻塞的方式处理网络连接,提高了系统资源的利用率。而编解码器在MINA中扮演着至关重要的角色,它是数据在网络间传输时进行转换的关键组件。编解码器负责将应用...
在Android上使用Mina框架,可以极大地简化TCP通信的实现过程。TCP是一种面向连接的、可靠的传输层协议,适用于需要稳定数据传输的应用场景。Mina提供了一种事件驱动的模型,允许开发者通过异步方式处理网络I/O操作,...