我们目前正在将一些项目从JBoss 4.x迁移到JBoss 7。到目前为止,除了我们通常使用的MBeans以提供简单管理操作之外,似乎一切正常。
我已经搜索了相当长的时间,但是要么我无法想出正确的搜索术语,要么我缺少某个知识点来弥合JBoss 4.x和JBoss 7之间的差距。
因此,希望有人能够提供提示,告诉我可能缺少什么或者我需要阅读哪些文档、示例等等。
在Jboss 4.x中,我们的MBeans通常看起来像这样:
@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的端口) -为方法/参数提供描述
更新:
首先,我找到了这个投影,它使用CDI来包装任何被相应注释的bean的注入目标,并在
postConstruct()
方法中进行JMX注册:http://code.google.com/p/jmx-annotations/。此外,扫描找到的MBeans会查找提供有关注释属性说明的类/属性/方法/参数注释。然而,
postConstruct()
方法似乎不会对EJBs进行调用(我认为这是为了不与EJB容器冲突)。因此,MBeans现在不应该是EJBs,而是普通的CDI beans。这个方法的缺点是MBeans不会自动实例化。为了解决这个问题,在启动时有一个单例bean循环遍历
BeanManager
中的所有bean,并创建每个找到的MBean的实例。因为MBeans仍然有它们的注入目标,所以它的postConstruct()
方法将被调用,并且该bean将被注册到MBean服务器中。以下是启动过程的大致概述:
-自定义CDI扩展程序扫描每个CDI bean以获取自定义@MBean注释 -对于每个符合条件的MBean,都会包装注入目标 -一个单例bean将会启动,它的@PostConstruct方法将创建MBean的实例 -MBean的注入目标的
postConstruct()
方法将被调用,因此MBean将被注册到MBean服务器中此方法的一个缺点是在执行MBean方法时缺少事务上下文(任何EJB调用都将在事务上下文中运行)。但是,如果需要,可以使用CDI拦截器来提供事务上下文,Seam项目似乎有适当的拦截器。
我仍然不确定这是否是一个稳健和可靠的方法,因此欢迎任何建设性的评论、提示等。