开发者

How to get notification about EJB deployment (to set up a timer)?

I'm deploying an EJB which should set a timer and be triggered by it every 24 hours. But where should I set the timer? @PostConstruct does not help -- this is a session bean, so post-construct method will be invoked when the actual instance is created (this never happens as t开发者_运维问答he sole purpose of this bean is to track timer).

Is there any other way to get notification about the bean deployment (not instantiation) in order to set up timer there?

Thanks


EJB 3.1 introduces the Singleton bean. It will be created at deplyoment of the EJB.

@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");
    }
}

Another new feature in EJB 3.1 which can be used to run a task periodically is the Schedule annotation.


I think that the easiest and most portable solution is to add a web-application to your enterprise-application with a context listener (contextInitialized event) that initializes the ejb.

By the way, that's more or less what the Quartz Scheduler does as well (class QuartzInitializerListener)


The solution I found is ugly, but just as ugly as any other legal solution to this problem (e.g. solution from @fvu). Applying @WebService annotation to the bean make JBoss instantiate it immediately after deployment (because it needs the way to construct the bean's WSDL), so @PostConstruct-marked method will be invoked. I was able to set a timer from there.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜