2013-09-13 6 views
0

Я хочу создать Bean с использованием аннотаций Spring и без какой-либо конфигурации XML. У меня есть что-то вроде public class WebAppInitializer implements WebApplicationInitializer, которые загружают весь контекст приложения.MBean в JMX JConsole с использованием Spring без XML

у меня боб как класс:

@ManagedResource(objectName = "myBean.example:name=MonitoringService") 
@Component 
public class MonitoringService implements IMonitoringService { 

    public static final Logger LOG = LoggerFactory.getLogger(MonitoringService.class); 

    private boolean isDbServicesEnabled = true; 

    @ManagedAttribute(description = "DBServices configurator") 
    public boolean isDbServicesEnabled() { 
     return isDbServicesEnabled; 
    } 

    @ManagedAttribute(description = "DBServices configurator") 
    public void setDbServicesEnabled(boolean dbServicesEnabled) { 
     LOG.info("DBServices " + (isDbServicesEnabled ? "enabled" : "disabled")); 
     isDbServicesEnabled = dbServicesEnabled; 
    } 

} 

и простой интерфейс:

public interface IMonitoringService { 

    public boolean isDbServicesEnabled(); 
    public void setDbServicesEnabled(boolean dbServicesEnabled); 

} 

Я разворачивать его на GlassFish 3 сервера и все работает нормально, но я не могу видеть его JConsole. Где проблема?

Я также использую SimonMXBeanManager для статистики, и это обертка работает нормально.

Нужно ли регистрировать его в MBeanServer?

Это класс для конфигурации SimonManager:

@Configuration 
public class MonitoringConfiguration { 

@Bean 
public Manager simonManager() throws Exception { 
    ManagerFactoryBean managerFactoryBean = new ManagerFactoryBean(); 
    Callback jmxRegisterCallback = new JmxRegisterCallback(mBeanServer(), "myBean.example"); 
    managerFactoryBean.setCallbacks(Lists.newArrayList(jmxRegisterCallback)); 
    return managerFactoryBean.getObject(); 
} 

@Bean 
public SimonManagerMXBeanWrapper simonManagerMXBean() throws Exception { 
    return new WebApplicationSimonManagerMXBeanWrapper(new SimonManagerMXBeanImpl(simonManager())); 
} 

@Bean 
public MBeanServer mBeanServer() { 
    MBeanServerFactoryBean mBeanServerFactoryBean = new MBeanServerFactoryBean(); 
    mBeanServerFactoryBean.setLocateExistingServerIfPossible(true); 
    mBeanServerFactoryBean.afterPropertiesSet(); 
    return mBeanServerFactoryBean.getObject(); 
} 

@Bean 
public AnnotationMBeanExporter annotationMBeanExporter() { 
    return new AnnotationMBeanExporter(); 
} 

@ManagedResource(objectName = "myBean.example:name=SimonManager") 
private class WebApplicationSimonManagerMXBeanWrapper extends SimonManagerMXBeanWrapper     { 

    public WebApplicationSimonManagerMXBeanWrapper(SimonManagerMXBean delegate) { 
     super(delegate); 
    } 
} 

и класс, который загружает контекст приложения:

public class WebAppInitializer implements WebApplicationInitializer { 

String[] locations = new String[] { 
    "myBean.example" 
}; 

public void onStartup(ServletContext container) throws ServletException { 

    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
    rootContext.register(
     RootContextConfig.class 
    ); 
    rootContext.scan(locations); 
    rootContext.refresh(); 

    container.addListener(new RequestContextListener()); 
    container.addListener(new ContextLoaderListener(rootContext)); 

    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
    dispatcherContext.register(WebAppConfig.class); 

    ServletRegistration.Dynamic dispatcher = container.addServlet(
     "dispatcher", new DispatcherServlet(dispatcherContext) 
    ); 

    dispatcher.setLoadOnStartup(1); 
    dispatcher.addMapping("/"); 

    createSimonWebConsole(container); 
} 

private void createSimonWebConsole(ServletContext container) { 
    ServletRegistration.Dynamic dn = 
     container.addServlet("simon-webconsole", new SimonConsoleServlet()); 
    dn.setInitParameter("url-prefix", "/javasimon-console"); 
    dn.addMapping("/javasimon-console/*"); 
} 

}

ответ

0

Ok, я понял, что я должен добавить @ComponentScan аннотация с "myBean.example" пространство имен до класса MonitoringConfiguration. Теперь я могу настроить свои услуги в JConsole.

Смежные вопросы