在 EJB 3.1 中,我可以在为该 bean 获得的 TimerService 实例上使用 TimerService#getTimers() 获取特定 bean 的所有计时器。
然而,我真正需要的是一个系统范围的版本。 IE。我想要一个 EJB 容器中所有计时器的列表。
这样的事情可能吗?
最佳答案
EJB 3.1 中根本没有用于此的官方 API。
如果您只使用注解和/或接口(interface)来标记超时方法,您可以对类路径上的所有类进行运行时遍历,并检查此注解或接口(interface)是否存在。这至少会给你理论上可以有与之关联的计时器的bean。
不幸的是,这仍然不会为您提供这些 bean 的实际计时器。在 EJB 3.1 中,只能从 session 上下文中请求时间信息,您似乎已经知道, session 上下文对于每个 bean 都是私有(private)的。这意味着只有 bean 本身才能看到它有哪些计时器。
作为 Nayan 建议的替代方案,您可以让您的 bean 实现一个为您提供此信息的方法。然后,您可以使用接口(interface)或自定义注释标记此方法。
在系统范围内扫描所有计时器类时,您首先尝试发现所有可以与它们关联的计时器的 bean,然后尝试查找它们是否具有所需的注释或接口(interface)。如果他们没有后一种情况,您可以记录警告。这种方法的优点是计时器不太可能从裂缝中溜走。
另一种方法,但非常脆弱,是侵入容器保存的任何私有(private)结构来存储计时器信息。对于持久计时器,至少有可以检查的持久存储,并且容器中的某处必须有您所追求的结构。它必须在那里,因为容器本身必须意识到这一点。通常一个容器有一些私有(private)的 API 来达到这个目的,你可以通过反射技巧来破解它。
也可能是容器为此提供了专有的 API。例如。在 Java EE 5 中,不可能在 Servlet 容器中进行编程登录,但 JBoss AS 有一个专有的 API 可以让您做到这一点。
关于ejb - 如何获取所有 EJB 计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530275/