当前位置: 首页 > 知识库问答 >
问题:

EventSourceHandler被错误的事件触发?

阎咏思
2023-03-14

我设计了两个输入命令scheduleletterCommand,它们将在几分钟内“发送一封信”...如果用户在该时间段内发送另一个命令cancelletterCommand,则可以取消该命令。

我正在通过REST API控制器触发命令...

我希望看到的是日志语句,如果我计划一封信,并在接下来的五分钟内立即取消它,这些语句表示一封信被计划和取消。

Received schedule command for letter id e6e037be-3b6d-4ae3-80cd-12426adcd526
LetterScheduledEvent e6e037be-3b6d-4ae3-80cd-12426adcd526 SCHEDULED
LetterScheduledEvent e6e037be-3b6d-4ae3-80cd-12426adcd526 SCHEDULED
Received cancel command for letter id e6e037be-3b6d-4ae3-80cd-12426adcd526
Letter e6e037be-3b6d-4ae3-80cd-12426adcd526 cancelled CANCELLED

这是我的集合体-

java prettyprint-override">public class Letter {

    @AggregateIdentifier
    private String letterId;
    private ScheduleToken scheduleToken;

    @SuppressWarnings("UnusedDeclaration")
    protected Letter() {
        // Default constructor required by Axon Framework
    }

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

    @CommandHandler
    public void handle(CancelLetterCommand cmd, EventScheduler eventScheduler) {
        String letterId = cmd.getLetterId();
        log.info("Received cancel command for letter id {}", letterId);
        AggregateLifecycle.apply(new LetterCancelledEvent(letterId, LetterEventType.CANCELLED));
        eventScheduler.cancelSchedule(scheduleToken);
    }

    @EventSourcingHandler
    public void on(LetterScheduledEvent event) {
        log.info("LetterScheduledEvent {} {}", event.getLetterId(), event.getEventType());
        this.letterId = event.getLetterId();
    }

    @EventSourcingHandler
    public void on(LetterCancelledEvent event) {
        log.info("Letter {} cancelled {}", event.getLetterId(), event.getEventType());
        scheduleToken = null;
    }

    @EventSourcingHandler
    public void on(BeginSendLetterEvent event) {
        log.info("Letter sending process started {} {}", event.getLetterId(), event.getEventType());
        //complicated letter sending processes...
        AggregateLifecycle.apply(new LetterSentEvent(event.getLetterId(), LetterEventType.SENT));
    }

    @EventSourcingHandler
    public void on(LetterSentEvent event) {
        log.info("Letter sent {} {}", event.getLetterId(), event.getEventType());
    }
}

这是我的活动->

abstract class LetterMovementEvent(open val letterId: String, open val eventType: LetterEventType)

enum class LetterEventType {
    SCHEDULED,
    CANCELLED,
    BEGIN_SEND,
    SENT
}

data class LetterScheduledEvent(
        override val letterId: String,
        override val eventType: LetterEventType = LetterEventType.SCHEDULED
) : LetterMovementEvent(letterId, eventType)

data class LetterCancelledEvent(
        override val letterId: String,
        override val eventType: LetterEventType = LetterEventType.CANCELLED
) : LetterMovementEvent(letterId, eventType)

data class BeginSendLetterEvent(
        override val letterId: String,
        override val eventType: LetterEventType = LetterEventType.BEGIN_SEND
) : LetterMovementEvent(letterId, eventType)

data class LetterSentEvent(
        override val letterId: String,
        override val eventType: LetterEventType = LetterEventType.SENT
) : LetterMovementEvent(letterId, eventType)

共有1个答案

步衡
2023-03-14

你所注意到的@goldfish,是一个框架,它根据它已经发布的事件来获取你的聚合。因此,简而言之,您正在看到“活动来源在行动”。

通过字母聚合中的@eventsourcinghandler注释,您已经有效地创建了用于根据事件重新创建聚合的方法。

因此,如果您发送一个命令来取消这个聚合的字母,它将首先从事件中重新创建聚合。只有在解决了这个问题之后,才会真正将命令赋予@commandhandler注释方法。

 类似资料:
  • 我对TextWatcher有一个恼人的问题。我一直在网上搜索,但什么也找不到。如果有人能帮助我,我将不胜感激。 由于某些原因,在一次文本更改时对TextWatcher事件的调用是不稳定的。有时它们被触发一次(就像它们应该被触发的那样),有时两次,有时三次。不知道为什么,整个事情都很直截了当。有时,PostTextChanged()上的可编辑参数在toString()和length()中返回空值。

  • 我正在尝试添加一个搜索功能,在这个功能中,每当用户输入文本(一个字母接一个字母)时,网站都会向服务器发送一个收集信息的请求。对于这一点,我需要的是我假设的ContextChanged事件?我尝试过使用它,但活动无法启动。 还有我的代码: 你认为哪里不对?yall是否有比“ContextChanged事件”更好的解决方案来获得每次按键和搜索框?

  • 使用mui.trigger()方法可以动态触发特定DOM元素上的事件。 .trigger( element , event , data ) element Type: Element 触发事件的DOM元素 event Type: String 事件名字,例如:'tap'、'swipeleft' data Type: Object 需要传递给事件的业务参数 示例 自动触发按钮的点击事件: var

  • 我在我的应用程序中使用MutableLiveData进行基于事件的通信。我有单一活动两个片段架构。 在ViewModel的帮助下,我正在使用Fragment-1中的LiveData事件。但是,当我使用菜单栏用Fragment-2替换这个Fragment-1并最终返回Fragment-1时,LiveData的旧值再次被捕获。 如何避免这个问题?非常感谢任何帮助/建议!谢谢你。

  • 问题内容: 好吧,我已经研究并没有找到以下问题的解决方法`’SQL Error (1442): Can not update table’ messages’ in stored function / trigger because it is already used by statement Which invoked this stored function / trigger.`` 我的触

  • 我正在使用Amazon Transcripbe服务,并试图让CloudWatch事件激发一个Lambda函数,该函数执行对我的API的POST请求。 下面是Lambda函数 我已经将CloudWatch事件配置为监听Amazon Transcripbe服务,特别是监听作业状态更改为或。 这是我认为我的应用程序工作的唯一方式,转录作业是通过亚马逊转录服务调用的,然后当它完成时,点击我的API来更新我