如何将无状态EJB方法公开为MBean(在Jboss上)?

时间:2010-02-08 12:44:58

标签: java ejb-3.0 jmx

我有一个无状态EJB(3),它使用内部缓存,每24小时自动刷新一次。我想公开一个MBean方法,以便能够通过Jboss 4.2上的JMX控制台强制缓存过期甚至缓存重新加载此EJB。

有人可以分享如何编码此方案的示例吗?在创建自己的bean时,我对JMX完全不熟悉。

我应该创建一个调用EJB的MBean,还是可以通过在EJB本身上使用注释将特定的EJB方法公开为Mbean接口?

EJB看起来像这样:

@Stateless
@Local(BusinessCalendar.class)
public class BusinessCalendarBean implements BusinessCalendar {

    synchronized private LocalDateKitCalculatorsFactory getCalculatorFactory() {

        LocalDateKitCalculatorsFactory ldkc = (LocalDateKitCalculatorsFactory) CacheService.get(CACHE_KEY);

        if (ldkc == null) {
            ldkc = getCalculatorFactory();
            CacheService.put(CACHE_KEY, ldkc);
        }

        return ldkc;

    }

    public function expireCache() {
         // I would like to expose this as JMX managed method
    }

    ...

}

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

更新:

这对于WildFly 10 +,jBOSS EAP 6.x或7.x肯定有效。但是我怀疑这些机制不再是专有的,并且在其他应用服务器中也将非常相似。

当JavaEE 6标准化Singletons时,删除了JBoss特定的注释@Service / @Management。一个MBean(总是一个单例,以便所有JMX客户端在应用程序范围内都能看到相同的一致JMX数据)成为通过JMX公开的EE6 +单例,如下所示:

  • 定义一个名称以“ ... MXBean”结尾的接口(必填)
  • 创建一个实现该接口的@Singleton和@Startup类
  • 定义@PostConstruct和@PreDestroy方法以注册/注销MBean

注册/注销代码如下:

objectName = new javax.management.ObjectName("com.acme.example.jmx:type=" + this.getClass().getName());
platformMBeanServer = java.lang.management.ManagementFactory.getPlatformMBeanServer();
platformMBeanServer.registerMBean(this, objectName);

在“ ... MXBean”接口中定义的getter / setter成为JMX属性,其他方法映射到JMX Specifications在“词法设计模式”下​​指定的操作