Триггер Аксона @EventHandler из JmsListener - PullRequest
0 голосов
/ 22 апреля 2019

Весной пакет org.springframework.amqp.rabbit упростил интеграцию RabbitMQ.Чтобы перейти на ActiveMQ, я не мог предположить, что напрямую поддерживаю ActiveMQ в Spring Axion Framework, но только с JMS в качестве интерфейса.

Теперь на стороне отправителя я явно вызываю Sender в @EventSourcingHandler, с помощью которогоЯ могу получать события в Receiver.

Единственное, что я не могу понять, это как вызывать аксон @EventHandler из Receiver всякий раз, когда есть новое событие.

Класс получателя:

public class Receiver {

    @JmsListener(destination = "myEventQueue")
    public void receive(AvailableQuantityInitializedEvent event) {
        // Here I need to trigger some axion's EventHandler
    }
}

Класс отправителя:

public class Sender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public void send(AvailableQuantityInitializedEvent event) {
        jmsTemplate.convertAndSend("myEventQueue", event);
    }
}

EventSourcingHandler, куда отправитель отправляет событие.

@NoArgsConstructor
@Aggregate
@Data
@ComponentScan
public class SomeAggregate {

    @EventSourcingHandler
    protected void on(SomeEvent event, Sender sender) {
        this.x = event.xx();
        this.y = event.yy();
        sender.send(event);
    }
}

@EventHandler, которыйМне нужно вызвать с приемника:

@ProcessingGroup(value = "name")
@AllArgsConstructor
@Component
public class SomeProjection {

    @EventHandler
    public void on(SomeEvent evt, @Timestamp Instant timestamp) {
        System.out.println("EventHandler:SomeEvent");
    }

}

1 Ответ

1 голос
/ 08 мая 2019

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

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

Во-вторых, я хотел бы понять, чего вы в первую очередь пытаетесь достичь. Если вы пытаетесь опубликовать События из своего приложения Axon в очереди, было бы лучше представить компонент, который будет выполнять это для любого события, вместо детального подхода для каждого обработчика событий. Я бы посоветовал вам взглянуть на то, как расширение Spring AMQP или расширение Kafka , предоставляемые Axon.

Однако, если все это все еще в одном приложении, я бы предложил просто использовать настройку EventStore / EventBus, предоставляемую самой платформой. Основание вашего приложения на обмене сообщениями должно позволить вам разделить класс SomeProjection на более поздней стадии без особых хлопот.

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

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

...