Java 轴突投射还是事件富集器?
我有以下设置:Java 轴突投射还是事件富集器?,java,domain-driven-design,cqrs,event-sourcing,axon,Java,Domain Driven Design,Cqrs,Event Sourcing,Axon,我有以下设置: HTTP请求到达REST端点,我在应用程序服务中接收它 应用程序服务将请求映射到命令C1,并使用commandGateway.sendAndWait(新的C1(restPostBody))将其转发到聚合 从repo加载聚合,应用新命令,生成新事件并保存到存储 此时,我需要充实这个事件,并将其用作REST调用的响应 到目前为止,我可以看到以下选项: 使用视图投影仪,并投影新事件以创建视图模型,该模型可以作为REST调用中的响应转发。在这里,我需要使用queryGateway.sub
commandGateway.sendAndWait(新的C1(restPostBody))将其转发到聚合代码>
queryGateway.subscriptionQuery(…
和sqr.updates().blockFirst()
等待事件由投影仪处理,然后创建响应。另外,我想这应该是同步的,因为如果系统在将事件存储到DB和将投影存储到DB之间失败,投影可能会失去同步@Autowired
public void configure(EventProcessingConfigurer configurer){
configurer.usingSubscribingEventProcessors();
}
用于聚合和视图模型中的同步事件处理。然后我可以使用查询视图模型(看起来有点难看-有更好的方法吗?)
我可以将这个
SomeView
作为restapi上的响应返回。因此,@bojanv55,您试图将您的应用程序伪装成一个同步设置,而Axon框架的命令事件查询方法强制您采取另一种方式
理想情况下,您的前端应该符合这种情况。
因此,如果您到达一个发布命令的端点,那么您将进行一次触发并忘记。更新您的查询模型的事件将在发生时作为更新推送到前端。因此,很快,接受它是异步的这一事实,最终将使一切都变得更加无缝
然而,说起来容易做起来难;你问这个问题当然是有原因的。
我个人喜欢使用订阅查询(您也将其指向订阅查询)来欺骗操作以实现同步
Frans的repository很好地展示了如何使用Axon框架实现这一点
他所做的是处理REST操作,并首先为您知道不久将更新的内容发送订阅查询。
其次,将命令分派给聚合,聚合决定发布事件,事件更新查询模型。
然后,查询模型更新将在向订阅查询发出的更新中构成,这只允许您在实际调整查询模型后立即返回结果
最后,我始终推荐我的第一个建议,即接受您所处的异步情况。第二,我认为我刚才共享的订阅查询解决方案也可以解决您所遇到的问题
希望这能帮到你!谢谢你的评论。如果我使用
使用SubscribingEventProcessor
,我想我不需要使用SubscribionQuery
,因为所有事情都是在同一个线程中完成的。如果我使用trackingEventProcessor
,这是唯一的选项。与跟踪处理器相关的问题->以防万一应用程序在保存聚合发出的事件和生成投影之间失败,投影会在组件重新启动时更新,还是会丢失此事件?您的假设是正确的。请注意,Axon Framework 4故意将事件处理器默认为跟踪。使用订阅,失败时丢失事件的可能性更大。T他TrackingEventProcessor
使用TrackingToken
跟踪处理事件流中事件的位置。未能处理事件可能发生在两个级别上,为了彻底解释这一点,我会说一个单独的问题。您介意专门为此添加一个吗?我是监督员所有轴突的问题,所以我一定会回答你。
try {
sc = queryGateway.query(new MyQuery("123", "123),
ResponseTypes.instanceOf(SomeView.class)).get();
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}