【问题标题】:Axon how can I catch exception in sagaAxon 如何在 saga 中捕获异常
【发布时间】: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
    ))
  }
}

但实际上,即使当时用户不可用,请求也已成功创建,我该如何解决这种情况。

【问题讨论】:

    标签: java kotlin axon


    【解决方案1】:

    RequestSaga(或任何 Saga 实现)应该知道它发送的操作可能会失败。它是您的“复杂业务事务”的核心,其中也包括错误场景。

    因此,您应该知道从RequestSaga 发送的RequestUserCmd 可能会失败。当您使用CommandGateway#sendAndWait(Object) 方法时,这意味着命令处理函数抛出的异常将在 Saga 中被捕获。因此,sendAndWait 周围的简单 try-catch 块就可以了。

    如何您对异常的反应完全取决于您的域。也许你重试操作?或者您可以安排deadline 在 5 分钟内重试该操作? 5天内?或者您可以向请求服务发送另一个命令,说明用户不可用?

    对于这个问题没有“一刀切”的解决方案,因为只有您的领域专家才能告诉您如果此类操作失败,您应该怎么做。

    无论如何,我希望这对您有所帮助@Patrick。如果您不清楚我的回答,请添加一些 cmets,我会看看如何更新我的回答以满足这些需求。

    【讨论】:

      猜你喜欢
      • 2011-04-03
      • 2021-03-26
      • 2013-09-04
      • 2021-05-23
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      相关资源
      最近更新 更多