Аксон 4 - аннотированные классы ProcessingGroup не обнаружены при внедрении конфигурации - PullRequest
0 голосов
/ 01 марта 2019

(Изначально входил в GitHub, но думал, что перенесу его сюда для всех с тем же вопросом и помогу команде разработчиков оставить вопросы в одном месте.)

Я не уверен, что это мое невежествос фреймворком или фактической проблемой, пожалуйста, потерпите меня, так как мне удалось найти очень мало документации по Axon 4 в отношении воспроизведения событий.

Сценарий:

@Component
@ProcessingGroup("projections")
public class AddEventHandler {

    @EventHandler
    public void on(AddEvent addEvent, ReplayStatus replayStatus){
    }

    @ResetHandler
    public void onReset() { // will be called before replay starts
        // do pre-reset logic, like clearing out the Projection table for a clean slate
       // this does not get executed
    }
}

@Configuration
public class AxonConfig {

    @Autowired
    private EventProcessingModule eventProcessingModule;

    @Autowired
    public void configureProcessors(EventProcessingConfiguration configuration) {
        configuration
                .eventProcessorByProcessingGroup("projections",
                        TrackingEventProcessor.class)
                .ifPresent(trackingEventProcessor -> {
                    trackingEventProcessor.shutDown();
                    trackingEventProcessor.resetTokens();
                    trackingEventProcessor.start();
                });
    }
}

Это быловзято из Воспроизведение документации событий

Контент ifPresent никогда не выполняется при запуске приложения, поэтому токены никогда не сбрасываются.Я могу вручную принудительно воспроизвести события, удалив токен.Упомянутая выше конфигурация является единственной конфигурацией, которую я изменил, все остальное выполняется за пределами автоконфигурации.

Хранилище токенов - это Microsoft SQL Server, и все взаимодействие, которое я вижу там, кажется нормальным (события сохраняются, владение токеномобновляется, когда приложение останавливается и т. д.).

При проверке EventProcessingConfiguration во время выполнения свойство eventProcessors является пустым, так как это свойство processingGroupAssignments, что позволяет мне полагать, что аннотации ProcessingGroup обрабатываются после запуска конфигурации Autowired,таким образом, ifPresent никогда не выполнит код, определенный выше.

Информация о версии: Spring Boot Starter: 2.1.2, Axon Starter: 4.0.3

1 Ответ

0 голосов
/ 01 марта 2019

Полный ответ здесь: https://github.com/AxonFramework/AxonFramework/issues/1006

Цитируемый ответ:

Теперь, чтобы решить возникшую проблему - кажется, вы хотите сбросить некоторые из ваших моделей запросовпри запуске приложения.Однако вы сталкиваетесь с проблемой порядка конфигурации в этом сценарии, где TrackingEventProcessor еще не запущен, в то время как созданный вами файл конфигурации уже вызывается.

Обратите внимание, что у нас есть планы быть более конкретными в отношениипорядок создания определенных bean-компонентов (потенциально с событиями приложения Spring, если вы спросите меня) - однако, мы еще не там, так что, пожалуйста, имейте с нами, пока эта переделка не будет выполнена.

Пока что,Простейший подход, который вы можете предпринять, это выделенный сервис воспроизведения.Вам нужно связать этот ResetService / ReplayService с EventProcessingConfiguration и получить в нем метод void resetProjectors ().Я бы предложил вызывать этот метод в тот момент, когда вы уверены, что приложение полностью подключено (например, путем обработки некоторых событий приложения Spring).

Еще раз спасибо заКоманда разработчиков Axon.

...