Ejb Timer实现

时间:2016-02-16 08:29:24

标签: java-ee timer ejb

如何使用程序化计时器在EJB中运行特定的超时方法?

例如:

@TimeOut
public void myTmer() {}

@TimeOut
public void myTmer12() {}

我只希望在计时器到期时触发mytimer()方法。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

作为程序化计时器的示例,您可能具有以下内容:

@LocalBean
@Singleton
@Startup // this timer bean will start on server startup
public class MyTimerBean {

    // injection of the TimerService interface
    @Resource
    private TimerService timerService;

    // on the post construct method one creates the timer
    @PostConstruct
    private void init() {
        // creation of a timer whose first expiration occurs after a specified 
        // duration (1s), and whose subsequent expirations occur after 
        // a specified interval (2s)
        timerService.createTimer(1000, 2000, "MyTimer");
    }

    @Timeout
    public void timeout(Timer timer) {
        System.out.println("Hi from " + timer.getInfo());
    }
}

需要考虑的一些要点:

  • 还有其他类型的计时器可以实例化(见here);
  • 除了以编程方式创建计时器之外,您还可以使用@Schedule注释自动执行此操作;
  • 可以找到完整的文档here

答案 1 :(得分:1)

您提供的代码示例无效,您将永远不会遇到程序化计时器。因为在这种情况下,bean可以具有最多一个超时方法。正如EJB规范中提到的,第18.2.5.1节:

  

...如果bean实现TimedObject接口,Timeout   注释或timeout-method部署描述符元素只能是   用于指定ejbTimeout方法。一个bean可以有最多一个   处理程序化计时器的超时方法。

顺便说一下,不是The Java EE 6 Tutorial中指定的自动定时器的情况:

  

自动计时器由企业的EJB容器创建   包含使用@Schedule@Schedules注释的方法的bean   注释已部署。企业bean可以具有多个   自动超时方法,与程序计时器不同,它允许   仅使用@Timeout注释注释的一个方法   企业bean类。