Spring Boot — Camel — отслеживание обмена на всем пути

#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.html

2. Хорошо, сделаю … Извините за поздний ответ … на работе меня тянут во многих направлениях.