浅析Tomcat之AbstractEndpoint

Tomcat中的Connector将具体的协议处理托管给了不同的ProtocolHandler实现类.这些实现类都内置这一个很重要的对象,AbstractEndpoint这是一个抽象类,不同的协议需要提供不同的Endpoint.这个类的作用就是提供底层的网络I/O的处理.不同的ProtocolHandler所内置的Endpoint是不同的.但是AbstractEndpoint为这些类抽象出了一个具体的实现框架.

首先了解下AbstractEndpoint的一系列内部类(接口).Acceptor是其中职能最重要的,它是一个抽象类,拓展了Runable接口.从名字中可以很容易知道它的作用就是用来接收底层的Socket连接.而具体的实现就需要到具体的协议中去探究.比较重要的内部接口是Handler.它的作用是定义连接的处理.也就是后面被实现成各个版本是ConnectionHandler.

其次就是AbstractEndpoint的生命周期实现和一些功能方法.这些都跟上述的内部类实现息息相关.先看下类图.

AbstractEndpoint类图

从上图,我们可以了解,AbstractEndpoint有几个比较重要的属性.connectionLimitLatch是一个连接的锁存器,控制并发上限和等待队列,具体原理可见浅析Tomcat之LimitLatch.SocketProperties在这个类里面也派上了用场.内部定义的Acceptor在AbstractEndpoint是以数组的形式出现的.代表着一组连接接收器.maxConnections是最高的并连接数.此处设置的是默认值1000.executor是一个线程池.

接下来我们看下它的Lifecycle methods.中间有4个抽象方法.子类中必须实现,来实现不同的协议处理方式.而其他的编写方式也跟生命周期组件有所类似.

public abstract void bind() throws Exception;
public abstract void unbind() throws Exception;
public abstract void startInternal() throws Exception
public abstract void stopInternal() throws Exception;
protected abstract Acceptor createAcceptor();

public final void init() throws Exception {
	if (bindOnInit) {
		bind();
		bindState = BindState.BOUND_ON_INIT;
	}
}

public final void start() throws Exception {
	if (bindState == BindState.UNBOUND) {
		bind();
		bindState = BindState.BOUND_ON_START;
	}
	startInternal();
}

protected final void startAcceptorThreads() {
	int count = getAcceptorThreadCount();
	acceptors = new Acceptor[count];

	for (int i = 0; i < count; i++) {
		acceptors[i] = createAcceptor();
		Thread t = new Thread(acceptors[i], getName() + "-Acceptor-" + i);
		t.setPriority(getAcceptorThreadPriority());
		t.setDaemon(getDaemon());
		t.start();
	}
}

public void pause() {
	if (running && !paused) {
		paused = true;
		unlockAccept();
	}
}

public final void stop() throws Exception {
	stopInternal();
	if (bindState == BindState.BOUND_ON_START) {
		unbind();
		bindState = BindState.UNBOUND;
	}
}

public final void destroy() throws Exception {
	if (bindState == BindState.BOUND_ON_INIT) {
		unbind();
		bindState = BindState.UNBOUND;
	}
}

    init和start会调用bind方法,该方法是用来绑定Socket端口的(其实是SocketChannel,后面博文解释),startAcceptorThreads方法是用来启动底层网络I/O接收器的.这个在子类的startInternal中会被调用.pause方法是用unlockAccept来解除Acceptor的绑定.stop和destroy作用是解除它的Socket绑定,也就是不接受Soccket.

综上所述,AbstractEndpoint的作用是为底层网络连接提供一个实现的框架.它的实现方式是多样化的.

 

 

首发于泛泛之辈 - http://www.lihongkun.com/archives/110

猜你喜欢

转载自lihkstyle.iteye.com/blog/1944399