Обработчик событий воспроизводится при перезапуске приложения? - PullRequest
2 голосов
/ 22 января 2020

Я играю с сервером аксона локально. Я запускаю контейнер docker на своем локальном компьютере с помощью команды docker run -d --name axonserver -p 8024:8024 -p 8124:8124 axoniq/axonserver.

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

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

flsh.axon.LetterSchedulingHandler   : Sending letter 0e94035a-ec4b-4fdc-b8b6-4c0bc1927c8f...
flsh.axon.LetterSchedulingHandler   : Sending letter 6b4f6966-85ea-46e0-9c49-21bcd501a1b5...
flsh.axon.LetterSchedulingHandler   : Sending letter fc36292f-c7bd-4575-b56f-130624a87466...

flsh.axon.Letter                    : LetterScheduledEvent 0e94035a-ec4b-4fdc-b8b6-4c0bc1927c8f SCHEDULED
flsh.axon.Letter                    : LetterScheduledEvent 6b4f6966-85ea-46e0-9c49-21bcd501a1b5 SCHEDULED
flsh.axon.Letter                    : LetterScheduledEvent fc36292f-c7bd-4575-b56f-130624a87466 SCHEDULED
flsh.axon.Letter                    : Letter sent fc36292f-c7bd-4575-b56f-130624a87466 SENT
flsh.axon.Letter                    : Letter sent 0e94035a-ec4b-4fdc-b8b6-4c0bc1927c8f SENT
flsh.axon.Letter                    : Letter sent 6b4f6966-85ea-46e0-9c49-21bcd501a1b5 SENT
flsh.axon.Letter                    : Letter sent 0e94035a-ec4b-4fdc-b8b6-4c0bc1927c8f SENT
flsh.axon.Letter                    : Letter sent 0e94035a-ec4b-4fdc-b8b6-4c0bc1927c8f SENT
flsh.axon.Letter                    : Letter sent fc36292f-c7bd-4575-b56f-130624a87466 SENT
flsh.axon.Letter                    : Letter sent 6b4f6966-85ea-46e0-9c49-21bcd501a1b5 SENT

Мой обработчик событий выглядит так:

@Slf4j
@Component
public class LetterSchedulingHandler {

    private final CommandGateway commandGateway;

    public LetterSchedulingHandler(CommandGateway commandGateway) {
        this.commandGateway = commandGateway;
    }

    @DisallowReplay //this doesn't seem to work
    @EventHandler
    public void handle(BeginSendLetterEvent event) {
        log.info("Sending letter {}...", event.getLetterId());
        commandGateway.send(new LetterSentCommand(event.getLetterId()));
    }
}
@CommandHandler
public void handle(LetterSentCommand cmd) {
    AggregateLifecycle.apply(new LetterSentEvent(cmd.getLetterId()));
}

Эти события публикуются с помощью планировщика ... который запускается в агрегате с помощью другого @CommandHandler и в противном случае он успешно запускается, как и ожидалось.

@CommandHandler
public Letter(ScheduleLetterCommand cmd, EventScheduler scheduler) {
    String id = cmd.getLetterId();
    log.info("Received schedule command for letter id {}", id);
    ScheduleToken scheduleToken = scheduler.schedule(Duration.ofSeconds(5), new BeginSendLetterEvent(id));
    AggregateLifecycle.apply(new LetterScheduledEvent(id, scheduleToken));
}

Кажется, аннотация @DisallowReplay не мешает этому. Кроме того, я попытался следовать указаниям здесь , чтобы сделать обработчик Subscribing обработчиком событий, но либо я сделал это неправильно, либо это также не решило проблему.

axon:
  axonserver:
    servers: localhost
  eventhandling:
    processors:
      LetterSchedulingHandler:
        mode: subscribing

1 Ответ

2 голосов
/ 23 января 2020

То, что вам не хватает @ GoldFL sh, является одним из этих двух:

  1. Правильно укажите EventProcessor позади вашего LetterSchedulingHandler
  2. Определите @ProcessingGroup вашего LetterSchedulingHandler

То, что вы, возможно, прочитали в Справочном руководстве по обработчикам событий , как и любой компонент обработки событий (например, ваш LetterSchedulingHandler) быть сгруппированными с другими компонентами обработки событий в процессоре событий подписки или отслеживания.

Однако на этом этапе вы не настроили ни одного имени группы обработки. Это означает, что для группы обработки LetterSchedulingHandler по умолчанию будет указано имя пакета обработчика. Следовательно, в вашем файле свойств вы должны использовать имя пакета вместо LetterSchedulingHandler, чтобы определить его как подписку.

Что более понятно, так это добавить аннотацию @ProcessingGroup к LetterSchedulingHandler, давая ему чистое имя, которое вы затем можете использовать в файле свойств.

Наконец, тот факт, что вы не правильно ссылаетесь на обработчик событий, является причиной того, что вы увидите повторы событий. По умолчанию Axon TrackingEventProcessor, который отслеживает, насколько далеко он находится с обработкой событий потока. Без постоянного модуля для хранения этих TrackingTokens он всегда будет начинаться с нуля.

...