ejb - 如何获取所有 EJB 计时器?

标签 ejb ejb-3.1

在 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/

相关文章:

java - 新事务是否分离所有以前的实体?

java - EJB 访问有状态 session Bean NameNotFoundException

java - TomEE 中的 ManagedScheduledExecutorService

java - Weblogic 无法查找 EJB

java - Quartz 作业中的 Websphere JNDI 查找失败

java - 哪种 bean 类是可注入(inject)的?

java - 使用 mockito 将模拟注入(inject)抽象类

transactions - Jedis/Redis 的容器管理事务

jakarta-ee - @Singleton @Startup @PostConstruct 方法保证在 EJB 可用于客户端调用之前返回?

java - EJB 3.1 session Bean 中的 Jackrabbit