1 主要流程
read in data:
IO读入(IoProcessor)日志记录、解码、threadPool(IoFilter)业务逻辑处理(IoHandler)
write out data:
业务逻辑处理(IoHandler)日志记录、编码、threadPool(IoFilter) IO写出(IoProcessor)
由以上可以看出,IO读入和IO写出的过程是相反的。
2 线程
这里主要讨论一下Mina中的线程,使用线程,线程池可以提高性能,Mina中就使用了几种线程:
- IoAcceptor/IoConnector线程
- IoProcessor线程
- IoHandler线程
2.1 IoAcceptor/IoConnector线程
IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。这两种线程都是通过线程池建立的,我们可以在构建对象的时候就指定线程池类型:
public NioSocketAcceptor(Executor executor, IoProcessor<NioSession> processor) {}
public NioSocketConnector(Executor executor, IoProcessor<NioSession> processor) {}
此类线程池的构造在源代码中为(AbstractIoService第168行):
protected AbstractIoService(IoSessionConfig sessionConfig, Executor executor) {
//省略部分代码
if (executor == null) {
this.executor = Executors.newCachedThreadPool();
createdExecutor = true;
} else {
this.executor = executor;
createdExecutor = false;
}
}
由此可见默认的线程池类型为newCachedThreadPool,这是一个可根据需要创建新线程的线程池,在以前构造的线程可用时可以重用它们。
2.2 IoProcessor线程
对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1,例如双核机器的IoProcessor的线程池大小默认为3,我们可以更改线程池的大小:
IoConnector connector = new NioSocketConnector(9);
IoAcceptor acceptor = new NioSocketAcceptor(9);
如上就把IoProcessor线程池的大小改为9个。
IoProcessor线程池的默认大小在源代码中的定义(SimpleIoProcessorPool第82行):
private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;
IoProcessor线程池的构造在源代码中为(SimpleIoProcessorPool第144行):
public SimpleIoProcessorPool(Class<? extends IoProcessor<S>> processorType,
Executor executor, int size) {
//省略部分代码
if (createdExecutor) {
this.executor = Executors.newCachedThreadPool();
} else {
this.executor = executor;
}
}
2.3 IoHandler线程
当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理,过滤器的配置如下:
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
如上配置之后,IO处理和业务逻辑处理将会使用各自的线程池产生线程使用。如果你的应用每次处理请求的时间较长而又希望应用能够有较好的响应性,那么最好是把处理业务逻辑的任务放到一个新的线程中去执行,而不是在 mina 框架创建的线程中去执行。
2.4 各种线程的产生
1.当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。
2. 当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。
3.当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。
4. 如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。
3 线程查看
举个例子通过jdk自带工具jvisualvm来查看线程:
public class MinaTest {
protected static Logger logger = LoggerFactory.getLogger(MinaTest.class);
private static int PORT = 9999;
public static void main(String[] args) {
try {
// 创建一个非阻塞的server端的Socket
IoAcceptor acceptor = new NioSocketAcceptor();
// 设置过滤器
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
// 设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读写通道10秒内无操作进入空闲状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 绑定逻辑处理器
acceptor.setHandler(new MinaServerHandler());
// 绑定端口
acceptor.bind(new InetSocketAddress(PORT));
logger.info("服务端启动成功... 端口号为:" + PORT);
} catch (Exception e) {
logger.error("服务端启动异常....", e);
e.printStackTrace();
}
}
}
public class MinaServerHandler extends IoHandlerAdapter {
protected static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
logger.error("服务端发送异常...", cause);
}
public void messageReceived(IoSession session, Object message) throws Exception {
String msg = message.toString();
//如果是quit就关闭session退出
if ("quit".equals(msg)) {
session.close();
}
Date date = new Date();
session.write(date.toString());
}
public void sessionCreated(IoSession session) throws Exception {
logger.info("服务端与客户端创建连接...");
}
}
1.运行MinaTest类,启动服务器端。
2.开始->运行->cmd进入控制台 窗口。
3.输入:telnet 127.0.0.1 9999
4.再重复2、3步骤2次。
5.对jvisualvm的线程视图截图如下:
- 通过以上步骤我们可以看出我们打开了一个服务器端口,并用3个客户端进行连接,下面我们通过以上总结的知识来分析一下服务端产生的线程:
- NioSccketAcceptor为服务器端监听端口9999通过线程池创建的一个线程。
- NioProcessor-1、NioProcessor-2、NioProcessor-3为IoProcessor线程池创建的线程,用来IO处理。
- pool-3-thread-1、pool-3-thread-2、pool-3-thread-3为过滤器配置的线程池创建的线程,用来业务逻辑处理。
- 大小: 12.3 KB
- 大小: 3.4 KB
分享到:
相关推荐
总结来说,Apache Mina的线程模型设计允许开发者灵活地调整资源分配,以适应不同场景的需求。通过理解和配置这些线程模型,可以有效地优化Mina应用程序的性能和并发能力,确保网络服务的高效运行。
### Apache MINA线程模型配置详解 #### 一、线程模型配置介绍 Apache MINA 是一个用于构建网络应用程序的高性能、高可靠性的框架。它提供了丰富的功能来简化网络编程,包括TCP/IP 和 UDP/IP 协议的支持。线程模型...
2. 过滤器(Filter):`ExecutorFilter` 和 `ProtocolCodecFilter` 是添加到 Acceptor 的过滤器。`ExecutorFilter` 提供了一种将任务分发到线程池执行的方式,而 `ProtocolCodecFilter` 则用于数据编码和解码,这里...
总结,MINA2推送Demo客户端,尤其是"echo_client_udp",为我们提供了一个理解MINA2框架和UDP通信的实用工具。通过对这个例子的深入学习和实践,开发者不仅可以掌握MINA2的基本用法,还能了解到如何利用MINA2构建高效...
为了提高性能,可以利用Mina2的多线程模型,实现并发处理多个连接。此外,还可以结合Spring框架,将Mina2集成到Spring Boot应用中,实现更灵活的服务注册和发现。 总结,Apache Mina2提供了一套强大的工具,使得...
- **执行器**:探讨了Mina中的Executor过滤器,用于管理和调度线程,确保程序高效运行。 #### Chapter 11 - SSL过滤器 - **安全传输**:介绍了Mina支持的SSL过滤器,用于实现加密通信的安全保障。 #### Chapter ...
### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...
4. **Apache MINA 线程模型配置 .shtml**:这部分内容可能专注于MINA的线程模型,MINA支持多种线程模型,如NIO多路复用器、简单的线程池等,以优化性能和并发处理能力。 5. **NIO_TEST**:这可能是一些与Java NIO...
总结起来,Apache Mina提供了一套强大的网络通信框架,通过其心跳连接和断线重连功能,可以确保服务的稳定性和可靠性。对于Android开发者来说,理解和应用这些机制,能够有效提升应用程序的网络通信质量。
总结来说,Spring Boot深度整合Mina可以帮助我们快速构建高性能的网络服务,降低了开发复杂性。这个开箱即用的方案对于新手开发者来说,是一个很好的学习起点,可以让他们快速掌握如何在Spring Boot环境中运用Mina...
《MINA学习总结》 MINA(全称:Java Multicast Network Application Framework)是一个由Apache软件基金会开发的网络应用框架,主要用于构建高性能、高可用性的网络服务器。它为开发者提供了异步I/O处理的能力,...
《Mina学习总结》 Apache Mina(全称Mini Assured Networking Abstraction)是一个轻量级、高性能的网络通信框架,广泛应用于Java平台上的网络应用开发。它为开发者提供了简单的API来处理网络通信,简化了TCP/IP和...
总结起来,`Android-MinaSocket` 是一个基于Apache Mina的Android长连接库,它提供了稳定、高效的网络通信功能,适用于需要实时数据交互的Android应用。通过使用这个库,开发者可以专注于业务逻辑,而无需过多关心...
Mina分为1.x和2.x两个主要分支,推荐使用最新的2.0版本。框架中包含了Server和Client的封装,简化了网络通信结构。在Mina的架构中,IoService接口负责在一个线程上建立套接字连接,并通过Selector监听连接状态。当...
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
总结来说,MinaClient是基于Apache Mina框架在Android平台上实现的网络通信客户端,它利用Mina的高效I/O处理能力,结合MPAndroidChart库进行数据可视化,可以用于创建复杂的网络应用。开发者需要理解Mina的核心组件...
Mina的核心概念是基于NIO(非阻塞I/O)模型,它允许在单个线程上处理多个连接,从而极大地提高了系统资源的利用率和整体性能。下面我们将深入探讨Java Mina的关键特性、主要组件以及如何在实际项目中使用它们。 1. ...
结合Java NIO(非阻塞I/O),Mina使得开发者能够更专注于业务逻辑设计,而不必深陷底层I/O和线程并发的复杂细节。 #### Mina框架概述 Mina框架的核心设计理念在于提供一个强大的基础架构,让开发者能够轻松创建高...
5. **线程模型**:MINA提供了灵活的线程模型,可以根据系统资源和需求选择单线程、多线程或者无线程模型。 6. **强大的异常处理**:MINA提供了丰富的异常处理机制,帮助开发者处理各种可能出现的网络通信错误。 7....