Подтвердить что ты не робот

Верблюд в контейнере OSGi: примените InterceptStrategy ко всем контекстам верблюдов

У меня есть несколько пакетов (A, B и C), развернутых в контейнер OSGi, каждый из которых содержит CamelContext и некоторые маршруты. У меня есть еще один комплект (M) с CamelContext с маршрутом (для сбора данных мониторинга) и InterceptStrategy bean. Я бы хотел, чтобы InterceptStrategy bean из M автоматически применил ко всем другим CamelContext в контейнере (т.е. Те, что указаны в A, B и C), без необходимости изменять другие пакеты.

В конечном счете, цель состоит в том, чтобы перехватить данные из каждого CamelContext в маршрут в M, не внося никаких изменений в A, B или C, чтобы явно маршрутизировать Exchange. Является ли этот подход или подобный подход выполнимым?

Все CamelContext настроены с использованием Spring XML.


Обновление: Дополнительный контекст

Связки A, B и C содержат основной продукт, ответственный за обработку данных. Bundle M содержит дополнительный инструмент мониторинга, предназначенный для измерения определенных параметров данных, проходящих через A, B и C. В настоящее время добавление дополнительного инструмента требует изменения маршрутов в A, B и C для добавления дополнительных Processor в обогатите Exchange данными мониторинга и прочитайте данные мониторинга до конечных точек <to />.

Цель состоит в том, чтобы иметь возможность отбрасывать Bundle M в уже проверенную систему с A, B и C; и автоматически применять его к существующим маршрутам без необходимости изменять конфигурацию существующих и работающих пакетов. Допустимо вносить изменения в A, B и C, чтобы поддерживать это, пока изменения не приводят к тому, что A, B и C полагаются на M для запуска (то есть ABC все равно должен работать без M).

Если есть лучшее средство для этого, чем использование перехватчиков, я открыт для этого. Основные цели:

  • Держите A, B и C отделившись от M (особенно во время разработки)
  • Убедитесь, что интеграция M с A, B и C максимально упрощена.
  • Разрешить M интегрировать без необходимости вручную изменять A, B или C
4b9b3361

Ответ 1

Я не думаю, что это возможно, используя InterceptorStrategy, так как он ожидает, что он работает в одном и том же контексте верблюда. Единственное, что мне известно о работе в нескольких контекстах, - это использование конечной точки VM (которая, очевидно, ограничена одной и той же JVM), однако в этом случае вам, вероятно, будет лучше использовать JMS, JMX или что-то подобное.

JMS

Создайте InterceptorStrategy для каждого контекста верблюда в A, B & C, который публикует ваши сообщения на M

intercept().bean(transformForMonitoring).to("jms:queue:monitoring");

from("whatever:endpoint")
    .process(myProcessor)
    .to("target:endpoint");

Вы также можете использовать компонент vm на intercept(), если вам не нужны служебные данные JMS, однако это ограничивает ваш компонент мониторинга одной JVM.

JMX

Это немного сложнее, но основная идея - рассказать контексту верблюда о публикации MBeans для A, B & C

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
  <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/>
    ...
</camelContext>

а затем M подключиться к серверу JVM MBean и использовать что-то вроде NotificationListener, чтобы реагировать на обмены.

Ответ 2

Одна из возможностей - определить пользовательский Tracer в Bundle 'M' и экспортировать его как службу osgi.

В расслоении A, B, C определяют osgi-ссылку на экспортированный Tracer bean

Используйте camel JMX, чтобы включить трассировку.

Это приведет к изменениям в пакете A, B, C, но оно будет минимальным, и оно также даст возможность интегрировать и настроить трассировку (перехват)

Я не пробовал это сам, но hth

Ответ 3

Используйте либо Spring -DM, либо лучше преобразуйте все ваши маршруты, основанные на spring xml, в чертежные. Это наилучший способ использования маршрутов на основе XML в Karaf/Osgi.