【问题标题】:Using EJB Timer Service使用 EJB 定时器服务
【发布时间】:2012-01-18 22:41:44
【问题描述】:

我尝试使用计时器服务执行一小段代码。

我在网上找不到好的示例或教程。 Oracle 的教程涵盖的内容有点太快了,以至于我无法掌握我需要的基本实用程序。我只希望它在程序启动时立即执行,然后每隔一小时执行一次。

示例计时器是什么样的?

【问题讨论】:

    标签: jakarta-ee ejb


    【解决方案1】:

    使用@Singleton @Schedule 和一个额外的@PostConstruct 在构造后直接调用该方法是最简单的:

    package com.example;
    
    import javax.annotation.PostConstruct;
    import javax.ejb.Schedule;
    import javax.ejb.Singleton;
    
    @Singleton
    public class SomeBackgroundJob {
    
        @PostConstruct
        @Schedule(hour="*/1", minute="0", second="0", persistent=false)
        public void run() {
            // Do your job here.
        }
    
    }
    

    唯一的区别是它不是在启动后每小时运行一次,而是在启动后每隔一小时运行一次。我认为这应该无关紧要?

    【讨论】:

    • 谢谢。不,没关系,它只是必须是周期性的——实际上我只是想看看它是如何完成的。虽然我已经在这个 EJB 上尝试了带有 @PostConstruct 的 @singleton 并且它没有被执行。出于某种原因,我认为从未调用过 @ postConstruct 。希望 @ 时间表能解决这个问题。
    • 只有@Singleton@PostConstruct 只有在您将其注入其他地方时才会调用它。您还需要添加 @Startup 以使其在启动时调用。但是,如果您已经拥有 @Schedule,则没有必要这样做。
    • 是的,最大的问题是我绝对不会在任何地方调用它。因此,我尝试使用计时器服务来实现调用的原因。然而,EJB 确实调用了另一个数据库管理 EJB——如果我可以调用这个 EJB!谢谢。
    【解决方案2】:

    如果您希望计时器每小时运行一次,请使用一周中的某天来容器化该小时。这是一个例子

    @Schedule(dayOfWeek = "*", hour = "*/1", persistent = false)
    public void run() {
        // Do your job here.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2014-05-08
      • 2012-01-03
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      相关资源
      最近更新 更多