下面例子在session bean 中定义了一个定时器,定时器每个3秒钟触发一次事件,当定时事件触发次数超过5次的时候便终止定时器的执行。 1. TimerServiceDao.java (接口) package com.foshanshop.ejb3; public interface TimerServiceDao { public void scheduleTime (long milliseconds); } //end interface 2. TimerServiceBean.java package com.foshanshop.ejb3Impl; import java.util.Date; import javax.annotation.Resource; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerService; import com.foshanshop.ejb3.TimerServiceDao; @Stateless @Remote(TimerServiceDao.class) public class TimerServiceBean implements TimerServiceDao{ private static int count = 0 ; @Resource private TimerService timerService ; //直接注入定时服务 @Override public void scheduleTime(long milliseconds) { if(count == 0){ count = 1 ; timerService.createTimer( new Date(new Date().getTime() + milliseconds), milliseconds, "我的第一个定时器"); } } /** * 创建定时器后还需要添加定时事件的回调方法。 * 回调方法使用@javax.ejb.Timeout注释标注, * 必须返回void,并接受一个javax.ejb.Timer类型的参数。 * @param timer */ @Timeout public void timeoutHandler(Timer timer){ System.out.println("--------------第"+count+"次----------------------"); System.out.println("定时器事件发生,传进的参数为:" + timer.getInfo()); if(count >= 5){ timer.cancel(); //如果定时器触发5次便终止定时器 count = 0 ; }else{ count ++ ; } } } //end bean 3.index.jsp <%@ page import="java.util.*" pageEncoding="UTF-8" language="java"%> <%@ page import="com.foshanshop.ejb3.*,javax.naming.*" %> <html> <head> <title>测试Timer<title> </head> <body> <% try{ InitialContext ctx = new InitialContext(); TimerServiceDao timer = (TimerServiceDao) ctx.lookup("TimerServiceBean/remote"); timer.scheduleTime((long)3000); out.println("定时器已经启动,请观察Jboos控制台输出,如果定时器触发5次,便终止定时器。"); } catch(Exception e){ out.println(e.getMessage()); } %> </body> </html> //end jsp 通过注入@Resource private TimerService timerService ,我们获得了TimerService对象,调用TimerService create Timer(Date arge0, long arge1,Serializable arg2)方法创建定时器,三个参数的含义如下: Date org0 : 定时器启动时间,如果传入事件小于现在时间,定时器会立刻启动。 Long org1 : 间隔多长事件后再次触发定时事件。 单位:毫秒 Serializable arg2 :传给定时器的参数,该参数必须实现Serializable 接口。 当定时器创建后,还需要提那家定时事件的回调方法。回调方法使用@javax.ejb.timeout注释标注,必须返回void,并接受一个javax.ejb.Timer类型的参数,回调方法声明格式如下: Void XXXX(Timer timer); 在定时事件发生时,此方法将执行。 3. build.xml <?xml version="1.0"?> <project name="war" default="war" basedir="."> <target name="war" description="创建WEB发布包"> <war warfile="${basedir}/my.war" webxml="${basedir}/WEB-INF/web.xml"> <fileset dir="${basedir}"> <include name="**"/> <exclude name="build.xml" /> <exclude name="/WEB-INF/web.xml" /> </fileset> </war> </target> </project> //end build.xml