#spring-boot #apache-camel
#весенняя загрузка #apache-camel
Вопрос:
Мы пытаемся настроить очень простую таблицу базы данных аудита для очень сложного приложения Spring Boot, Camel с множеством маршрутов (в основном внутренних маршрутов с использованием seda://) … идея в том, что мы записываем в таблицу базы данных результат обработки каждого маршрута. Затем, когда возникают проблемы, мы можем войти в базу данных, запросить таблицу и точно определить, где возникла проблема. Я думал, что могу просто использовать exchange-id в качестве уникального идентификатора отслеживания, но быстро узнал, что все маршруты seda: // создают новые обмены, или, по крайней мере, это то, что я вижу (camel версии 2.24.3). Честно говоря, мне все равно, что мы используем для уникального идентификатора…Я могу достаточно легко сгенерировать UUID и использовать exchange.setProperty(«id-unique», UUID).
Мне удалось заставить что-то работать с помощью exchange.setProperty(«id-exchange», exchange.getExchangeId()) и сохранить уникальный идентификатор на маршрутах…(Я читал, что некоторые предопределенные префиксы маршрута, такие как jms://, не будут сохранять свойства exchange). Мысль о том, что самый первый процессор помещает exchangeId (уникальный идентификатор) в свойства exchange, моя логика отслеживания находится в процессоре, который я могу включить как часть определения маршрута :
@Override
public void configure() throws Exception {
// EVENTS : Collect statistics from Camel events
this.getContext().getManagementStrategy().addEventNotifier(this.camelEventNotifier);
// INITIAL : ${body} exchange coming from a simple URL endpoint
// POST request with an XML Message...simulates an MQ
// message from Central MQ. The Web/UI service places the
// message onto the camel route using producerTemplate.
from("direct:" Globals.ROUTEID_LBR_INTAKE_MQ)
.routeId(Globals.ROUTEID_LBR_INTAKE_MQ)
.description("Loss Backup Reports MQ XML inbound messages")
.autoStartup(false)
.process(processor)
.process(getTrackingProcessor())
.to("seda:" Globals.ROUTEID_LBR_VALIDATION)
.end();
}
Это доказательство концепции (POC) позволило мне, по крайней мере, отслеживать вещи так, как мы хотим … обратите внимание на несколько строк с одинаковым уникальным идентификатором :
ID_ROW ID_EXCHANGE PROCESS_GROUP PROCESS_STEP RESULTS_STEP RESULTS_MESSAGE
1 ID-LIBP45P-322256M-1603188596161-4-6 Loss Backup Reports lbr-intake-mq add lbr-intake-mq
2 ID-LIBP45P-322256M-1603188596161-4-6 Loss Backup Reports lbr-validation add lbr-intake-mq
Дело в том, что этот POC оказывается жестким и сложным для записи результатов, таких как УСПЕХ или ИСКЛЮЧЕНИЕ.
Мой вопрос в том, кто-нибудь делал что-нибудь подобное? И если да, то как это было реализовано? Или в Camel есть необычный способ справиться с этим, который я просто не смог найти в Интернете?
Мои другие идеи были :
- Установите старомодный абстрактный класс TrackerProcessor, который расширяют все мои отслеживаемые процессоры. Тогда просто есть несколько методов для создания, обновления и т. Д… Затем каждый процессор просто вызывает унаследованные методы для создания записей аудита и управления ими. Преимущество здесь в том, что обмен легко доступен со всеми данными, необходимыми для хранения в таблице базы данных.
@Component
public abstract class ProcessorAbstractTracker implements Processor {
@Override
abstract public void process(Exchange exchange) throws Exception;
public void createTracker ( Exchange exchange ) {
}
public void updateTracker ( Exchange exchange, String theResultsMessage, String theResultsStep ) {
}
}
- Установите компонент @Autowired, к которому подключается каждый отслеживаемый процессор Camel, и поместите логику отслеживания в компонент. Это кажется простым и понятным. Моя единственная проблема / вопрос здесь заключается в том, как охватить компонент (возможно, прототип) … поскольку одновременно будет много маршрутов, использующих компонент, есть ли шанс, что мы получим смешанные значения обработки…
@Autowired
ProcessorTracker tracker;
- Другие идеи?
tia, adym
Комментарии:
1. Ваши требования к аудиту неясны. Взгляните на
intercept
шаблон в Camel, который позволяет перехватывать каждый шаг ваших маршрутов: camel.apache.org/components/latest/eips/intercept.html2. Хорошо, сделаю … Извините за поздний ответ … на работе меня тянут во многих направлениях.