Интеграция Spring с jmxtrans-агентом для мониторинга bean

#spring #spring-integration #jmx #spring-jmx #jmxtrans

#spring #spring-интеграция #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 зависит от запроса, если jmxtrans-agent собирает информацию каждые 20 секунд, будут ли пропущены данные?

Комментарии:

1. Пожалуйста, попробуйте перефразировать свой вопрос. Я трачу около 15 минут, чтобы понять, что происходит. Да, ваш класс должен быть помечен @ManagedResource и @ManagedAttribute отображаться как MBean. Нет, компоненты интеграции Spring singleton . У number вас будет коллекция для любой многопоточности. Хотя не ясно number , для чего это нужно…

2. Спасибо за помощь, я просто пытаюсь составить пример для подсчета количества запросов, поступающих в разделитель, и использую jmxtrans-agent для его мониторинга. Я сделал выше кодирование, но я получаю ошибку getAttribute failed. Я попробовал «attribute = ‘Count’ » как в верхнем, так и в нижнем регистре C.

3. Пожалуйста, подтвердите, что вы действительно можете видеть свои Splitter данные через консоль JMX и можете запросить этот атрибут.

4. Используя jconsole, я могу видеть разделитель, но не «считать» в атрибутах.

5. Это странно… М-м-м. Попробуйте использовать @ManagedMetric вместо @ManagedAttribute

Ответ №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, который на самом деле не предоставляет внутренние компоненты, а только свои собственные управляемые атрибуты / операции.

Комментарии:

1. возникает проблема, если я использую ConcurrentHashMap для получения некоторой статистики для splitter. после некоторого запроса кажется, что время ожидания службы истекло, интересно, приведет ли это к потенциальной взаимоблокировке и как с этим бороться.

2. Похоже на новый вопрос SO!