0

Here is my build.gradle...

dependencies {
    compile('org.springframework.boot:spring-boot-starter-parent:2.0.1.RELEASE')

    compile('org.springframework.boot:spring-boot-starter-batch')
    compile("org.springframework.boot:spring-boot-starter-jdbc")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("com.h2database:h2")

    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.springframework.batch:spring-batch-test')
}

Which I thought would enable JMX by default. I go to JConsole, connect to the application and expect to see a org.springframework.boot folder under java.util.logging, I see nothing.

So, now I pick a few of my custom beans and add @ManagedResource, I know see these.

However, what if I want to expose spring batch beans like @JobOperator how do I do this?

Pre Spring Boot, I could so something like:

<bean class="org.springframework.jmx.export.MBeanExporter">
  <property name="beans">
    <map>
      <entry key="spring:service=batch,bean=jobOperator">
          <bean class="org.springframework.aop.framework.ProxyFactoryBean">
          <property name="target" ref="jobOperator"/>
          <property name="interceptorNames" value="exceptionTranslator" />
        </bean>
      </entry>
    </map>
  </property>
  <property name="assembler">
<bean class="org.springframework.jmx.export.assembler.InterfaceBasedMBeanInfoAssembler">
      <property name="interfaceMappings">
        <map>
          <entry key="spring:service=batch,bean=jobOperator"
              value="org.springframework.batch.core.launch.JobOperator"/>
        </map>
      </property>
    </bean>
  </property>
</bean>

When I define my JobOperator, in my @Configuration file in Spring Boot I do:

@Bean
public JobOperator jobOperator() throws Exception {
    SimpleJobOperator simpleJobOperator = new SimpleJobOperator();
    // the operator wraps the launcher
    simpleJobOperator.setJobLauncher(this.jobLauncher);
    ...
}

I can't add @ManagedResource under the @Bean annotation. So how do I expose the JobOperator as a JMX bean?

More Than Five
  • 9,959
  • 21
  • 77
  • 127

1 Answers1

0

Here is how i did it in my code -

@Bean
public MBeanExporter exporter(){
    MBeanExporter m = new MBeanExporter();
    Map<String,Object> map = new HashMap<String, Object>();
    JmxBean testBean = (JmxBean)ctx.getBean("testBean");
    map.put("testBean",testBean);
    m.setBeans(map);
    return m;
}

@Bean
public JmxBean testBean(){
    return new JmxBean("test",100);
}

In your case since you want to register jobOperator, just replace testBean in exporter bean with it.

monster
  • 808
  • 10
  • 23