1.简介
由于j2ee规范的限制,在servlet和ejb中执行用户自定义的多线程并发与定时器服务一直以来是困扰j2ee开发人员的一个大问题。现在commonj项目中的work manager和timer规范将是解决这些问题的一个优秀方法。
commonj 定时器(timer)规范提供了一个在servlet和ejb中设置定时器的简单方法,同时允许在servlet和ejb中响应定时器的提醒。该规范提供了一个在不能或者不方便使用java.util.timer环境中使用定时器功能的替代方法。
现在在weblogic server 9.0中已经提供了对work manager和timer规范的支持,在weblogic server 7和8中需要使用该项功能请参考这里,xcommonj-work。
关于work manager和timer规范的更多信息请访问这里:timer and work manager for application servers。
在j2ee中使用 work manager 规范执行并行任务,请访问这里:http://dev2dev.bea.com.cn/techdoc/200508631.html
commonj定时器的参考请见这里:http://dev2dev.bea.com.cn/techdoc/20051221711.html
2.定时器的使用办法:
(1)在web.xml或者ejb-jar.xml中增加定时器的描述:
<resource-ref>
<res-ref-name>timer/mytimer</res-ref-name>
<res-type>commonj.timers.timermanager</res-type>
<res-auth>container</res-auth>
<res-sharing-scope>unshareable</res-sharing-scope>
</resource-ref>
<res-ref-name>timer/mytimer</res-ref-name>
<res-type>commonj.timers.timermanager</res-type>
<res-auth>container</res-auth>
<res-sharing-scope>unshareable</res-sharing-scope>
</resource-ref>
(2)定义定时器到时间的回调类:
import commonj.timers.*;
public class testlistener
implements timerlistener
{
public testlistener()
{
}
implements timerlistener
{
public testlistener()
{
}
public void timerexpired(timer timer)
{
system.out.println("timerexpired.");
}
}
{
system.out.println("timerexpired.");
}
}
(3)在其它任何地方启动定时器,并设置定时器的任务即可实现定时功能了。
initialcontext ctx = new initialcontext();
timermanager mgr = (timermanager)ctx.lookup("java:comp/env/timer/mytimer");
timerlistener listener = new testlistener();
mgr.schedule(listener,4000);//定时器执行一次
mgr.scheduleatfixedrate(listener,5000,2000);//定时器周期执行
timermanager mgr = (timermanager)ctx.lookup("java:comp/env/timer/mytimer");
timerlistener listener = new testlistener();
mgr.schedule(listener,4000);//定时器执行一次
mgr.scheduleatfixedrate(listener,5000,2000);//定时器周期执行
//按照日历来执行定时器
calendar cal = calendar.getinstance();
cal.set(calendar.hour, 12);
mgr.schedule(listener, cal.gettime());
cal.set(calendar.hour, 12);
mgr.schedule(listener, cal.gettime());
闽公网安备 35060202000074号