Spring 与 jmxtrans-agent 集成以监控 bean
Spring integration with jmxtrans-agent to monitor bean
我正在使用 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)
- 此拆分器是否必须实现某些 class 才能成为托管资源?
- 我认为spring集成bean范围是每个请求,如果jmxtrans-agent每20秒收集一次信息,它会丢失数据吗?
哦!抱歉错过了。现在我看到了你的代码:
<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,仅公开其自己管理的 attributes/operations。
我正在使用 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)
- 此拆分器是否必须实现某些 class 才能成为托管资源?
- 我认为spring集成bean范围是每个请求,如果jmxtrans-agent每20秒收集一次信息,它会丢失数据吗?
哦!抱歉错过了。现在我看到了你的代码:
<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,仅公开其自己管理的 attributes/operations。