Tomcat自动启动后台任务

转载 2012年03月21日 15:43:52

2.13 Listener介绍

Listener的作用非常类似于load-on-startup Servlet。用于在Web应用启动时,启动某些后台程序,这些后台程序负责为系统运行提供支持。

Listener与load-on-startup Servlet的区别在于:Listener的启动时机比load-on-startup Servlet早,只是Listener是Servlet 2.3规范之后才出现的。

Listener实际上就是用于取代那些无须响应用户请求的Servlet,所以Listener类中无须提供响应用户请求的方法,Listener的作用是为整个Web应用提供后台服务。

使用Listener只需要两个步骤:

建Listener实现类。

在web.xml文件中配置Listerner。

2.13.1 创建Listener类

创建Listener类必须实现ServletContextListener接口,该接口包含两个方法。

contextInitialized(ServletContextEvent sce):启动Web应用时,系统调用Listener的该方法。

contextDestroyed(ServletContextEvent sce):关闭Web应用时,系统调用Listener的该方法。

下面将创建一个获取数据库连接的Listener,该Listener会在应用启动时获取数据库连接,并将获取到的连接设置成application范围内的属性。下面是该Listener的代码。

程序清单:codes\02\2.13\ listenerTest\WEB-INF\src\lee\GetConnListener.java

public class GetConnListener implements ServletContextListener
{
//应用启动时,该方法被调用
public void contextInitialized(ServletContextEvent sce)
{
try
{
//取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
//从配置参数中获取驱动
String driver = application.getInitParameter("driver");
//从配置参数中获取数据库url
String url = application.getInitParameter("url");
//从配置参数中获取用户名
String user = application.getInitParameter("user");
//从配置参数中获取密码
String pass = application.getInitParameter("pass");
//注册驱动
Class.forName(driver);
//获取数据库连接
Connection conn = DriverManager.getConnection(url ,
user , pass);
//将数据库连接设置成application范围内的属性
application.setAttribute("conn" , conn);
}
catch (Exception ex)
{
System.out.println("Listener中获取数据库连接出现异常"
+ ex.getMessage());
}
}
//应用关闭时,该方法被调用
public void contextDestroyed(ServletContextEvent sce)
{
//取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
Connection conn = (Connection)application.getAttribute("conn");
//关闭数据库连接
if (conn != null)
{
try
{
conn.close();
}
catch (SQLException ex)
{
ex.printStackTrace();
}
}
}
}

上面程序中粗体字代码重写了Listener的contextInitialized()、contextDestroyed()方法,这两个方法分别在应用启动、关闭时被调用,这两个方法分别实现获取数据库连接、关闭数据库连接的功能,这些功能都是为整个Web应用提供服务的。

程序中斜体字代码用于获取配置参数,细心的读者可能已经发现Listener获取的是Web应用的配置参数,而不是像Servlet和Filter获取本身的配置参数。这是因为Listener的作用就是为整个应用提供后台服务,所以Listener不能配置自己的配置参数。如果Listener需要参数,总是直接访问Web应用的配置参数。


2.13.2 配置Listener

正如load-on-startup Servlet一样,Listener用于启动Web应用的后台服务程序,但不负责处理及响应用户请求,因此无须配置URL,而且Listener无须配置参数,所以Listener的配置非常简单:只要指定Listener实现类即可。

配置Listener使用listener元素,该元素接受如下子元素:

listener-class:指定Listener实现类。

若将Listener配置在Web容器中(如果Web容器支持Listener),则Listener将随Web应用的启动而启动。

下面是该Listener的配置片段:

<listener>

在上面的配置中,既无须配置Listener的名字,也无须配置Listener的URL,只需配置它的实现类即可。容器将自动检测部署在容器中的Listener,并在应用启动时,自动加载所有的Listener。

一旦容器中的GetConnListener正常启动,我们的所有JSP页面都可通过application获取数据库连接,从而可以非常方便地进行数据库访问。

本例中的Listener把一个数据库连接(Connection实例)设置成application属性,这样将导致所有页面都使用相同的Connection实例,这将导致非常差的性能。较为实用的做法是:应用启动时将一个数据源(javax.sql.DataSource实例)设置成application属性,而所有JSP页面都通过DataSource实例来取得数据库连接,再进行数据库访问,这样就会好得多。关于数据库连接池的介绍请参看笔者所著《疯狂Java讲义》的13.8节。


http://book.51cto.com/art/200810/94278.htm

http://book.51cto.com/art/200810/94280.htm



相关文章推荐

Tomcat 启动时加载WEB应用中的后台程序

Tomcat 启动时加载WEB应用中的后台程序    今天在做项目的时候遇到一个问题。 Tomcat 如何在启动时就能运行那些我web应用中后台的处理线程呢?比如说,定时器,或者是一些具有自动检测功能...

JAVA定时执行任务(Tomcat 下的定时任务)

2013-02 Tomcat 下的定时任务 SysContextListener.java package axtic.servlet; import java.util....

创建一个没有任何界面的后台程序并且设置为开机启动

Windows系统下常见的程序类型有3种,第一种是最常见的WinForm类型的,第二种是控制台Console类型的,第三种是Windows Service类型的。   在我们编写一个程序的时候,如果...

杀死tomcat 进程

cd /java/tomcat 执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.out ...

Tomcat 启动时加载WEB应用中的后台程序

Tomcat 启动时加载WEB应用中的后台程序    今天在做项目的时候遇到一个问题。 Tomcat 如何在启动时就能运行那些我web应用中后台的处理线程呢?比如说,定时器,或者是一些具有自动检测功能...

Tomcat自动更新class类文件

在项目开发过程中,经常会遇到对项目内的类文件进行更新,怎样才能在不重启服务的情况下,自动加载类文件呢,其实有两种方法:热部署、热加载 热部署:容器状况在运行时重新部署整个项目。这类环境下一般整个内存...

BackgroundWorker后台任务实例源码

  • 2013年06月22日 11:13
  • 19KB
  • 下载

使用Jenkins的任务自动跑脚本后发现,tomcat服务刚启动就被杀死

在Jenkins的使用中,遇到过的一个场景是:使用python自动执行tomcat bin目录下的startup.bat开启批处理,服务开启成功后就随着python脚本执行结束该服务就被杀死,开始以为...

NC预警及后台任务使用说明

  • 2017年04月07日 09:02
  • 3.21MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tomcat自动启动后台任务
举报原因:
原因补充:

(最多只允许输入30个字)