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