EJB---->定时服务(Timer Service)
定时服务用作在一段特定的时间后执行某段程序,定时服务的开发过程与会话Bean 的开发过程大致相同,但比会话Bean 多了几个操作,那就是使用容器对象SessionContext 创建定时器,并使用@Timeout 注释声明定时器方法。
下面定义一个每隔3 秒触发一次事件的定时器,当定时事件触发次数超过5 次的时候便终止定时器的执行。
package com.foshanshop.ejb3.impl; import java.util.Date; import com.foshanshop.ejb3.TimerService; import javax.annotation.Resource; import javax.ejb.Remote; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; @Remote ({TimerService.class}) public class TimerServiceBean implements TimerService { private int count = 1; private @Resource SessionContext ctx; public void scheduleTimer(long milliseconds){ count = 1; ctx.getTimerService().createTimer(new Date(new Date().getTime() + milliseconds),milliseconds, "大家好,这是我的第一个定时器"); } @Timeout public void timeoutHandler(Timer timer) { System.out.println("---------------------"); System.out.println("定时器事件发生,传进的参数为: " + timer.getInfo()); System.out.println("---------------------"); if (count>=5){ timer.cancel();//如果定时器触发5次,便终止定时器 } count++; } }
通过依赖注入@Resource SessionContext ctx,我们获得SessionContext 对象,调用ctx.getTimerService().createTimer(Date arg0, long arg1, Serializable arg2)方法创建定时器,三个参数的含义如下:
Date arg0 定时器启动时间,如果传入时间小于现在时间,定时器会立刻启动。
long arg1 间隔多长时间后再次触发定时事件。单位:毫秒
Serializable arg2 你需要传给定时器的参数,该参数必须实现Serializable 接口。
当定时器创建完成后,我们还需声明定时器方法。定时器方法的声明很简单,只需在方法上面加入@Timeout 注释,另外定时器方法必须遵守如下格式:
void XXX(Timer timer)
在定时事件发生时,此方法将被执行。
Date arg0 定时器启动时间,如果传入时间小于现在时间,定时器会立刻启动。
long arg1 间隔多长时间后再次触发定时事件。单位:毫秒
Serializable arg2 你需要传给定时器的参数,该参数必须实现Serializable 接口。
当定时器创建完成后,我们还需声明定时器方法。定时器方法的声明很简单,只需在方法上面加入@Timeout 注释,另外定时器方法必须遵守如下格式:
void XXX(Timer timer)
在定时事件发生时,此方法将被执行。
TimerServiceTest.jsp
<%@ page contentType="text/html; charset=GBK"%> <%@ page import="com.foshanshop.ejb3.*, javax.naming.*"%> <% try { InitialContext ctx = new InitialContext(); TimerServiceDAO timer = (TimerServiceDAO) ctx.lookup("TimerServiceBean/remote"); timer.scheduleTimer((long)3000); out.println("定时器已经启动,请观察Jboss控制台输出,如果定时器触发5次,便终止定时器 "); } catch (Exception e) { out.println(e.getMessage()); } %>