Camel DefaultMessage не может быть создан без CamelContext в версии 2.23.0

Мой фактический код (Camel 2.10.x) создает новое сообщение Camel для переноса некоторых данных (http-запрос) следующим образом:

Message message = new DefaultMessage();
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);

И пока я переношу свою платформу, мы используем версию Camel: 2.23.0, и теперь мы видим, что пустой конструктор устарел. При выполнении кода возникает та же проблема, что и в это сообщение с официального форума Camel.

Кажется, хороший способ создать сообщение с помощью конструктора с параметром CamelContext in следующим образом:

Message message = new DefaultMessage(camelContext);
message.setHeader(HEADER_QUERY, query);
message.setHeader(HEADER_BRAND, brand);
message.setHeader(HEADER_LIST_ID, listId);

Я нахожусь в контексте OSGI, но код находится в Bean-компоненте, где у меня нет ни Exchange, ни исходного Message. Мне просто интересно, как я могу предоставить CamelContext конструктору сообщений или есть другой способ создать DefaultMessage без CamelContext.

Обратите внимание, что я не нахожусь в Camel Route, Bean вызывается из интерфейса REST (я подозреваю, что есть некоторый рефакторинг, чтобы очистить это, но мы планируем списать его в ближайшее время). Я ищу решение для быстрой победы.


person рüффп    schedule 03.12.2019    source источник


Ответы (2)


Вы можете попробовать org.apache.camel.main.Main класс. Это синглтон, поэтому вы можете получить экземпляр с помощью Main.getInstance() , затем вы можете вызвать метод getOrCreateCamelContext() для получения CamelContext.

person Stepan Shcherbakov    schedule 03.12.2019
comment
К сожалению, в связке OSGI Main.getInstance() возвращает null. - person рüффп; 26.01.2021

К сожалению, решение с Main.getInstance().getOrCreateCamelContext() кажется неработающим в моем контексте (OSGI): Main.getInstance() всегда возвращает null.

Но я, наконец, нашел другой способ заставить его работать:

Первый шаг

Вставьте bundleContext в мой Bean:

<bean id="myCustomMessageFactory" class="org.mycompany.module.factory.CustomMessageFactory">
    <property name="bundleContext" ref="blueprintBundleContext" />
</bean>

blueprintBundleContext устанавливается автоматически и не требует объявления.

Второй шаг

из Bean (код Java):

ServiceReference sr = bundleContext.getServiceReference(CamelContext.class);
CamelContext camelContext = (CamelContext) bundleContext.getService(sr);
// and then I can inject the camelContext into the message constructor
Message message = new DefaultMessage(camelContext);

Он отлично работает в среде OSGI.

person рüффп    schedule 25.01.2021