.. _ecos-camel-core:
Библиотека ecos-camel-core
========================================
Библиотека является надстройкой над Apache Camel, которая адаптирована для работы с платформой Citeck.
.. note::
Для работы с библиотекой необходима enterprise лицензия.
Подключение
-----------------------
Добавьте зависимость в нужном микросервисе:
.. code-block:: xml
ru.citeck.ecos.ent.camel
ecos-camel-core
Подходящая версия будет загружена из родительского POM.
Пример использования
-----------------------------------------
Создайте компонент с настройками роутов. Он запустит новый контекст после старта приложения:
.. code-block:: java
package ru.citeck.ecos.webapp.demo;
import jakarta.annotation.PostConstruct;
import kotlin.Unit;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.camel.Endpoint;
import org.apache.camel.builder.RouteBuilder;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;
import ru.citeck.ecos.camel.context.EcosCamelContext;
import ru.citeck.ecos.camel.context.EcosCamelContextFactory;
import ru.citeck.ecos.commons.data.DataValue;
import ru.citeck.ecos.records2.predicate.model.Predicates;
import ru.citeck.ecos.webapp.api.EcosWebAppApi;
@Component
@RequiredArgsConstructor
public class EcosCamelExample extends RouteBuilder implements DisposableBean {
// для базовой работы нужны два бина:
private final EcosWebAppApi ecosWebAppApi; // запуск после инициализации приложения
private final EcosCamelContextFactory contextFactory; // создание нового контекста
// ссылку на контекст сохраняем в поле для последующей остановки
private EcosCamelContext context = null;
@SneakyThrows
@PostConstruct
public void init() {
// создаём и запускаем контекст только после инициализации приложения
ecosWebAppApi.doBeforeAppReady(0, () -> {
createAndStartContext();
return Unit.INSTANCE;
});
}
@SneakyThrows
private void createAndStartContext() {
// создаём новый контекст и регистрируем роуты
context = contextFactory.createContext().build();
context.addRoutes(this);
context.start();
}
@Override
public void configure() {
// endpoint для прослушивания событий ECOS с типом "record-created"
// и фильтром по типу записей "demo-type"
Endpoint endpoint = getContext().getEndpoint(
"ecos-event:record-created",
Maps.of(
"attributes", Maps.of(
"recordRef", "record?id",
"id", "record?localId",
"name", "record?disp",
"textField", "record.textField"
),
"filter", Predicates.eq("typeDef.id", "demo-type"),
"transactional", true
)
);
from(endpoint)
.to("log:after-event-received")
.process(exchange -> {
DataValue body = exchange.getMessage().getBody(DataValue.class);
DataValue newBody = DataValue.createObj();
newBody.set("id", body.get("id"));
newBody.set("name", body.get("name"));
newBody.set("textField", body.get("textField"));
exchange.getMessage().setBody(newBody);
})
.to("log:after-processing")
// создаём новую сущность в источнике данных emodel/demo-type-2
.to("ecos-records-mutate:?sourceId=emodel/demo-type-2");
}
@Override
public void destroy() throws Exception {
if (context != null) {
context.close();
}
}
}
Пример демонстрирует следующий сценарий:
1. При старте приложения через ``@PostConstruct`` создаётся и запускается новый ``EcosCamelContext``.
2. Роут подписывается на событие ``record-created`` по типу ``demo-type``, извлекая нужные атрибуты записи.
3. В ``process``-шаге формируется новый объект с полями, необходимыми для создания записи в целевом источнике.
4. Результат передаётся в endpoint ``ecos-records-mutate``, который создаёт новую сущность в ``emodel/demo-type-2``.
5. При остановке приложения контекст корректно завершается в методе ``destroy()``.
.. seealso::
:ref:`Endpoint ecos-records-mutate `