通过 SpringUtil.publishEvent 发布事件事务失效

Blade 未结 2 267
tongyi
tongyi 2024-12-04 10:57

一、该问题的重现步骤是什么?

SpringUtil.publishEvent 发布事件, onApplicationEvent 订阅后续执行的代码mysql事务失效,且 tenantId 不会拼接到sql中。但是通过 AuthUtil.getTenantId 可以获取到租户Id

二、你期待的结果是什么?实际看到的又是什么?


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

 4.2.0 

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  •  tongyi
    tongyi (楼主)
    2024-12-04 13:38

    我找到原因了, SpringUtil 方法中把异常吃掉了, 这个需要怎么修复? 继续抛出来

    public static void publishEvent(ApplicationEvent event) {
        if (context == null) {
           return;
        }
        try {
           context.publishEvent(event);
        } catch (Exception ex) {
           log.error(ex.getMessage());
        }
    }


    作者追问:2024-12-04 13:38

    对外抛异常试试


    回答: 2024-12-04 13:38

    {
        .publishEvent(event);
    } (Exception ex) {
        .error(ex.getMessage());
    
        ex;
    }


    {
        .publishEvent(event);
    //} (Exception ex) {
    //    .error(ex.getMessage());
    //}


    这两种我测试了,都可以。 你们看一下有其他合适的方法吗? 就这个 log.error 要不要打印。看截图似乎log.error 是多余了


    image.png


    回答: 2024-12-04 13:38

    {
        .publishEvent(event);
    } (Exception ex) {
        .error(ex.getMessage());
    
        ex;
    }

    //		try {
    context.publishEvent(event);
    // } catch (Exception ex) {
    // log.error(ex.getMessage());
    // }

    都可以


    回答: 2024-12-04 13:38

    我截图了,两次发出来内容都变日志了。不知道啥原因

    image.png

    作者追问:2024-12-04 13:38

    改成这样看看能不能正常抛异常并且回滚


    /**

    * 发布事件

    *

    * @param event 事件

    */

    @SneakyThrows

    public static void publishEvent(ApplicationEvent event) {

    if (context == null) {

    return;

    }

    context.publishEvent(event);

    }


代码语言
提交回复