gpt4 book ai didi

java - Axon 如何在 saga 中捕获异常

转载 作者:行者123 更新时间:2023-12-02 13:28:43 25 4
gpt4 key购买 nike

假设我想创建一个简单的请求批准系统,如果用户向另一个用户请求某些东西,它应该创建请求,所以我有两个聚合 用户,请求 .创建请求后,它将触发 请求传奇 发送 RequestUserCmd

//Aggregate class
@Aggregate
class RequestAggregate {
@AggregateIdentifier
private lateinit var requestId: String

@CommandHandler
constructor(cmd: CreateRequestCmd){
apply(RequestCreatedEvt(
...some arguments
))
}
}

@Aggregate
class UserAggregate {
@TargetAggregateIdentifier
private lateinit var userId: String
private var available = false

// Some other commands
@CommandHandler
constructor(cmd: RequestUserCmd){
if(!available) throw IllegalArgumentException("User is not available.")
apply(UserRequestedEvt(
...some arguments
))
}
}

//Saga class
@Saga
class RequestSaga {
@Autowired
@Transient
private lateinit var commandGateway: CommandGateway

@StartSaga
@SagaEventHandler(associationProperty = "requestId")
fun on(evt: RequestCreatedEvt){
commandGateway.sendAndWait<String>(RequestUserCmd(
...some arguments
))
}
}
我所期望的是,如果用户当时不可用,它应该引发异常并且不应该创建请求。
@RestController
class RequestController {
// something...
@PostMapping
fun request(@RequestBody request: Request){
// if the use is not available i want it to return 403 bad request instead
commandGateway.send<String>(CreateRequestCmd(
...some arguments
))
}
}
但实际上,即使当时用户不可用,请求也已成功创建,我该如何解决这种情况。

最佳答案

RequestSaga (或任何 Saga 实现)应该知道它发送的操作可能会失败。它是您的“复杂业务事务”的核心,其中也包括错误场景。
因此,您应该知道 RequestUserCmd您从 RequestSaga 发送可能会失败。当您使用 CommandGateway#sendAndWait(Object)方法,这意味着命令处理函数抛出的异常将在 Saga 中被捕获。因此,sendAndWait 周围有一个简单的 try-catch block 。会做。
但是,您对异常的 react 完全取决于您的领域。也许你重试操作?或者,也许您安排了 deadline 5 分钟后重试操作? 5天内?或者,也许您可​​以将另一个命令发送回请求服务,说明用户不可用?
该问题没有“一刀切”的解决方案,因为只有您的领域专家才能告诉您如果此类操作失败,您应该怎么做。
无论如何,我希望这对您有所帮助@Patrick。如果您不清楚我的回答,请添加一些评论,我会看看如何更新我的答案以满足这些需求。

关于java - Axon 如何在 saga 中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62632885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com