小编Woj*_*arz的帖子

如何使用事件源实现复杂表单的命令和事件?

我想使用 Axon 框架实现 CQRS 和 ES

我有一个相当复杂的 HTML 表单,它表示招聘过程的六个步骤。
ES 将有助于生成选定日期的历史统计数据并跟踪表单的变化。

管理员始终可以执行多项操作:

  • 指定专人负责每个步骤
  • 为每个步骤提供注释
  • 每一步接受或拒绝候选人
  • 打开/关闭短信或电子邮件通知
  • 分配标签

表单更新(仅差异)从 UI 应用程序发送到后端。

假设我只想对服务器端应用程序进行更改,问题是什么应该是命令,什么应该是事件,我考虑三个选项:


  1. 表单补丁是一个命令,它生成Form Update Event

    • 此解决方案的缺点是每个事件处理程序都需要检查表单中的更改是否引用此处理程序 ex。是否应该发送有关拒绝的电子邮件

  1. 表单补丁是一个命令,它生成多个事件,例如:。Interviewer Assigned, Notifications Turned Off,Rejected on technical interview

    • 该解决方案的缺点是,可能会生成一些事件,而其他事件则不会,因为违反了约束,例如:Notifications Turned Off会成功,但Interviewer Assigned由于分配未经授权的用户而失败。也许我应该在命令生成之前检查所有约束?

  1. 表单 patch 被转换为多个命令 ex: Assign InterviewerTurn Off Notifications每个命令都会生成事件 ex:Interviewer Assigned, Notifications Turned Off

    • 此解决方案的缺点是某些命令可能会失败,例如:Assign Interviewer可能由于分配未经授权的用户而失败。这最终会导致状态不一致,因为有些事件将存储在存储库中,有些则不会。也许我应该在命令生成之前检查所有约束?

domain-driven-design event-sourcing axon

5
推荐指数
1
解决办法
469
查看次数

带有 Reactive MongoDB 的流和耗时操作被取消

问题介于 Project Reactor 和 Reactive MongoDB (Spring Data) 之间。

执行包含(按以下顺序)的流时:

  1. 反应式 MongoDB上运行的方法非常快
  2. 需要超过30 秒的方法

流被取消(查看下面的代码和日志)

@GetMapping("/test/{msg}")
public Mono<SomeObject> test(@PathVariable String msg) {
    return repository.findByMessage(msg).log("1")
          .map(someObj -> delaySeconds(someObj, 35)).log("2");
}
Run Code Online (Sandbox Code Playgroud)

如您所见,30 秒后流被取消,但又过了 5 秒(超时为 35 秒),onNext事件执行。

12:59:18.556 [Thread-9] INFO  com.why.temp.TempController - Saved:SomeObject(id=5b604106ef301746a86665f3, message=WHY)
12:59:18.591 [http-nio-8080-exec-2] INFO  1 - | onSubscribe([Fuseable] MonoFlatMap.FlatMapMain)
12:59:18.592 [http-nio-8080-exec-2] INFO  2 - | onSubscribe([Fuseable] FluxMapFuseable.MapFuseableSubscriber)
12:59:18.593 [http-nio-8080-exec-2] INFO  2 - | request(unbounded)
12:59:18.593 [http-nio-8080-exec-2] INFO  1 - | …
Run Code Online (Sandbox Code Playgroud)

spring mongodb reactive-programming project-reactor

5
推荐指数
1
解决办法
727
查看次数