EJB之Timer

EJB Timer

  • 要么: Annotation @Schedule 或者方法前声明@Timeout
  • 要么: 在部署描述中定义timeout-method
  • 如果是使用@Schedule, Timer在一个ejb中可以支持多个,如:

@Schedule(second="*/2", minute="*",hour="*", persistent=false,info="timer1")
    public void doWork(){
        System.out.println( "Hi from the EJB timer example!" );
    }

@Schedule(second="*/1", minute="*",hour="*", persistent=false,info="timer2")
    public void doWork2(){
        System.out.println( "Hi .... 2nd timer!" );    
    }
以上分别启动了2个timer,一个每隔2秒执行一次,一个每隔1秒执行一次. 执行时container做了并发访问控制.也就是说callback方法一个时刻只能执行一个方法.

  • 如果是使用@Timeout, 也就是Programmatic Timers, callback方法有且只有一个.

All timers created via one of the TimerService timer creation methods for a particular component use a single timeout callback method. --From ejb spec 3.1 chapter 18
如果前一个调用没有完成,而后面的timer过来了,则后面的timer会等待(也就是在等锁). 如下:

09:20:59,045 ERROR [org.jboss.as.ejb3] (EJB default - 2) JBAS014122: Error during retrying timeout for timer: [id=c2a31520-2c55-4b01-b362-d8dfdb73a2d0 timedObjectId=jboss-ejb-timer.jboss-ejb-timer.TimeoutExample auto-timer?:false persistent?:false [email protected]86ae8 initialExpiration=Tue Mar 29 09:20:48 CST 2016 intervalDuration(in milli sec)=0 nextExpiration=null timerState=RETRY_TIMEOUT: javax.ejb.ConcurrentAccessTimeoutException: JBAS014373: EJB 3.1 PFD2 4.8.5.5.1 concurrent access timeout on [email protected] - could not obtain lock within 5000MILLISECONDS
    at org.jboss.as.ejb3.concurrency.ContainerManagedConcurrencyInterceptor.processInvocation(ContainerManagedConcurrencyInterceptor.java:100) [jboss-as-ejb3-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]

后面的timer等待5秒后, 还会retry一次(JBoss的实现). 如果还是timeout,则会放弃.

TimerService的createSingleActionTimer()和createIntervalTimer()

  • createSingleActionTimer

只触发一次,如果触发时等不到锁,timeout, 则如上所述,再试一次,如果还不行,直接放弃。

  • createIntervalTimer

周期性触发,到点触发发现上一个还没搞完,则直接skip,放弃了,接着等下一个,如下code

@Timeout
    public void scheduler(Timer timer) {
        System.out.println("EJB Timer: Info=" + timer.getInfo() + " " + Thread.currentThread().getName());

//added by xilun
        try {
            Thread.sleep(1000*30);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

//
    @PostConstruct
    public void initialize( InvocationContext ctx ) {
        //...
        timerService.createIntervalTimer(2000, 10*1000, new TimerConfig("Single Timer #2", false));
        //....
    }

输出的log如下:
10:21:47,864 INFO  [stdout] (EJB default - 7) EJB Timer: Info=Single Timer #2 EJB default - 7

10:21:57,864 WARN  [org.jboss.as.ejb3] (EJB default - 9) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:21:57 CST 2016
10:22:07,864 WARN  [org.jboss.as.ejb3] (EJB default - 6) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:22:07 CST 2016
10:22:17,864 WARN  [org.jboss.as.ejb3] (EJB default - 8) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:22:17 CST 2016
10:22:27,865 INFO  [stdout] (EJB default - 3) EJB Timer: Info=Single Timer #2 EJB default - 3

10:22:37,864 WARN  [org.jboss.as.ejb3] (EJB default - 10) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:22:37 CST 2016
10:22:47,864 WARN  [org.jboss.as.ejb3] (EJB default - 2) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:22:47 CST 2016
10:22:57,864 WARN  [org.jboss.as.ejb3] (EJB default - 1) JBAS014143: A previous execution of timer [jboss-ejb-timer.jboss-ejb-timer.TimeoutExample 8ba38f5a-0da7-4993-8b0b-e69854f61ee4] is still in progress, skipping this overlapping scheduled execution at: Tue Mar 29 10:22:57 CST 2016

Jboss quickstart中有timer的例子。

时间: 2024-11-05 14:58:08

EJB之Timer的相关文章

EJB3.0 定时服务:Timer Service

定时服务用作在一段特定的时间后执行某段程序 使用容器对象SessionContext创建定时器,并使用@Timeout 注释声明定时器方法 通过依赖注入@Resource SessionContext ctx,获得SessionContext对象,调用ctx.getTimerService().createTimer(Date arg0, long arg1, Serializable arg2)方法创建定时器, 当定时器创建完成后,还需声明定时器方法.定时器方法的声明很简单,只需在方法上面加入

记录在Sungard工作时对ejb3.1的研究(2)--ejb3 集群(ejb timer/MDB)

以前和人家谈论sungard的工作时,总是被质疑:"你们还在使用ejb啊?太老了吧". "早就是spring的年代了". 我总是反击,你们真的了解ejb吗?了解ejb在分布式应用里集群部署和spring比较有多方便吗?不要总是把什么IOC, AOP肤浅的挂在嘴上, 现在早已不是ejb2的时代了. ejb3 dependency injection也很容易,除了在非javaee容器管理的资源里受限(需要借助javaee6 CDI). AOP?ejb也有intercep

小心陷阱: 迁移应用到Cluster遇到的Timer问题

最近Customer Site报了一个错误,在Weblogic Cluster HA测试过程中,发生了Traffic集群中有一个节点在重启过程中仍然有请求数据送到该节点的问题.研究了相关的代码,发现了一个非常有趣又普遍的问题. 由于Traffic分发系统没有部署在Weblogic集群中,又需要分发到Weblogic集群中的Traffic节点,系统中使用了自己的load balancing机制. 代码中负责traffic分发的loadbalancer从Cluster当中部署的ClusterWebA

EJB学习随手笔记

名词: 注解方式: @persistenceContext:持续.存留:环境.上下文: @Stateless: 无状态(无权的) @Remote:  远程接口 一.EJB接口 remote和local的? 二.(Enterprice JavaBeans )EJB基础知识: ①EJB是一个用于分布式业务应用的标准服务端组件模型.采用EJB架构编写的应用是可伸的.事务性的.多用户安全的.一次编写这些应用, 然后部署在任何支持EJB规范的服务器平台,如:JBOSS/WEBLOGIC. ②EJB定义了三

PIC32MZ tutorial -- 32-bit Timer

The microcontroller is PIC32MZ2048ECH144 on the PIC32MZ EC Starter Kit. This microcontroller has four 32-bit synchronous timers are available by combining Timer2 with Timer3, Timer4 with Timer5, Timer6 with Timer7, and Timer8 with Timer9. The 32-bit

Timer和TimeTask简介

Timer和TimeTask简介 Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java . util . TimerTask ; public class MyTask extends TimerTask { private in

【J2EE浅析】——EJB

一.EJB概述 EJB(EnterpriseJava Bean)--java企业Bean,是J2EE十三种规范的一部分,为服务器端组件模型,设计目标与核心应用是部署分布式应用程序.EJB是java的核心代码,包括三种Bean类型:会话Bean(Session Bean),实体Bean(EntityBean)和消息驱动Bean(MessageDriven Bean). 通俗的说,EJB就是一个运行在独立的服务器上,封装了业务逻辑的组件.在一个商务软件中,核心部分就是其业务逻辑,它抽象了整个商务过程

EJB概述

Ejb(Enterprise JavaBeans)是使用java语言构造可移植的.可重用的和可伸缩的业务应用程序的平台. 从开发者的角度,EJB是在称为EJB容器的特定运行时环境中执行的一段java代码,容器提供若干组件服务. EJB组件有三种类型:会话bean.消息驱动bean和实体bean.会话bean和消息驱动bean用于实现EJB应用程序中的业务逻辑,而实体用于持久化. 容器以非常优雅的方式为EJB组件提供服务:当容器部署EJB时,通过指定要添加的服务类型,使用元数据注解预配置EJB.元

duilib 界面库 实现timer定时器

看了大神介绍的duilib感觉已被同龄人狠狠地甩在背后.所以痛下决心,之后要多花时间写代码. 大神教程传送门: http://www.cnblogs.com/Alberl/p/3341956.html 现在的问题是想基于duilib实现一个timer定时器.工程基础大概是在 http://www.cnblogs.com/Alberl/p/3343763.html 因为自己的东西是基于大神的东西写的,所以要把大神的教程看得差不多才知道我在说什么.O(∩_∩)O~~ 前台大概长这个样子: 稍微修改了