【问题标题】:Ejb Timer implementationEjb 定时器实现
【发布时间】:2016-05-27 10:16:13
【问题描述】:

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

例如:

@TimeOut
public void myTmer() {}

@TimeOut
public void myTmer12() {}

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

【问题讨论】:

  • 首先,你想对你的计时器施加什么重复?

标签: jakarta-ee timer ejb


【解决方案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 类。

【讨论】:

  • 如果比我在每个 bean 中定义 5 个程序计时器比我定义的每个程序计时器将只在相应的 bean 中执行超时方法?
  • @AnilAcharya 确切地说,每个程序计时器创建对应于该 bean 中的单个超时方法。同时,您可以在同一个 bean 中创建多个计时器,但每次计时器到期时只会触发一个超时方法
  • 嗨@AnilAcharya 如果这个或任何答案已经解决了您的问题,请考虑通过单击复选标记接受它。这向更广泛的社区表明您已经找到了解决方案。没有义务这样做。
【解决方案2】:

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

@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找到。

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多