当前位置: 首页 > 知识库问答 >
问题:

axon框架中的通用CommandExecutionException处理

卓嘉良
2023-03-14
class UserAggregate {
    //... 
        
    @CommandHandler()
    public void on(CreateUserCommand cmd) {
       Validate.notNull(cmd.getEmail(), "Email cannot be null");

       //other processing
   }
}

exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnext(axonservercommandbus.java:313)在org.axonframework.axonframework.axonframework.axonframework.connector.command.axonServerCommandBus$1.onnext(AxonServerCommandBus.java:306)at Io.grpc.stub.clientCallsServertoCalllistenerAdapter.onMessage(ClientCalls.java:429)at Io.grpc.ForwardingClientCalllistener.onMessage(ForwardingClientCalllistener.java:33)at Io.grpc.ForwardClientCalllistener.onMessage(ForwardingClientCalllistener.java:33)atPL$ClientStreamListenerImpl$1MessagesAvailable.runinContext(ClientCallimpl.java:581)

虽然消息是有用的,但这并不总是给定的。在实现ExceptionHandler时,这种情况可以得到缓解,如下所示

@ExceptionHandler
public void handle(Exception exception) {
   log.info("Caught Exception - {}", exception.getMessage(), exception);
}

现在,这为我提供了一个堆栈跟踪,确定问题的实际来源,然而,这是以在我想调用该命令的任何地方都必须编写这样一个ExceptionHandler为代价的。

是否有一种更通用的方法来记录这些异常,而不必将ExceptionHandler强加给每个发出命令的类?

共有1个答案

尉迟雅昶
2023-03-14

我将向您指出代码示例repo,其中显示了使用MessageHandlerInterceptor处理它的方法。

引用回购本身:

指示发生逻辑错误和命令处理失败的最常见方法之一是从命令处理程序引发异常。但是,如果异常是直接序列化的,则不能保证命令发送端能够正确地反序列化该异常。这就是为什么默认情况下Axon Framework会将在命令处理程序中引发的任何异常包装到CommandExecutionException中。

 类似资料:
  • 让我们举一个电子邮件传奇的例子:当一个用户注册时,我们创建一个发布UserRegisterEvent的用户聚合,一个传奇将被创建,这个传奇负责确保注册电子邮件被发送给用户(电子邮件可能包含验证密钥、欢迎消息等)。 我们是否应该使用: > 用try/catch->缩放吗? 使用deadline是因为我们只使用“send”,而不处理命令的最终错误,这可能是发送失败(其他服务关闭,等等) 其它的呢? 还

  • 我试图使用Axon 4.1+中的在一个2 JVM node K8集群上重播事件。虽然我将它设置为清理事件,但它只从一个节点中提取事件,而另一个节点继续运行,因为它的跟踪事件仍然是活动的。 我如何在所有JVM上同时禁用它,以便它能够正确地重播?然后启用所有这些命令,继续处理命令。 我尝试通过这段代码增加线程,这导致了另一个问题,即现有的令牌在InitialSemgmentsCount中永远不会增加,

  • 异常处理表示“将只处理从同一个类中的消息处理函数引发的异常” 消息拦截文档说:“用注释的函数将被视为处理程序拦截器,只有在异常结果时才会调用该函数。例如,为此目的使用注释函数允许您作为引发的数据库/服务异常的结果引发更特定于域的异常。” 但我不能让它起作用。我尝试添加异常处理程序,如下所示: 但不调用此方法。我尝试将异常处理程序方法放在聚合和单独的命令处理程序类上,尝试添加,并尝试捕获其他类型的异

  • 任何关于如何做到这一点的文件都将不胜感激。 提前谢了。

  • 您可以在下面看到我的示例类。 基本上,我希望使用Axon的表来存储事件,并使用我自己的实体表来存储实体。我知道,如果我激发在聚合中处理的,将发布一个事件,之后它将转到,Axon将在其表中持久化该事件。 如何回滚表,还是应该为此使用补偿事件? 我的外部@EventHandler类: