Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use @PostConstruct to create timers in a stateless bean EJB3?

I want to create a timer EJB3 when a stateless bean is created in the pool. But if I use @PostConstruct I get the exception:

java.lang.IllegalStateException: [EJB:010193]Illegal call to EJBContext method. The bean is in "null" state. It cannot perform 'getting the Timer Service' action(s). Refer to the EJB specification for more details.

If container calls @PostConstruct, the bean ins't null. So, why I get this exception?


CLASS

@Stateless
public class TestBean implements TestLocal {

    @Resource
    TimerService timerService;

    @PostConstruct
    public void startTimer() {
        if (timerService.getTimers().size() == 0) {
            timerService.createTimer(1 * 1000, 1 * 1000, null);
        }
    }

    @Override
    public void test() {        
    }

}

INTERFACE

@Local
public interface TesteLocal {

    void test();

}

SERVLET

public class TestServlet extends HttpServlet {
    @EJB
    private TestLocal test;

    protected void doGet(....) throws .... {
        test.test();
    }
}

DETAILS

I'm using weblogic server 11g.

like image 701
Topera Avatar asked Aug 15 '10 19:08

Topera


1 Answers

You can NOT use a @PostConstruct to create a timer in a stateless bean EJB 3. See this blog How to use EJB 3 timer in a weblogic 10 cluster environment for the explanation. Even the blog was talking about weblogic, but the explanation should apply to other app servers also.

like image 57
Mike Avatar answered Oct 24 '22 06:10

Mike