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

Blade 未结 2 58
tongyi
tongyi 剑侠 15小时前

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

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

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


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

 4.2.0 

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


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

2条回答
  • 用这个试试:https://center.javablade.com/blade/BladeX-Doc/src/branch/master/%E7%AC%AC5%E7%AB%A0%20%E5%8A%9F%E8%83%BD%E7%89%B9%E6%80%A7/5.2%20SaaS%E5%A4%9A%E7%A7%9F%E6%88%B7/5.2.7%E7%BA%BF%E7%A8%8B%E7%8E%AF%E5%A2%83%E8%87%AA%E5%AE%9A%E4%B9%89%E7%A7%9F%E6%88%B7ID.md


    作者追问:14小时前

    拼接租户ID问题已经解决,目前mysql事务不起作用。

    回答: 13小时前

    事务相关的代码是怎么写的,发一下看看,发关键部分就行

    作者追问:13小时前

    事务注解

    image.png


    事件订阅

    image.png


    作者追问:13小时前

    2024-12-04 13:12:20.251  INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor    : 
    
    ==============  Sql Start  ==============
    Execute SQL : update bill_doc set `state` = 0, `audit_time` = null, `audit_user` = null where (id = 1863913145702961153) and tenant_id = '000000'
    Execute Time: 99.193ms
    ==============  Sql  End   ==============
    
    2024-12-04 13:12:41.829  INFO 45198 --- [nio-8202-exec-7] c.d.p.e.s.ItemInventorySubscriber        : [订阅] 收到单据出入库事件, 单据Id:1863913145702961153, 操作类型:反审核
    2024-12-04 13:12:46.008  INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor    : 
    2024-12-04 13:13:01.007  INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor    : 
    
    ==============  Sql Start  ==============
    Execute SQL : update inventory set `category_id` = 1851586292367704065, `item_name` = '品名:', `sku_cost_price` = 333.00, `season_ids` = 'spring', `stock_num` = `stock_num` + -5 where (id = 1864136016849248258) and tenant_id = '000000'
    Execute Time: 37.772ms
    ==============  Sql  End   ==============

    这是执行的日志,同一个线程中运行的 [nio-8202-exec-7]


    0 讨论(0)
  • 13小时前

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

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


    作者追问:12小时前

    对外抛异常试试


    回答: 12小时前

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


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


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


    image.png


    回答: 12小时前

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

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

    都可以


    回答: 12小时前

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

    image.png

    作者追问:4小时前

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


    /**

    * 发布事件

    *

    * @param event 事件

    */

    @SneakyThrows

    public static void publishEvent(ApplicationEvent event) {

    if (context == null) {

    return;

    }

    context.publishEvent(event);

    }


    0 讨论(0)
提交回复