一、什么是任务调度?
简单来说,例如某个任务需要在每天的8:00执行一次;考勤系统每天统计员工的出勤情况;超市收银系统,每天晚上自动盘点当天销售金额。这些任务不需要人工干预,应该由系统自动调度完成。
二、任务调度种类:
1、让指定任务在某一固定时刻执行
2、让指定任务在某一时刻之后执行
3、周期性的执行
三、EJB实现任务调度
在Spring中提供了优秀的任务支持,同样,EJB完成任务调度主要是由计时器支持。EJB3的定时器服务由TimerService对象代,当某个EJB需要计时器服务时,一般由一下步骤:
1、调用TimerService.createTimer()方法为该EJB对象创建一个定时器对象
2、使用@Timeout注解修饰需要定期执行的方法,该方法便可实现调度,指定时间执行。注意用@Timeout注解修饰的方法不应该由客户端进行调用,而是由计时器负责调用它,当定时器调用该方法时,会把定时器自身作为实参作为Timer参数传入该方法,所以用@Timeout注解修饰的方法必须形如:
Public void method(Timer timer)
{
..........
}
对于开发者而言,使用EJB定时器进行任务调度最常用的就是上面提到的TimerService对象和@Timeout两个API.
四、代码演示
定期执行为check方法:
1、创建EJB接口
@Remote
public interface TimerEJB()
{
void setTime(Date init,long interval);
void check(Timer timer);
}
2、实现类,该实现类中使用TimeService创建定时器,使用@Timerout修饰需要被调度执行的方法。
@Stateless(mappedName="TimerEJB")
public class TimerEJBBean implements TimerEJB
{
//资源注入,注入TimerService服务类
@Resource
private TimerService timerService;
public void setTime(Date init,long interval)
{
timerService.createTimer(init,interval,"新的定时器!");
}
@Timeout
//被定期执行的任务
public void check(Timer timer);
{
//调用timer对象(参数)getInfo方法
System.out.print("定时器:"+timer.getInfo());
}
}
通过创建、@Timeout修饰,定时器会周期性的调用check方法,输入当前计时器的信息详情。
取消定时器:
通过createTimer创建的定时器对象本身只执行一次,所以无需编写代码关闭定时器;如果需要强制取消,调用timer.cancle()方法方可。由于EJB本身的事务控制机制,再添加事务管理后,EJB容器会对定时器进行事务管理,保证创建、取消的整体执行。例如定时器在执行check方法时,某一次调用出错了,EJB容器会保证该次调用作废,事务回滚,程序的状态和没执行该次请求之前是完全一样的。
在ITOO_EXAM系统中,也涉及到了任务调度,周期性执行某个方法,使用EJB计时器实现应该是个不错的选择。
到这里,对于EJB在ITOO项目中涉及到的使用就介绍完毕了。总结一下,ITOO使用EJB主要应用了EJB中会话Bean 的远程调用、EJB容器事务管理、EJB依赖注入、资源注入;在EJB调用和数据源配置这方面,JNDI功不可没。在接下来的开发中,带着这系列博客的总结去编码,收获还会更多,步步进阶,时刻分享。