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

Axon框架:处理状态存储聚合中的数据库异常

西门品
2023-03-14
  • 异常处理表示“@exceptionHandler将只处理从同一个类中的消息处理函数引发的异常”
  • 消息拦截文档说:“用@exceptionHandler注释的函数将被视为处理程序拦截器,只有在异常结果时才会调用该函数。例如,为此目的使用注释函数允许您作为引发的数据库/服务异常的结果引发更特定于域的异常。”

但我不能让它起作用。我尝试添加异常处理程序,如下所示:

    @ExceptionHandler
    public void handle(ConstraintViolationException ex) throws Exception {
        if (ex.getMessage().contains("UNQ_COMPANY_ID") || ex.getMessage().contains("UNQ_PLAN_NAME")) {
            throw new DomainException("Plan name and company id must be unique");
        }
        throw ex;
    }

但不调用此方法。我尝试将异常处理程序方法放在聚合和单独的命令处理程序类上,尝试添加ResultType=ConstraintViolationException.class,并尝试捕获其他类型的异常,包括exceptionRuntimeExceptionAxonServerRemoteCommandHandlingException等。

我可以在日志输出中看到错误:

org.axonframework.axonserver.connector.commandd.axonserverremoteCommandHandlingException:远程消息处理组件引发异常:org.hibernate.exception.constraintViolationException:Call not execute语句

是否可以在状态存储的聚合中捕获数据库异常?如果是,有人能指出我做错了什么吗?

语句“一个@ExceptionHandler将只处理同一个类中消息处理函数引发的异常”使我怀疑是否需要创建一个自定义存储库类(而不是使用默认的GenericJParepository),但这似乎需要做更多的工作。

更新:通过向@CommandHandler方法添加UnitofWork参数,并使用它注册回滚回调,我大致完成了我想要的任务,如下所示:

        uow.onRollback(unit -> {
            DefaultUnitOfWork duow = (DefaultUnitOfWork) unit;
            Throwable ex = duow.getExecutionResult().getExceptionResult();
            while (ex != null) {
                if (ex.getMessage().contains("UNQ_PLAN_NAME")) {
                    throw new RuntimeException("Plan name must be unique");
                }
                ex = ex.getCause();
            }
        });

但这似乎有点冗长,也限制了我只能抛出未经检查的异常。不过,这也不是正确的方法,因为我假设@exceptionHandler注释的目的是消除对上述代码的需求。

共有1个答案

牧飞鹏
2023-03-14

这当然是可行的。

实际上,我能给你的最好的指针是,如果代码示例可以在那里看到关于分布式异常的示例。

通常,正如您在共享日志中看到的,“原始”异常被包装成AxonServerRemoteCommandHandlingException,这意味着您必须处理该异常。这样,您几乎可以向该类的detail字段添加任何内容,例如添加指示您有constraintViolationException(或ERROR_CODE,就像HTTP协议那样),您可以在另一边展开它。

 类似资料:
  • 是一个通用数据库处理框架(可以包含MSSQL POSTGRESQL,SQLITE EXCEL MYSQL DB2 ORACLE...只要你愿意实现接口就可以).很便捷地进行常用数据库操作(增删改查).其性能是几近纯ADO.NET.对于实体的查询采用emit实 现,如果您还不满意可用此框架的代码生成器直接生成纯ADO.NET SQL形式.其主要特色就是性能和便捷的操作.  

  • 如何读取自创建以来该聚合的所有事件?

  • exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnex

  • 中的任何提示都非常感谢,谢谢。

  • 下面是一个简单的场景: 用户单击“Create order”:将创建一个订单(首先保持其状态=NEW) 用户完成订单填写后,单击SAVE-->state is now Submited 当另一个检查订单并验证它时,必须进行一个过程。只有在调用了其他一些服务并给予许可时,才会验证该订单。 整个工作流程是: null null 谢谢

  • 我有一个像下面这样的用例。对于每个传入的事件,我希望查看某个字段,看看它的状态是否从a变为B,如果是,则将其发送到输出主题。流程是这样的:一个带有键“xyz”的事件以状态A进入,一段时间后另一个带有键“xyz”的事件以状态B进入。 有没有更好的方法使用DSL来编写这个逻辑? 上面代码中关于聚合创建的状态存储的两个问题。 null 提前道谢!