Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用EventScheduler不会在聚合中触发事件处理程序_Java_Spring Boot_Axon - Fatal编程技术网

Java 使用EventScheduler不会在聚合中触发事件处理程序

Java 使用EventScheduler不会在聚合中触发事件处理程序,java,spring-boot,axon,Java,Spring Boot,Axon,当我通过命令触发计划事件时,我看不到预期的事件处理程序触发。我试图在一个传奇中隔离一个一次性的业务事务,同时仍然允许将聚合作为事件源,以便能够重播状态更改 我已配置了以下SimpleEventScheduler @Bean 公共SimpleEventScheduler SimpleEventScheduler(EventBus EventBus){ 返回SimpleEventScheduler.builder() .eventBus(eventBus) .scheduledExecutorSe

当我通过命令触发计划事件时,我看不到预期的事件处理程序触发。我试图在一个传奇中隔离一个一次性的业务事务,同时仍然允许将聚合作为事件源,以便能够重播状态更改


我已配置了以下
SimpleEventScheduler

@Bean
公共SimpleEventScheduler SimpleEventScheduler(EventBus EventBus){
返回SimpleEventScheduler.builder()
.eventBus(eventBus)
.scheduledExecutorService(scheduledExecutorService())
.build();
}
专用ScheduledExecutorService ScheduledExecutorService(){
返回Executors.unconfigurableScheduledExecutorService(Executors.newSingleThreadScheduledExecutor());
}
我有一个聚合模型,它有一个
@CommandHandler

@CommandHandler
公开信(ScheduleLetterCommand cmd、EventScheduler){
字符串id=cmd.getLetterId();
log.info(“接收到字母id{},id的调度命令”);
ScheduleToken ScheduleToken=scheduler.schedule(持续时间为秒(5),新的BeginSendletRevent(id,LetterEventType.BEGIN\u SEND));
AggregateLifecycle.apply(新的LetterScheduleEvent(id,LetterEventType.SCHEDULED,scheduleToken));
}
和两个
@EventSourcingHandler

@EventSourcingHandler
(BeginSendletRevent事件)上的公共无效{
log.info(“信件发送过程已启动{}{}”,event.getletId(),event.getEventType());
scheduleToken=null;
}
@EventSourcingHandler
(Lettersent事件)上的公共无效{
log.info(“信件发送{}{}”,event.getLetterId(),event.getEventType());
this.sent=true;
}
我有一个传奇故事,当触发
BeginSendLetterRevent
并发布
LetterSentEvent
时,它会执行一些“业务逻辑”


@传奇
@Slf4j
公共类信件一览表{
私有事件网关;
公函附表1(){
//Axon需要空构造函数
}
@斯塔萨加
@EndSaga
@SagaEventHandler(associationProperty=“letterId”)
公共无效句柄(BeginSendletRevent事件){
log.info(“发送信件{}…”,event.getLetterId());
publish(newlettersentEvent(event.getLetterId(),LetterEventType.SENT));
}
@自动连线
public void setEventGateway(EventGateway EventGateway){
this.eventGateway=eventGateway;
}
}
以下是我的输出:

com.flsh.web.LetterScheduler            : Received request to schedule letter
com.flsh.web.LetterScheduler            : Finished request to schedule letter
com.flsh.axon.Letter                    : Received schedule command for letter id b7338082-e0e1-4ba0-b137-c7ff92afe3a1
com.flsh.axon.Letter                    : LetterScheduledEvent b7338082-e0e1-4ba0-b137-c7ff92afe3a1 SCHEDULED
com.flsh.axon.LetterSchedulingSaga      : Sending letter b7338082-e0e1-4ba0-b137-c7ff92afe3a1...
问题是我根本没有看到上面两个事件处理程序被触发。有人能看出我做错了什么吗?:)任何帮助都将不胜感激


如果这是使用Sagas和事件处理程序的错误方法,请让我知道。我意识到我的基本示例不利于一个好的领域模型

您的问题@GoldFish的简短答案是您希望在命令模型中处理事件

Axon术语中的聚合是一个命令处理组件,因此在考虑CQR时,它是命令模型的一部分。 因此,它处理命令消息并验证是否可以执行给定的操作(read:command)。如果验证的结果为“是”,则您将在给定聚合实例的生命周期中发布事件

可以引入到聚合中的带注释的
@EventSourcingHandler
方法是“基于聚合实例自身的事件来生成聚合实例”的方法

话虽如此,您可以预期聚合将永远不会直接从任何其他源处理事件,而不是自己的源

EventScheduler
是事件的外部源,与另一个聚合的事件在寻源时一样。因此,它们将被忽略不计

EventScheduler
将在后期发布事件,以便事件处理组件(例如Saga实例)处理该事件。 如果您想为特定的聚合或saga实例安排一些事情发生,您应该查看
DeadlineManager


无论如何,对于您试图实现的目标(我相信)是从一个传奇故事中触发聚合中的操作,您应该使用命令消息,因为聚合只能处理命令消息。

谢谢,我会尝试一下。对不起,我问了这么多问题,我不熟悉DDD/CQRS/EventSourcing和axon框架,因此API引用的概念对我来说并不明显。:)但我正在学习。谢谢你的帮助!!不需要道歉@GoldFlsh!这就是StackOverflow的意义,询问和回答问题。一、 首先,我很高兴能帮上忙。