技术开发 频道

详细解读Tomcat 7的七大新特性

  6 更容易将Tomcat内嵌到应用去中去

  Tomcat 7现在可以嵌入到应用程序中去,并可以通过程序去动态设置和启动。象在CATALINA_HOME/conf/server.xml中的很多配置,现在都可以用程序动态去设置了。在Tomcat 7前,Tomcat 6提供了一个嵌入类,它能方便地去配置Tomcat。但在TOMCAT 7中,这个类已被废弃了。这个新的Tomcat 7的类,使用了几个默认的配置元素,并提供了一个更容易和简单的方法去嵌入Tomcat。

  下面是CATALINA_HOME/conf/server.xml中的一些相关属性和配置:

< Server >
< Service >
< Connector port="8080 >
< Engine >
< Host appBase="/home/avneet/work/tomcat7demo/dist" / >
< /Engine >
< /Connector >
< /Service >
< /Server >

  我们可以通过程序去进行动态设置了:

final String CATALINA_HOME = "/home/avneet/work/temp/tomcat7demo/";
Tomcat tomcat
= new Tomcat();
tomcat.setBaseDir( CATALINA_HOME );
tomcat.setPort(
8080 );
tomcat.addWebapp(
"/tomcat7demo", CATALINA_HOME + "/webapps/tomcat7demo.war");
tomcat.start();
System.out.println(
"Started tomcat");
tomcat.getServer().await();
//Keeps Tomcat running until it is shut down
//Webapp tomcat7demo accessible at http://localhost:8080/tomcat7demo/

  7 异步日志记录

  TOMCAT 7现在包括了一个异步日志记录器(AsyncFileHandler)。AsyncFileHandler继承了FileHandler类并能代替FileHandler。使用AsyncFileHandler,时,只需要在CATALINA_HOME/conf/logging.properties中把FileHandler全部替换为AsyncFileHandler就可以了。要注意的是异步日志不能跟log4一起工作。

  当有日志发向AsyncFileHandler时,日志被加入到队列中(java.util.concurrent.LinkedBlockingDeque)并且方法调用的信息会马上返回不需要等待I/O写到磁盘中。当类加载器加载AsyncFileHandler时,会有一个单独的线程启动,这个线程会从队列中读取日志信息并且写到磁盘中去

  这种方法的好处是如果I/O速度很慢(比如日志要保存在远端的设备上)时,记录日志的请求和处理过程不会显得很慢。

  AsyncFileHandler使用生产者和消费者的关系原理,在队列中存储日志信息。队列默认大小为10000。为了预防队列溢出,默认是丢弃最后的信息。默认的队列大小和溢出的设置都可以通过启动参数进行设置。

  关于TOMCAT 7的示例程序

  TOMCAT 7的自带程序例子有两个servlets,一个是演示了如何采用随机数的办法防止CSRF攻击,另外一个是描述了使用aliases。更新一下web/META-INF/context.xml,指出图片的绝对路径即可顺利运行。

  通过ant运行build.xml去将它们部署到tomcat 7中,使用如下两个地址访问:

  • http://localhost:8080/tomcat7demo/csrf/

  • http://localhost:8080/tomcat7demo/alias/

0
相关文章