开发者社区 > 云原生 > 中间件 > 正文

Seata中我按公告中的demo使用TCC模式,现在无法得到参数怎么解决?

Seata中我按公告中的demo使用TCC模式,发现在commit和cancel
阶段无法从BusinessActionContext 中获取被@BusinessActionContextParameter标记的参数,这要怎么解决?我看源码里面这个,获取的是0 但是我是有参数的。4b0e5795c90aa9f81825a660cf3433cb.png

展开
收起
小小鹿鹿鹿 2024-01-09 23:35:12 106 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    这个问题可能是由于在TCC模式下,BusinessActionContext 的参数传递方式发生了变化。在 TCC 模式下,参数是通过 XAResource.prepare(xid) 方法传递给事务的,而不是通过 BusinessActionContext。因此,你需要修改你的代码,以便正确地从 XAResource 中获取参数。

    以下是一个示例,展示了如何在 TCC 模式下从 XAResource 中获取参数:

    import javax.transaction.xa.XAException;
    import javax.transaction.xa.XAResource;
    import org.springframework.transaction.interceptor.TransactionAttribute;
    import org.springframework.transaction.interceptor.TransactionAttributeSource;
    
    public class TccTransactionAttributeSource implements TransactionAttributeSource {
    
        @Override
        public TransactionAttribute getTransactionAttribute(Method method, Class<?> targetClass) {
            return new TransactionAttribute() {
                @Override
                public boolean isReadOnly() {
                    return false;
                }
    
                @Override
                public String getRollbackFor() {
                    return "ROLLBACK";
                }
    
                @Override
                public String getPropagationBehavior() {
                    return "PROPAGATION_REQUIRED";
                }
            };
        }
    
        @Override
        public boolean requiresTransactionSynchronization(Method method) {
            return true;
        }
    }
    

    在你的业务类中,你需要实现一个 org.springframework.transaction.interceptor.InvocationCallback 接口,并在 invoke 方法中从 XAResource 中获取参数。例如:

    import org.springframework.transaction.interceptor.InvocationCallback;
    import org.springframework.transaction.interceptor.LocalTransactionManager;
    import org.springframework.transaction.interceptor.TransactionAspectSupport;
    
    public class TccInvocationCallback implements InvocationCallback {
    
        private final LocalTransactionManager transactionManager;
        private final XAResource xaResource;
    
        public TccInvocationCallback(LocalTransactionManager transactionManager, XAResource xaResource) {
            this.transactionManager = transactionManager;
            this.xaResource = xaResource;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 在这里从 XAResource 中获取参数
            // ...
    
            // 调用原始方法并返回结果
            return method.invoke(proxy, args);
        }
    }
    

    最后,你需要将这个 InvocationCallback 添加到你的 TransactionInterceptor 中:

    import org.springframework.transaction.interceptor.TransactionAttributeSource;
    import org.springframework.transaction.interceptor.TransactionInterceptor;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.support.TransactionTemplate;
    import org.springframework.transaction.xa.XATransactionManager;
    
    public class TccTransactionInterceptor extends TransactionInterceptor {
    
        private final PlatformTransactionManager transactionManager;
        private final XATransactionManager xaTransactionManager;
    
        public TccTransactionInterceptor(PlatformTransactionManager transactionManager, XATransactionManager xaTransactionManager) {
            this.transactionManager = transactionManager;
            this.xaTransactionManager = xaTransactionManager;
        }
    
        @Override
        protected void doInTransaction(Object transactionStatus) {
            // 在这里使用 XAResource 进行 TCC 操作
            // ...
        }
    }
    

    这样,你就可以在 TCC 模式下正确地从 XAResource 中获取参数了。

    2024-01-13 18:16:51
    赞同 展开评论 打赏
  • 需要在接口实现对应的方法中也加上@BusinessActionContextParameter 就可以了(接口上反而没用,有点奇怪,和文档上写的不一样)此回答来自钉群3群-Apache Seata(incubating) 开源讨论群。

    2024-01-10 07:53:56
    赞同 展开评论 打赏

为企业提供高效、稳定、易扩展的中间件产品。

热门讨论

热门文章

相关电子书

更多
《Seata 1.3 新特性以及如何参与社区》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载