Spring与jmxtrans-agent集成以监控bean

时间:2016-10-10 18:03:35

标签: spring spring-integration jmx spring-jmx jmxtrans

我正在使用Spring集成但是想使用jmxtrans-agent来监视我的分割器。就像下面的简单示例一样,我尝试计算请求到达分割器的次数。

@ManagedResource
public class Splitter {
    private final AtomicInteger count = new AtomicInteger();

    @ManagedAttribute
    public int getCount(){
        return this.count.get();
    }

    public List<JsonNode> split(Message<ArrayNode> message) {
        count.incrementAndGet();
        ...
    }
}

// spring integration workflow
<int:gateway id="myGateway" service-interface="someGateway" default-request-channel="splitChannel" error-channel="errorChannel"  default-reply-channel="replyChannel" async-executor="MyThreadPoolTaskExecutor"/>

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" method="split">
    <bean class="Splitter" />
</int:splitter>

// in MBeanExporter, I added
<entry key="myApplication:type=Splitter,name=splitter" value-ref="mySplitter" />

// query
<query
    objectName='myApplication:type=Splitter,name=splitter'
    attribute='Count'
    resultAlias='myApplication.Splitter.count'/>
<collectIntervalInSeconds>20</collectIntervalInSeconds>

我无法查询数据,收到此错误。

javax.management.AttributeNotFoundException: getAttribute failed: ModelMBeanAttributeInfo not found for number
    at javax.management.modelmbean.RequiredModelMBean.getAttribute(RequiredModelMBean.java:1524)
    at org.springframework.jmx.export.SpringModelMBean.getAttribute(SpringModelMBean.java:109)
  • 此拆分器是否必须将某个类实现为托管资源?
  • 我认为spring integration bean是每个请求,如果jmxtrans-agent每20秒收集一次信息,是否会错过数据?

1 个答案:

答案 0 :(得分:1)

哦!很抱歉错过了。现在我看到了你的代码:

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" method="split">
    <bean class="Splitter" />
</int:splitter>

因此,<bean class="Splitter" />是内部bean,对任何其他环境都不可见。

要使其正常工作,您应该将该bean定义移到顶层,并从<splitter>引用它:

<bean id="mySplitter" class="Splitter" />

<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" ref="mySplitter" method="split"/>

您使用<splitter>组件进行JMX导出,它实际上不公开内部bean,只显示其自己的托管属性/操作。