Web-TimeService用于定时调用(触发)应用,EJB2.1也提供了TimerService,但现在有的application server不支持,有的就根本没有用到ejb,所以我写了一个简单的TimerSerivce
Public class TimerService { public static final long p = 1000*60*60; Timer timer = new Timer(false); TimerSchedule schedule = null; public TimerService() { }
public void start() throws Exception { schedule = new TimerSchedule(); schedule.addTimerJob(new SomeTimerJob()); //add other job here timer.schedule(schedule,0,p); }
public void stop() throws Exception { timer.cancel(); } }
//包含了多个TimerJob,并每到一定时候取出来看看是否该调用 public class TimerSchedule extends TimerTask { private List list = new ArrayList(); public TimerSchedule() {} public void addTimerJob(TimerJob job) { list.add(job); }
public void run() { Date now = Calendar.getInstance().getTime(); Date next = null; for(int i=0;i<list.size();i++) { TimerJob job = (TimerJob)list.get(i); next = job.getNextExeDate(); if(isEquals(now,next)) { job.execute(); } } }
/** * 比较俩个时间相差是否小于TimerService.p(一个周期) * @param now * @param next * @return */ private boolean isEquals(Date now,Date next) { long time = next.getTime()-now.getTime(); if (time <= TimerService.p && time >= 0) { return true; } else { return false; } }
public boolean cancel() { return true; } }
//该接口描述了如何完成TimerTask,请参考TimerJobExample interface TimerJob { public void execute(); public Date getNextExeDate(); }
/** * 该例子用于演示如何完成tiemrjob * 该例子功能是在每天的凌晨一点调用 */ public class TimerJobExample implements TimerJob { Calendar nextDate = null; public TimerJobExample() { nextDate = Calendar.getInstance(); nextDate.add(Calendar.DAY_OF_MONTH,1); //将设置调用时间是(第二天的)每天凌晨1点 nextDate.set(Calendar.HOUR_OF_DAY,1); } public void execute() { nextDate.add(Calendar.DAY_OF_MONTH,1); nextDate.set(Calendar.HOUR_OF_DAY,1); callFunction(); }
public Date getNextExeDate() { return nextDate.getTime(); }
private void callFunction() { System.out.println("TimerJobExample call ejb funcation:"+new Date()); } }
|