Pergunta

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.

Foi útil?

Solução

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.

Outras dicas

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.

Container will not allow for timerService in method annotated with @PostConstruct of Stateless Session Bean. If you want to use timerService in method annotated with @PostConstruct the go for Singleton session bean(@Singleton).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top