如何使用 @PostConstruct 在无状态 bean EJB3 中创建计时器?

发布于 2024-09-14 14:13:30 字数 1069 浏览 7 评论 0原文

我想在池中创建无状态 bean 时创建一个计时器 EJB3。 但如果我使用@PostConstruct,我会得到异常:

java.lang.IllegalStateException:[EJB:010193]对EJBContext方法的非法调用。该 bean 处于“null”状态。它无法执行“获取定时服务”操作。有关更多详细信息,请参阅 EJB 规范。

如果容器调用 @PostConstruct,则 bean 不为 null。那么,为什么我会得到这个异常?


@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() {        
    }

}

接口

@Local
public interface TesteLocal {

    void test();

}

SERVLET

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

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

详细信息

我正在使用 weblogic 服务器 11g。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿港巷口少年归 2024-09-21 14:13:30

您不能使用 @PostConstruct 在无状态 bean EJB 3 中创建计时器。请参阅此博客 如何在 weblogic 10 集群环境中使用 EJB 3 计时器进行说明。即使博客也在谈论 weblogic,但该解释也应该适用于其他应用程序服务器。

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.

分分钟 2024-09-21 14:13:30

容器不允许在 Stateless Session Bean 的 @PostConstruct 注释的方法中使用timerService。如果你想在用@PostConstruct注释的方法中使用timerService,请使用Singleton会话bean(@Singleton)。

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).

倥絔 2024-09-21 14:13:30

我不是 100% 确定,但我认为 bean 类必须实现 javax.ejb.TimedObject 或具有用 @Timeout 注释的方法才能使用 EJB 计时器。示例:

@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) {
        ...
    }

}

WebLogic 是否仍然抱怨上述代码?

PS:无论如何,您当前收到的错误报告非常糟糕,您可能应该打开一个案例。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文