EJB系列(五)——使用EJB计时器进行任务调度



一、什么是任务调度?

简单来说,例如某个任务需要在每天的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功不可没。在接下来的开发中,带着这系列博客的总结去编码,收获还会更多,步步进阶,时刻分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值