【发布时间】:2020-06-29 07:05:47
【问题描述】:
假设我想创建一个简单的请求-批准系统,如果用户向另一个用户请求某些东西,它应该创建请求,所以我有两个聚合 User, Request。创建请求后,它将触发 RequestSaga 发送 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
))
}
}
但实际上,即使当时用户不可用,请求也已成功创建,我该如何解决这种情况。
【问题讨论】: