代码之家  ›  专栏  ›  技术社区  ›  Sergey Mikhanov

如何获取有关EJB部署的通知(设置计时器)?

  •  9
  • Sergey Mikhanov  · 技术社区  · 15 年前

    我正在部署一个EJB,它应该设置一个计时器,并且每隔24小时触发一次。但是我应该在哪里设置计时器呢? @PostConstruct 不起作用——这是一个会话bean,因此在创建实际实例时将调用post-construction方法(这永远不会发生,因为此bean的唯一目的是跟踪计时器)。

    有没有其他方法来获取关于bean部署(而不是实例化)的通知,以便在那里设置计时器?

    谢谢

    3 回复  |  直到 15 年前
        1
  •  5
  •   mjn anonym    15 年前

    EJB3.1介绍了 Singleton bean . 它将在EJB的Deplyon中创建。

    @Singleton
    @Startup
    public class TimerSessionBean {
    
        @Resource
        TimerService timerService;
    
        @PostConstruct
        public void startTimer() {
            Logger.getLogger(getClass().getName()).log(Level.INFO,
                    timerService.getTimers().size() + " timers running");
    
            Logger.getLogger(getClass().getName()).log(Level.INFO, "create a timer");
    
            timerService.createTimer(10000, 10000, "a timer");
        }
    
        @Timeout
        void doSomething(Timer timer) {
            System.out.println("something");
        }
    }
    

    EJB3.1中另一个可用于定期运行任务的新特性是 Schedule annotation .

        2
  •  3
  •   fvu    15 年前

    我认为最简单和最可移植的解决方案是使用上下文监听器将Web应用程序添加到企业应用程序中。( contextInitialized event )初始化EJB。

    顺便说一句,Quartz调度器也差不多这么做(Quartzinitializerlistener类)

        3
  •  1
  •   Sergey Mikhanov    15 年前

    我发现的解决方案很难看,但和任何其他解决该问题的法律解决方案一样难看(例如,来自@fvu的解决方案)。应用 @WebService bean的注释使得jboss在部署后立即实例化它(因为它需要构造bean的WSDL的方法),所以 @PostConstruct -将调用标记的方法。我可以在那里设置计时器。