EJB3 TimerService
EJB3 的计时器服务相对简单,此服务允许在指定时间间隔后自动调用某方法,当指定的时间到期时容器就会调用超时方法(即Timeout注解的方法)。TimerService只能在无状态Session bean和MDB中使用,因为它们是异步和无状态的。
下面举例说明(服务器为JBoss5.0.1):
1.建立一接口和Session Bean
- public interface ITimerService {
- public void scheduleTimer(long milliseconds);
- }
- @Stateless
- @Remote(ITimerService.class)
- public class TimerServiceBean implements ITimerService {
- private static int count = 0;
- @Resource
- private SessionContext sc;
- public void scheduleTimer(long milliseconds) {
- TimerService timerService = sc.getTimerService();
- timerService.createTimer(5000, milliseconds, "EJB Timer");
- }
- @Timeout
- public void timeoutHandler(Timer timer) {
- System.out.println("count=" + count + " get Info : " + timer.getInfo());
- if (count >= 3) {
- timer.cancel();
- } else {
- count++;
- }
- }
- }
有几点需要说明一下:
(1).获取TimerService有两种方式,除上面的通过EJB上下文方式获取以外,还可以通过EJB资源直接注入计时器服务:
- @Resource
- private TimerService timerService;
如果已经注入了EJB上下文,则第一种较为合适,因为这样就不需要再注入计时器服务了。否则使用第二种更好。
(2)一个bean只能有一个超时方法(即@Timeout方法)
(3)cancel():终止计时器。
(4)上面的createTimer()方法参数参考:
- public Timer createTimer(long initialDuration,
- long intervalDuration,java.io.Serializable info)
表示在initialDuration(ms)后第一次触发,然后每间隔intervalDuration(ms)后重复。其中的info可通过getInfo()方法获取,表示创建Timer时的附加信息。
将上面两个class文件打包发布成一个ejb-jar文件进行部署。
为了测试刚才发布的EJB是否能正确调用,写一测试类:
- public class TimerServiceTest {
- public static void main(String[] args) {
- try {
- Context ctx = new InitialContext();
- ITimerService timer = (ITimerService) ctx.lookup("TimerServiceBean/remote");
- timer.scheduleTimer(3000);
- } catch (NamingException e) {
- e.printStackTrace();
- }
- }
- }
posted on 2013-02-25 11:23 pretty_pretty_fish 阅读(318) 评论(0) 编辑 收藏 举报