Search code examples
javajakarta-eeejb-3.0weblogicweblogic11g

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.


Solution

  • I'm not 100% sure but I think that the bean class must implement javax.ejb.TimedObject or have a method annotated with @Timeout to use EJB timers. Example:

    @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);
            }
        }
    
        @Timeout
        @TransactionAttribute(value=REQUIRES_NEW)
        public void timeoutCallback(Timer timer) {
            ...
        }
    
    }
    

    Does WebLogic still complain with the above code?

    PS: In any case, the error you currently get is very poorly reported, you should probably open a case.