【问题标题】:Why should we use @Startup for timer service in EJB?为什么我们应该在 EJB 中使用 @Startup 进行定时器服务?
【发布时间】:2021-06-26 15:27:44
【问题描述】:

我的服务是:

@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class JobTest {

    @Resource
    private TimerService timerService;

    @PostConstruct
    public void init() {
        timerService.createTimer(0,1000, "Every second timer with no delay");
    }

    @Timeout
    public void execute() {
        System.out.println("execute your job here");
    }

}

但是,作业没有执行。但是当将@Startup 添加到服务时,代码会按预期运行。你能解释一下为什么我们需要@Startup 来使用 timerService 资源吗?

【问题讨论】:

    标签: timer ejb scheduling java-ee-8


    【解决方案1】:

    EJB 容器不会创建托管 bean 的实例,除非这些实例正在被查找、注入或使用 @Startup 注释。使用@PostConstruct 注释的方法从不为问题中的 EJB 调用,因此从不创建计时器,因此不会发生回调。

    如果您必须使用以编程方式创建的计时器(由于来自配置的延迟值),您需要强制进行急切初始化 - 通过使用 @Startup 注释 bean 或注入它进入另一个@Startup bean。

    另一种选择是通过使用@Schedule 注释来注释方法来使用automatically created timers,尽管在这种情况下计时器配置是硬编码的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2018-09-04
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多