Jakarta ee javax.ejb.TimerService如何知道调用哪个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

(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 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容器将TimerService注入到bean实例中时,TimerService可以绑定到该EJB组件,因此当计时器需要启动时,它知道如何定位实例并调用timeout方法
  • 当EJB调用方法时,它可以将关于当前EJB组件和方法的元数据推送到ThreadLocal上,当在TimerService上调用方法时,它会定位当前EJB组件并基于该组件创建计时器

  • 根据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是如何做到的,我可以自己阅读源代码。你对如何做的建议将帮助我阅读代码。