Интеграция Spring с jmxtrans-agent для мониторинга 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)
- Должен ли этот сплиттер реализовывать некоторый класс для управления ресурсами?
- Я подумал, что объем bean-компонента интеграции для каждого запроса, если jmxtrans-agent собирает информацию каждые 20 с, будет ли он пропущен?
1 ответ
Решение
Ой! Извините, что пропустил это. Теперь я вижу ваш код:
<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" method="split">
<bean class="Splitter" />
</int:splitter>
Чтобы <bean class="Splitter" />
это внутренний боб, и он не виден ни для какой другой среды.
Чтобы заставить его работать, вы должны переместить это определение компонента на верхний уровень и ссылаться на него из <splitter>
:
<bean id="mySplitter" class="Splitter" />
<int:splitter id="mySplitter" input-channel="splitChannel" output-channel="transformChannel" ref="mySplitter" method="split"/>
Вы использовали <splitter>
Компонент для экспорта JMX, который на самом деле не раскрывает внутренние компоненты, а только свои собственные управляемые атрибуты / операции.