Верблюд в контейнере 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
Ответы
Ответ 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.