本文内容是配置基于MINA的应用中的线程模型。
1、禁止缺省的ThreadModel设置
MINA2.0及以后版本已经没有ThreadModel了,如果使用这些版本的话,可以跳过本节。
ThreadModel设置是在MINA1.0以后引入的,但是使用ThreadModel增加了配置的复杂性,推荐禁止掉缺省的TheadModel配置。
IoAcceptor acceptor = ...;
IoServiceConfig acceptorConfig = acceptor.getDefaultConfig();
acceptorConfig.setThreadModel(ThreadModel.MANUAL);
注意在相关指南中,假定你已经如本节所说的禁止了ThreadModel的缺省配置。
2、配置I/O工作线程的数量
这节只是NIO实现相关的,NIO数据包以及虚拟机管道等的实现没有这个配置。
在MINA的NIO实现中,有三种I/O工作线程:
>>Acceptor线程 接受进入连接,并且转给I/O处理器线程来进行读写操作。每一个SocketAcceptor产生一个Acceptor线程,线程的数目不能配置。
>>Connector线程 尝试连接远程对等机,并且将成功的连接转给I/O处理器线程来进行读写操作。每一个SocketConnector产生一个Connector线程,这个的数目也不可以配置。
>>I/O处理器线程 执行实际上的读写操作直到连接关闭。每一个SocketAcceptor或SocketConnector都产生它们自己的I/O处理线程。这个数目可以配置,缺省是1。
因此,对于每个IoService,可以配置的就是I/O处理线程的数目。下面的代码产生一个有四个I/O处理线程的SocketAcceptor。
IoAcceptor acceptor = new SocketAcceptor(4, Executors.newCachedThreadPool());
没有单凭经验来决定I/O处理线程数目的方法,大概可以从1开始增加。
IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
3、增加一个ExecutorFilter到IoFilterChain中
ExecutorFilter
是一个IoFilter,用于将进入的I/O事件转到一个 java.util.concurrent.Executor实现。事件会从这个
Executor转到下一个IoFilter,通常是一个线程池。可以在 IoFilterChain的任何地方增加任意数目的
ExecutorFilter,实现任何类型的线程模型,从简单的线程池到复杂的SEDA。
到现在为止我们还没有增加
ExecutorFilter,如果没有增加ExecutorFilter,事件会通过方法调用转到一个 IoHandler,这意味着在
IoHandler实现中的业务逻辑会在I/O处理线程里运行。我们叫这种线程模型为"单线程模型"。单线程模型可以用来就会低反应网络应用程序,受
CPU限制的业务逻辑(如,游戏服务器)。
典型的网络应用需要一个ExecutorFilter插入到IoFilterChain
中,因为业务逻辑和I/O处理线程有不同的资源使用模式。如果你用IoHandler的实现来执行数据库操作,而没有增加一个
ExecutorFilter的话,那么,你整个服务器会在执行数据库操作的时候锁定,特别是数据库性能低的时候。下面的例子配置一个IoService
在一个新的IoSession建立时增加一个ExecutorFilter。
IoAcceptor acceptor = ...;
DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
这里要注意ExecutorFilter没有管理特定的Executor的生命周期,当完成时,需要关闭所有特定Executor的工作线程。
ExecutorService executor = ...;
IoAcceptor acceptor = ...;
DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
filterChainBuilder.addLast("threadPool", new ExecutorFilter(executor);
// Start the server.
acceptor.bind(...);
// Shut down the server.
acceptor.unbind(...);
executor.shutdown();
使用一个ExecutorFilter通常不意味着要用一个线程池,对于Executor的实现没有任何限制。
4、应该把ExecutorFilter放在IoFilterChain的什么地方
这
个要根据于具体应用的情况来定。如果一个应用有一个ProtocolCodecFilter实现和一个常用的有数据库操作的IoHandler实现的话,
那么就建议在ProtocolCodecFilter实现的后面增加一个ExecutorFilter,这是因为大部分的协议解码实现的性能特性是受
CPU限制的,和I/O处理线程是一样的。
IoAcceptor acceptor = ...;
DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain();
// Add CPU-bound job first,
filterChainBuilder.addLast("codec", new ProtocolCodecFactory(...));
// and then a thread pool.
filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool());
5、选择IoService的线程池类型时要小心
Executors.newCachedThreadPool()
经常是IoService首选的。因为如果使用其它类型的话,可能会对 IoService产生不可预知的性能方面的影响。一旦池中的所有线程都在使用
中,IoService会在向池尝试请求一个线程时开始锁定,然后会出现一个奇怪的性能下降,这有时是很难跟踪的。
6、不推荐IoServices和ExecutorFilters共享一个线程池
你可以想让IoServices和ExecutorFilters共享一个线程池,而不是一家一个。这个是不禁止的,但是会出现很多问题,在这种情况下,除非你为IoServices建立一个缓冲线程池。
分享到:
相关推荐
在这个深入理解Apache Mina的第五部分中,我们将关注Mina的线程模型配置,这是优化性能和管理资源的关键方面。 在Mina的非阻塞I/O(NIO)模式下,存在三种主要的工作线程,它们在NIO Socket中起到不同的作用: 1. ...
深入理解Apache_Mina_(1)----_Mina的几个类 ...深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_ByteBuffer与Mina_ByteBuffer的区别(类图) 相信你们也愿意去下载更有价值的东西
4. **Apache MINA 线程模型配置 .shtml**:这部分内容可能专注于MINA的线程模型,MINA支持多种线程模型,如NIO多路复用器、简单的线程池等,以优化性能和并发处理能力。 5. **NIO_TEST**:这可能是一些与Java NIO...
- **Apache MINA 线程模型配置 .shtml**:这部分内容可能详细讲解了MINA中的线程模型配置,如何根据应用场景选择合适的线程模型以优化性能。 - **MINA使用手记[1] _files**:这个目录可能包含了与第一篇使用手记相关...
Apache Mina的核心是基于Java NIO(非阻塞I/O)的事件驱动模型。在这个模型中,I/O操作不会阻塞线程,而是通过事件通知机制来触发回调函数。当数据准备好读取或写入时,事件处理器会接收到相应的事件,从而提高了...
此外,DEMO还可能涉及到MINA的线程模型和缓冲区管理。MINA基于NIO(Non-blocking I/O),利用Selector监控多个通道的I/O事件,从而有效地管理多个并发连接。Buffer类(如ByteBuffer)用于存储和操作字节数据,理解其...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...
- **多线程处理**:为了提高性能和响应能力,服务器端通常采用多线程模型来处理连接请求和数据传输。 #### 客户端架构简介 客户端架构主要涉及连接服务器、发送请求和接收响应的过程。与服务器端类似,客户端也需要...
1. **事件驱动模型**:Mina采用非阻塞I/O(NIO)的事件驱动模型,通过Selector监控多个Socket连接,减少了线程间的切换开销,提高了并发处理能力。这种模型对于处理大量并发连接的高负载服务器特别有利。 2. **API...
Mina2基于Java NIO(Non-blocking I/O)库,提供了异步I/O操作,这意味着它不会因为等待数据而阻塞线程。它使用了服务端Acceptor和客户端Connector来处理连接。Acceptor负责接收并处理来自客户端的连接请求,而...
3. **配置Mina的线程模型**: Mina提供了多种线程模型以适应不同的应用场景。这些模型包括:简单模型(SimpleExecutor),每个连接分配一个线程;固定线程池模型(FixedThreadPoolExecutor),线程池大小预先设定,...
7. **线程模型**:MINA提供了多种线程模型,如单线程、多线程以及NIO线程池,开发者可以根据实际需求选择最适合的模型。 8. **易于调试和监控**:MINA提供了详细的日志记录和统计功能,帮助开发者更好地理解和优化...
4. **MINA的线程模型配置** - MINA提供灵活的线程模型,如NIO线程模型、固定线程池模型等,可以根据应用需求调整线程的数量和分配策略,以优化性能和资源利用。 5. **MINA的使用** - 通过Apache_Mina入门资料,...
- **多线程模型**:Mina可以自动管理线程,确保在网络操作中避免阻塞,提高系统并发性能。 2. **单例类**: - **设计模式**:单例模式是一种创建型设计模式,保证一个类只有一个实例,并提供一个全局访问点。在...
一旦连接建立,Mina会通过事件模型来处理数据传输。服务端和客户端的交互通常涉及编码、解码、业务逻辑处理等步骤。例如,你可以创建一个简单的TCP服务器,它接收客户端发送的数据,解码后执行特定操作,然后将结果...
- **线程模型**:MINA允许自定义线程模型,如单线程、多线程或线程池,以适应不同的性能需求。 - **异常处理**:了解如何处理网络异常,如连接断开、数据传输错误等,确保程序的健壮性。 总的来说,Apache MINA ...
NIO是一个基于事件的IO架构,最基本的思想就是:有事件我通知你,你再去做你的事情,没事件时你大...而且NIO的主线程only one,不像传统的模型,需要N个线程去,也减轻了JVM的工作量,使得JVM处理任务时显得更加高效。