Tomcat Engine组件是一个职责相当简单的组件,他的主要作用就是决定从Connecter过来的请求应该交给哪一个Host来处理。在本文中,我们将会简单介绍下Tomcat的Engine组件的功能,backgroundProcess()方法,以及和Engine组件相关的几个Valve。

一、Engine组件的主要功能

在之前的学习中,我们已经了解到,Tomcat的各个组件都是通过Pipeline连在一起的,而各个组件的功能都封装在了各个Pipeline的BaseValve中,对于Engine组件,它的BaseValve就是StandardEngineValve,我们看一下它的invoke方法,便可以了解它的功能了:


从上面的代码片段我们看到,StandardEngineValve只是从request中拿到Host,然后调用Host组件的Pipeline就完事了,所以Engine组件的功能基本上就是决定请求由哪一个Host来处理,功能相当简单。

二、BackgroundProcessorDelay

Engine组件的默认实现继承了ContainerBase类,这个类是所有的Tomcat组件的基类,它实现了Container接口,这个接口里面有一个很重要的方法:backgroundProcess,从它的名字来看就是做一个后台的处理。事实上,Tomcat的组件可以和一个线程相关联,这个线程会定时地去调backgroundProcess方法,这个方法可以用来实现应用的重新加载或者其他任何需要定时触发的功能。

在ContainerBase的start()方法中,调用了一个threadStart方法,这个方法就是起一个线程去定时的调用backgroundProcess方法:


至于backgroundProcess方法的调用间隔可以在server.xml中的各个组件配置中配置相应的backgroundProcessDelay来指定。

三、Engine组件中其他一些可用Valve

默认配置下,Engine组件只包含了一个BaseValve,也就是StandardEngineValve,当然,你也可以根据自己的需要来增加Valve,Tomcat本身已经提供了三个Valve供Engine组件使用,你可以在server.xml中配置它们来使用,下面就来介绍下这几个Valve的功能:

1. REQUEST DUMPER VALVE

这个Valve的作用就是将请求头信息和相应头信息通过log打印出来,当然,读者们可能已经想到,通过log将请求的详细信息打印出来必然会对性能产生影响,但是如果仅仅是用来追踪问题,配置上这个Valve还是有点作用的。

2. REQUEST FILTER VALVE

RequestFilterValve是用来请求的过滤的,通过配置allows和denies列表,可以允许一些请求的访问或阻止一些请求的访问,RequestFilterValve是一个抽象类,它有两个默认的实现类RemoteAddrValve和RemoteHostValve,这两个Valve分别可以根据请求ip地址和请求的host来过滤请求。当然,你也可以根据自己的需要来扩展RequestFilterValve,这里需要注意的一点是最好不要把业务相关的逻辑用RequestFilterValve来控制,这样势必会造成应用对Tomcat的依赖。

3. ACCESSLOGVALVE

AccessLogValve的作用是将请求的详细信息打印出来,注意,它和RequestDumperValve是不同的,RequestDumperValve打印的是请求头信息和相应头信息,而AcessLogValve的作用则更像Apache Httpd的cookieLog,通过配置一定的log格式,来将你需要的请求信息打印出来,具体的格式配置大家可以参考Tomcat的官方文档