Java Web应用启动间隔执行的程序

Reference:《Java定时器timer.schedule在Web中间隔执行任务和定时》《【Java】Timer和TimerTask详解

 

做了一个Demo,完成如下的功能:

让Tomcat在WEB程序启动的时候启动一个线程池和一个Timer线程,Timer线程每隔一段时间跑一次(比如检查到期的用户,类似轮询查看),然后触发另一个后台线程(甩给线程池去处理,比如处理到期的用户,发送等)。

直接用代码说话

StarupListener.java

package Listeners;

import java.util.Timer;

import java.util.concurrent.Executors;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import BackStage.MyTimerTask;

import Support.PoolManager;

public class StartupListener implements ServletContextListener {

	@Override

	public void contextDestroyed(ServletContextEvent sce) {

		sce.getServletContext().log("定时器销毁");

	}

	@Override

	public void contextInitialized(ServletContextEvent sce) {

		sce.getServletContext().log("启动线程池");

		// Start a thread pool to deal with different task;

		PoolManager.pool = Executors.newFixedThreadPool(10);

		sce.getServletContext().log("启动定时器");

		//Create a Daemon timer thread

		Timer timer=new Timer(true);

		// 每隔10秒钟执行任务

		timer.schedule(new MyTimerTask(sce.getServletContext()), 0,10 * 1000); 

		sce.getServletContext().log("已经添加任务调度表");

	}

}

MyTimeTask.java

package BackStage;

import java.util.TimerTask;

import javax.servlet.ServletContext;

import Support.PoolManager;

public class MyTimerTask extends TimerTask {

	private ServletContext context = null;

           private int  param;

	public MyTimerTask(ServletContext context) {

		this.context = context;

	}

	@Override

	public void run() {

		context.log("开始执行指定定時任务");

		// TODO 自定义

		System.err.println("号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务");

		//让线程池去跑一个任务

		PoolManager.pool.execute(new WorkThread(param++));

		context.log("指定定時任务执行结束");

	}

}

PoolManager.java

package Support;

import java.util.concurrent.ExecutorService;

public class PoolManager {

	public static ExecutorService pool;

}

WorkThread.java

package BackStage;

public class WorkThread implements Runnable {

	private int param;

	public WorkThread(int param) {

		this.param = param;

	}

	@Override

	public void run() {

		// TODO Do something

		System.err.println("我被线程池调用执行啦~!参数:" + param);

	}

}

web.xml片段

<listener>

	<listener-class>Listeners.StartupListener</listener-class>

</listener>

 

输出结果:(我就喜欢用System.err输出红色的!多喜庆╮(╯▽╰)╭)

信息: 开始执行指定定時任务
号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务
2011-3-31 18:26:46 org.apache.catalina.core.ApplicationContext log
信息: 指定定時任务执行结束
我被线程池调用执行啦~!参数:1
2011-3-31 18:26:56 org.apache.catalina.core.ApplicationContext log
信息: 开始执行指定定時任务
号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务
我被线程池调用执行啦~!参数:2
2011-3-31 18:26:56 org.apache.catalina.core.ApplicationContext log
信息: 指定定時任务执行结束
2011-3-31 18:27:06 org.apache.catalina.core.ApplicationContext log
信息: 开始执行指定定時任务
号称每10秒钟跑一次哦!我要调用线程池去执行另外的任务
2011-3-31 18:27:06 org.apache.catalina.core.ApplicationContext log
信息: 指定定時任务执行结束
我被线程池调用执行啦~!参数:3

你可能感兴趣的:(Java Web)