Конструктор SimpleCommandBus () не виден -Аксон - PullRequest
0 голосов
/ 06 ноября 2018

Я разрабатываю Spring Boot + Axon пример. Я взял ссылку от https://www.baeldung.com/axon-cqrs-event-sourcing. В этом примере, когда я обновил axon-core версию до 4.0-M2. Когда я обновляю Axon версию, я вижу, что мой основной метод дает ошибку в строке № 23 и 25.

Согласно

Конструктор SimpleCommandBus () не отображается

Конструктор DefaultCommandGateway (CommandBus ) не определен

MessageRunner.java

public class MessagesRunner {

    public static void main(String[] args) {
        CommandBus commandBus = new SimpleCommandBus(); //Line-23

        CommandGateway commandGateway = new DefaultCommandGateway(commandBus); // Line-25

        EventStore eventStore = new EmbeddedEventStore(new InMemoryEventStorageEngine());

        EventSourcingRepository<MessagesAggregate> repository =
                new EventSourcingRepository<>(MessagesAggregate.class, eventStore);


        AggregateAnnotationCommandHandler<MessagesAggregate> messagesAggregateAggregateAnnotationCommandHandler =
                new AggregateAnnotationCommandHandler<MessagesAggregate>(MessagesAggregate.class, repository);
        messagesAggregateAggregateAnnotationCommandHandler.subscribe(commandBus);

        final AnnotationEventListenerAdapter annotationEventListenerAdapter =
                new AnnotationEventListenerAdapter(new MessagesEventHandler());
        eventStore.subscribe(eventMessages -> eventMessages.forEach(e -> {
                    try {
                        annotationEventListenerAdapter.handle(e);
                    } catch (Exception e1) {
                        throw new RuntimeException(e1);

                    }
                }

        ));

        final String itemId = UUID.randomUUID().toString();
        commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)"));
        commandGateway.send(new MarkReadMessageCommand(itemId));
    }
}

Ошибка -

Исключение в потоке "main" java.lang.Error: Нерешенные проблемы компиляции: Конструктор SimpleCommandBus () не виден Конструктор DefaultCommandGateway (CommandBus) не определен at com.example.demo.MessagesRunner.main (MessagesRunner.java:23)

Edit-1

@ Milan Savic - я обновил код, как показано ниже, но я получаю ошибку ниже при выполнении последней строки. Я что-то здесь пропустил?

CommandBus commandBus = new SimpleCommandBus.Builder().build();
CommandGateway commandGateway = DefaultCommandGateway.builder().commandBus(commandBus).build();

Ошибка -

00:27:40.704 [main] WARN org.axonframework.eventsourcing.eventstore.AbstractEventStore - Error reading snapshot for aggregate [67f0747f-a0fd-4089-9cc3-fb1fe4662cca]. Reconstructing from entire event stream.
java.lang.NullPointerException: null
    at org.axonframework.eventsourcing.eventstore.inmemory.InMemoryEventStorageEngine.readSnapshot(InMemoryEventStorageEngine.java:105)
    at org.axonframework.eventsourcing.eventstore.AbstractEventStore.readEvents(AbstractEventStore.java:80)
    at org.axonframework.eventsourcing.EventSourcingRepository.readEvents(EventSourcingRepository.java:427)
    at org.axonframework.eventsourcing.EventSourcingRepository.doLoadWithLock(EventSourcingRepository.java:404)
    at org.axonframework.eventsourcing.EventSourcingRepository.doLoadWithLock(EventSourcingRepository.java:48)
    at org.axonframework.commandhandling.model.LockingRepository.doLoad(LockingRepository.java:195)
    at org.axonframework.commandhandling.model.LockingRepository.doLoad(LockingRepository.java:50)
    at org.axonframework.commandhandling.model.AbstractRepository.lambda$load$11(AbstractRepository.java:151)
    at java.util.HashMap.computeIfAbsent(Unknown Source)
    at org.axonframework.commandhandling.model.AbstractRepository.load(AbstractRepository.java:150)
    at org.axonframework.commandhandling.AggregateAnnotationCommandHandler$AggregateCommandHandler.handle(AggregateAnnotationCommandHandler.java:219)
    at org.axonframework.commandhandling.AggregateAnnotationCommandHandler$AggregateCommandHandler.handle(AggregateAnnotationCommandHandler.java:213)
    at org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle(AggregateAnnotationCommandHandler.java:175)
    at org.axonframework.commandhandling.AggregateAnnotationCommandHandler.handle(AggregateAnnotationCommandHandler.java:44)
    at org.axonframework.messaging.DefaultInterceptorChain.proceed(DefaultInterceptorChain.java:57)
    at org.axonframework.messaging.unitofwork.DefaultUnitOfWork.executeWithResult(DefaultUnitOfWork.java:69)
    at org.axonframework.commandhandling.SimpleCommandBus.handle(SimpleCommandBus.java:176)
    at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:146)
    at org.axonframework.commandhandling.SimpleCommandBus.dispatch(SimpleCommandBus.java:110)
    at org.axonframework.commandhandling.gateway.AbstractCommandGateway.send(AbstractCommandGateway.java:75)
    at org.axonframework.commandhandling.gateway.DefaultCommandGateway.send(DefaultCommandGateway.java:75)
    at org.axonframework.commandhandling.gateway.DefaultCommandGateway.send(DefaultCommandGateway.java:123)
    at com.example.demo.MessagesRunner.main(MessagesRunner.java:52)

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Это совсем другая проблема, чем подход Builder @PAA, так что не связана с оригинальной проблемой, которую вы создали. Тем не менее, я бы предложил попробовать Axon 4.0, а не Milestone. Вехи не гарантированно полностью свободны от ошибок. Кроме того, InMemoryEventStorageEngine обычно используется только для тестирования сценариев. Если вы действительно хотите сохранить свои события, я предлагаю перейти к JPA, JDBC или более хорошему, Axon Server .

Редактировать

Извините за поздний ответ, позвольте мне дать вам фрагмент кода, которым вы поделились:

public class MessagesRunner {

    public static void main(String[] args) {
        // Adjusted - Used builder instead of constructor
        CommandBus commandBus = SimpleCommandBus.builder().build();

        // Adjusted - Used builder instead of constructor
        CommandGateway commandGateway = DefaultCommandGateway.builder()
                .commandBus(commandBus)
                .build();

        // Adjusted - Used builder instead of constructor
        EventStore eventStore = EmbeddedEventStore.builder()
                .storageEngine(new InMemoryEventStorageEngine())
                .build();

        // Adjusted - Used builder instead of constructor
        EventSourcingRepository<MessagesAggregate> repository =
                EventSourcingRepository.builder(MessagesAggregate.class)
                        .eventStore(eventStore)
                        .build();


        // Adjusted - Used builder instead of constructor
        AggregateAnnotationCommandHandler<MessagesAggregate> messagesAggregateAggregateAnnotationCommandHandler =
                AggregateAnnotationCommandHandler.<MessagesAggregate>builder()
                        .aggregateType(MessagesAggregate.class)
                        .repository(repository)
                        .build();

        messagesAggregateAggregateAnnotationCommandHandler.subscribe(commandBus);

        // Adjusted - Renamed AnnotationEventListenerAdapter to AnnotationEventHandlerAdapter
        final AnnotationEventHandlerAdapter annotationEventListenerAdapter =
                new AnnotationEventHandlerAdapter(new MessagesEventHandler());
        eventStore.subscribe(eventMessages -> eventMessages.forEach(e -> {
                    try {
                        annotationEventListenerAdapter.handle(e);
                    } catch (Exception e1) {
                        throw new RuntimeException(e1);

                    }
                }

        ));

        final String itemId = UUID.randomUUID().toString();
        commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)"));
        commandGateway.send(new MarkReadMessageCommand(itemId));
    }
}

Надеюсь, это проясняет решение, которым я и Милан пытались поделиться! :-) А если нет, обязательно прокомментируйте это!

0 голосов
/ 06 ноября 2018

В версии 4.0 мы решили представить шаблон Builder для наших сложных компонентов инфраструктуры. Причина этого в том, что использование инфраструктуры более читабельно, а с другой стороны, это дает нам большую гибкость, когда речь идет о добавлении новых полей в компоненты инфраструктуры.

Итак, построение SimpleCommandBus будет выглядеть так: SimpleCommandBus.builder().build();. Вы можете догадаться, что нужно сделать для DefaultCommandGateway;)

Надеюсь, это поможет!

Ура, Милан

...