我们目前正在将一些项目从 JBoss 4.x 移植到 JBoss 7。
到目前为止,一切似乎都工作正常,除了 MBean 之外,我们通常使用 MBean 来提供简单的管理操作。
我已经搜索了很长一段时间,但要么我无法提出正确的搜索词,要么我缺少一些知识来弥合 JBoss 4.x 和 JBoss 7 中 MBean 定义之间的差距。
因此,希望有人可以提供一些提示,告诉我可能缺少什么或我必须阅读的内容(也许是一些文档、示例等)
在 Jboss 4.x 中,我们的 MBean 通常如下所示:
@Service( objectName = "Domain:Name=SomeMBean",
xmbean="resource:<path-to-xmbean.xml>")
class SomeMBean
{
@EJB
private SomeService someService;
public String someOperation()
{
someService.doSomething();
return "success";
}
}
我们使用了@Service
注解来定义对象名称和 xmbean 描述符,JBoss 将自动注册这些 mbean。
显然,在 JBoss 7 中@Service
注释不再存在,因此需要另一种方法。
到目前为止,我设法向平台 mbean 服务器手动注册 MBean,但我更希望 JBoss 自动执行此操作。此外,到目前为止我还没有设法提供方法/参数的描述(尽管这些是一个很好的功能)。
为了清楚起见,我将重复这个问题:
如何在 JBoss 7 (Java EE 6) 中定义提供以下功能的 MBean?
- 自动部署
- 访问 EJB
- 可通过 JConsole 或 JMX-Console 访问(我目前正在使用 Dimitris Andreadis 的端口)
- 提供方法/参数的描述
Update
这是我到目前为止得到的:
首先,我找到了这个投影,它使用 CDI 来包装相应注释的任何 bean 的注入目标,并在postConstruct()
方法:http://code.google.com/p/jmx-annotations/ http://code.google.com/p/jmx-annotations/。此外,还会扫描找到的 MBean 中的类/属性/方法/参数注释,这些注释提供带注释的属性的描述。
但是,那postConstruct()
似乎没有为 EJB 调用该方法(我认为这是为了不与 EJB 容器发生冲突)。因此,MBean 现在不应该是 EJB,而应该是普通的 CDI bean。
然而,它的缺点是 MBean 不会自动实例化。为了克服这个问题,有一个单例 bean,在启动时循环遍历BeanManager
并为找到的每个 MBean 创建一个实例。因为 MBean 仍然有其注入目标,所以它postConstruct()
方法将不会被调用,并且 bean 将在 MBean 服务器中注册。
以下是启动过程的粗略概述:
- 自定义 CDI 扩展扫描每个 CDI bean 中的自定义 @MBean 注释
- 对于每个合格的 MBean,注入目标都被包装
- 将启动一个单例 bean,该 bean 在其 @PostConstruct 方法中将创建 MBean 的实例
- the
postConstruct()
将调用 MBean 注入目标的方法,从而在 MBean 服务器中注册 MBean
此方法的一个缺点是执行 MBean 方法时缺少事务上下文(任何 EJB 调用都将在事务上下文中运行)。但是,如果需要,可以使用 CDI 拦截器来修复此问题,该拦截器将提供事务上下文。 Seam 项目似乎为此提供了合适的拦截器。
我仍然不确定这是否是一个理智且稳定的方法,因此非常欢迎任何建设性的评论、提示等。