Имеет ли Spring Integration что-то вроде метрического канала-перехватчика, который может регистрироваться в потоке

Я ищу простой способ для некоторых моих потоков, чтобы иметь возможность регистрироваться, когда происходит какое-то "событие". В моем простом случае "событие" может быть всякий раз, когда какое-либо сообщение течет по каналу или всякий раз, когда определенное количество сообщений течет по каналу, я хотел бы распечатать некоторую информацию в файле журнала.

Я знаю, что в настоящее время есть logging-channel-adapter для logging-channel-adapter но в описанном случае мне нужно будет настроить собственное сообщение журнала, и мне также нужно будет иметь какой-то счетчик или метрики, отслеживающие все (так expression на адаптере не будет достаточным, поскольку это обеспечивает доступ к payload но не информацию о канале или потоке).

Я знаю, что Spring Integration уже предоставляет множество показателей для JMX через ManagedResources и MetricType и ManagedMetric. Я также неоднократно наблюдал за Расселом "Управление и мониторинг приложений Spring Integration Applications" видео YouTube: https://www.youtube.com/watch?v=TetfR7ULnA8 и я понимаю, что метрики компонента Spring Integration могут быть опрошены через jmx-attribute-polling-channel-adapter

Конечно, есть много способов получить то, что мне нужно. Несколько примеров:

  • ServiceAdapter, в котором есть счетчик, который также имеет ссылку на регистратор
  • Зацепите в цепочку консультанта poller
  • Опрос JMX через jmx-attribute-poll-channel-adapter

Однако было бы полезно предложить несколько компонентов, которые пользователи могли бы разместить в середине потока, который мог бы предоставить некоторые базовые функции, чтобы легко удовлетворить описанный вами прецедент. Пример потока может выглядеть так: inbound-channel-adapter → metric-logging-channel-interceptor → componentY → outbound-channel-adapter

Очень высокий уровень такого компонента может выглядеть как гибрид logging-channel-adapter и ChannelInterceptor с несколькими дополнительными полями:

<int:metric-logging-channel-interceptor>
 id=""
 order="" 
 phase=""
 auto-startup=""
 ref=""
 method=""
 channel=""
 outchannel=""
 log-trigger-expression="(SendCount % 10) = 0"
 level=""
 logger-name=""
 log-full-message=""
 expression="" 
 />
</int:metric-logging-channel-interceptor>

Внутри класса, реализующего это, нужно сохранить несколько базовых характеристик, я думаю, что те, которые выставлены на messageChannel, будут хорошими (например, SendCount, MaxSendDuration и т.д.). Атрибутам log-trigger-expression и expression потребуется также доступ к внутренним счетчикам.

Пожалуйста, дайте мне знать, есть ли что-то, что уже делает то, что я описываю, или если я слишком сильно себя чувствую. Если он в настоящее время не существует, хотя я считаю, что возможность быстрого добавления компонента в поток без необходимости писать собственный ServiceActivator только для целей ведения журнала обеспечивает выгоду.

1 ответ

Интересный вопрос. Вы уже можете сделать что-то подобное с помощью выборочного подключения...

<si:publish-subscribe-channel id="seconds">
 <si:interceptors>
 <si:wire-tap channel="thresholdLogger" selector="selector">
 </si:wire-tap></si:interceptors>
</si:publish-subscribe-channel>

<bean id="selector">
 </bean>

Здесь есть несколько вещей...

  1. Статистика фактически хранится в MBean для канала, а не для самого канала, поэтому выражение должно получить значение через сервер MBean.
  2. Прямо сейчас, провод-ответчик не поддерживает selector-expression, просто selector поэтому мне пришлось использовать ссылку на селектор оценки выражений. Было бы полезным улучшением, чтобы напрямую поддерживать selector-expression.
  3. Несмотря на то, что селектор в этом примере действует на статистику для задействованного канала, он может фактически ссылаться на любой MBean.

Я вижу некоторые потенциальные улучшения здесь.

  1. Поддержка selector-expression.
  2. Поддерживайте статистику в самом канале вместо MBean, поэтому мы можем просто использовать @channelName.sendCount > 5.

Не стесняйтесь открывать проблемы (улучшения) JIRA.

Надеюсь, это поможет.

licensed under cc by-sa 3.0 with attribution.