为了在J2EE Application中实现定时运行的程序,我们需要借助Timer类。可供选择的有java.util.Timer,Commonj Timer和 WebSphere Application Server Scheduler。对于这三者的比较网上有诸多资料(可参:http://www.ibm.com/developerworks/cn/java/j-lo-timer/)。
方式一,使用起来很简单,但是如果Application采用JNDI来访问data source,你将无法访问到。因为,java.util.Timer启用的线程为非保护县城,不受Web Application Server Web容器的管辖,所以从上下文环境Context中无法获取。但是仅采用JDBC是可以的。
方式三,没有尝试过,在此不作多说。
方式二,是我所采用的,部署在Websphere server 6.0的服务器上,实现上述部署需要完成一下步骤:
一、下载Commonj Timer所需jar包,commonj-twm.jar并在当前web应用下引用。
二、在 web.xml 中增加 Timer 的资源描述
<resource-ref>
<res-ref-name>timer/MyTimer</res-ref-name>
<res-type>commonj.timer.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
三、实现 TimerListener 接口。
import commonj.timers.Timer; import commonj.timers.TimerListener; public class TestTimerListener implements TimerListener { private String input; public TestTimerListener(String input) { this.input = input; } public void timerExpired(Timer timer) { Date timeValue = new Date(); System.out.println("In timerExpired method, time is " + timeValue.toString() + ", input value is " + input); } }
四、在servlet中调用
InitialContext ctx = new InitialContext(); TimerManager mgr = (TimerManager) ctx.lookup("java:comp/env/timer/MyTimer"); TimerListener listener =new TestTimerListener ("test"); // 启动计时器 mgr.schedule(listener, 1000*60);
五、部署到Websphere时,需要为你TimerManager关联到Websphere服务器的一个计时管理器(通常Websphere服务器有个默认计时管理器JNDI名为tm/default)