文档章节

浅析Tomcat之AprEndpoint

D_GrayMan
 D_GrayMan
发布于 2016/07/05 07:46
字数 424
阅读 10
收藏 0

APR是Apache可移植运行库(Apache portable Run-time libraries)的简称,这是一个可以跨越多操作系统平台使用的底层支持接口库.在Tomcat的实现中就有使用该库的地方,AprEndpoint就是将Socket方面的操作直接用JNI替代而非Java元素的API.这使得其有较高的性能要求.同样AprEndpoint也是继承了AbstractEndpoint在实现的具体细节有点差别而已.只是另一种JIoEndpoint.提供了Acceptor线程,Socket轮询线程,Worker线程池和文件发送线程. 先看看Acceptor的实现.于JIoEndpoint有着极其相似的代码结构.

public void run() {

	int errorDelay = 0;

	// Loop until we receive a shutdown command
	while (running) {

		// Loop if endpoint is paused
		while (paused && running) {
			state = AcceptorState.PAUSED;
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				// Ignore
			}
		}

		if (!running) {
			break;
		}
		state = AcceptorState.RUNNING;

		try {
			//if we have reached max connections, wait
			countUpOrAwaitConnection();

			long socket = 0;
			try {
				// Accept the next incoming connection from the server
				// socket
				socket = Socket.accept(serverSock);
			} catch (Exception e) {
				//we didn't get a socket
				countDownConnection();
				// Introduce delay if necessary
				errorDelay = handleExceptionWithDelay(errorDelay);
				// re-throw
				throw e;
			}
			// Successful accept, reset the error delay
			errorDelay = 0;

			if (running && !paused) {
				// Hand this socket off to an appropriate processor
				if (!processSocketWithOptions(socket)) {
					// Close socket and pool right away
					destroySocket(socket);
				}
			} else {
				// Close socket and pool right away
				destroySocket(socket);
			}
		} catch (Throwable t) {
			....
		}
		// The processor will recycle itself when it finishes
	}
	state = AcceptorState.ENDED;
}

其中的socket = Socket.accept(serverSocket)就是使用的JNI,也就是APR库.而这个类的所有Socket的实现也是使用该库的.至于其他线程也是使用了该库.看下生命周期的bind方法的部分代码,里面用了更多的APR的函数.大体的内容也是一致的.只是在Socket实现的API不一样而已.至于NIoEndpoint也是类似的实现.只不过实现方式是ServerSockeChannel,SockeChannel和Selector的就绪选择.

© 著作权归作者所有

D_GrayMan
粉丝 0
博文 22
码字总数 18477
作品 0
深圳
高级程序员
私信 提问
Tomcat开启APR模式

准备 tomcat-native apr apr-iconv apr-util openssl 解决办法: -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider...

jEpac
2016/06/23
202
0
druid错误解决办法

java.sql.SQLException: connection holder is null at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1083) at com.alibaba.druid.pool.DruidPoole......

凯文加内特
2016/03/05
337
0
Https环境下WS接口两次连续调用出错

服务端报错: 2016-02-26 10:48:02,304 ERROR [0x00007084] hsoap <I:productVRMtrunkhsoapsrchsoapsoap_service_task.cpp(152) - DoRecv> <soap_ssl_accept failed, soap error detail = SO......

疯子阳
2016/02/26
244
0
Tomcat7调试运行环境搭建与源代码分析入门

需要准备好下面这些工具 JDK 1.6+ Maven 2或3 TortoiseSVN 1.7+ (从1.7开始”.svn”目录集中放在一处了,不再每个目录下都放一份) Eclipse 3.5+ 这4个工具不在这里描述怎么配置了,如果你是有...

leesama
2014/11/26
309
0
Spring Boot 2.0 自动配置原理浅析

Spring Boot 2.0 自动配置原理浅析 泥瓦匠BYSocket2017-12-221 阅读 SpringJava技术 本章内容 外化配置和自动配置 自动配置原理浅析 Starter 组件浅析 小结 阅读时间:6 分钟 摘录:至简,记...

泥瓦匠BYSocket
2017/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新架构、新角色:TiDB Community Upgrade!

作者:Jian Zhang 经过几年的发展,TiDB 社区已经逐渐成熟,但是随着社区的发展壮大,我们逐渐感受到了现在社区架构上的一些不足。经过一系列的思考和总结,我们决定升级和调整目前社区组织架...

TiDB
32分钟前
6
0
jquery qrcode库提示not function

jquery qrcode 这个库能用,但是必须在初始化的时候,官方给的使用方法是 引入qrcode的库文件后,在js中写以下 html <div id="qrcode"></div> js jQuery('#qrcode').qrcode({ render: ......

shikamaru
37分钟前
14
0
MySQL数据库去重的简单方案

利用 distinct 对需要处理的字段进行去重 select distinct 字段名 from 表名 利用group by select * from 表名 group by 字段名 利用having select * from 表名 group by 字段名 having 字段...

FeanLau
39分钟前
9
0
字符串转换成整数

实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该...

蔚蓝_晴天
50分钟前
8
0
Eureka客户端续约及服务端过期租约清理源码解析

在之前的文章:EurekaClient自动装配及启动流程解析中,我们提到了在构造DiscoveryClient时除了包含注册流程之外,还调度了一个心跳线程: scheduler.schedule( new Ti...

Java学习录
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部