Jakarta ee javax.ejb.TimerService如何知道调用哪个bean?
(Glassfish 3.1.2.2)如何知道要执行哪个bean 在中,我们了解到可以在企业bean中定义计时器回调:Jakarta ee javax.ejb.TimerService如何知道调用哪个bean?,jakarta-ee,ejb,Jakarta Ee,Ejb,(Glassfish 3.1.2.2)如何知道要执行哪个bean 在中,我们了解到可以在企业bean中定义计时器回调: @Timeout public void timeout(Timer timer) { System.out.println("TimerBean: timeout occurred"); } 然后我们可以像这样安排编程计时器: @Resource TimerService timerService; ... // Sets a programmatic timer
@Timeout
public void timeout(Timer timer) {
System.out.println("TimerBean: timeout occurred");
}
然后我们可以像这样安排编程计时器:
@Resource
TimerService timerService;
...
// Sets a programmatic timer that will expire in 1 minute (6,000 milliseconds):
long duration = 6000;
Timer timer = timerService.createSingleActionTimer(duration, new TimerConfig());
TimeService如何知道调用哪个bean?bean中只能有一个带注释的方法,但是它如何知道调用哪个bean呢
此
不是createSingleActionTimer
的参数,它是定义的实现,但至少有两种可行的实现策略:
根据EJB规范的§13.2: 可以为无状态会话bean、单例会话bean、消息驱动bean创建计时器[88]。 无法为有状态会话bean创建计时器[89] 对于单例会话bean,您的问题的答案是不言而喻的
对于无状态会话bean,调用哪个bean实例没有区别,因为它们没有状态。这同样适用于消息驱动bean。我现在正在查看Glassfish源代码,查看
TimerService
实现,但这对我来说似乎是一个有趣的问题,因此我将在这里分享它,以供专家深入了解。进一步考虑,它可能是在@Resource
从对象注入期间获得对象引用的。我会看看我是否能在源代码中找到它,如果这个签出结束的话。起源的故事很长很无聊,但它归结为:在DI容器中,没有什么是真正隐藏的,也没有什么是看起来的。该容器有多个注入机制,所有这些机制都是上下文感知的。容器里的所有东西都知道它在哪里。例如:向EJB提供上下文信息。同样,在一个容器中,没有任何东西是隐藏的。如果你对追踪它的路径感兴趣,你可以自己追踪它。您会注意到许多对代理和委托的引用——DI容器的主要部分。“这真的很简单很无聊。”我不知道,@kolossus。对不起,史蒂夫,我的问题不清楚。我的意思不是“无状态bean池中的哪个bean”,我的意思是“到底是哪个bean”。我可以从十几种不同的无状态bean类型中调用timerService.createSingleActionTimer
,但是既然我们没有提供调用它的bean的引用,计时器怎么知道调用哪个回调呢?谢谢Brett。这回答了我的问题,特别是“它的实现定义”。如果我真的想知道Glassfish是如何做到的,我可以自己阅读源代码。你对如何做的建议将帮助我阅读代码。