wxrqforever opened a new issue, #7047:
URL: https://github.com/apache/incubator-seata/issues/7047

   一、相关组件版本
   ```
           <dependency>
               <groupId>org.apache.seata</groupId>
               <artifactId>seata-spring-boot-starter</artifactId>
               <version>>2.1.0</version>
           </dependency>
           <dependency>
               <groupId>com.alibaba.nacos</groupId>
               <artifactId>nacos-client</artifactId>
               <version>2.4.2</version>
           </dependency>
   
           <dependency>
               <groupId>com.alibaba.cloud</groupId>
               <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
               <version>2021.0.6.1</version>
               <exclusions>
                   <exclusion>
                       <groupId>io.seata</groupId>
                       <artifactId>seata-spring-boot-starter</artifactId>
                   </exclusion>
               </exclusions>
           </dependency>
   ```
   ```
   seata-server:2.1 
   ```
   二、问题描述
   业务想接入改造成TCC,所以先用一个简单的例子验证一下特性,发现一直达不到效果。
   
   1.tcc相关注解在接口
   
   代码如下:
   
   ```
   public class GlobalTransactionTestController {
      @GetMapping("/testTcc")
       @GlobalTransactional
       public ResultGeneralModel<Boolean> testTcc() {
           log.info("测试tcc事务务");
           tccTestService.prepare(null,123);
           int i = 1/0;
           return ResultGeneralModel.newSuccess(Boolean.TRUE);
       }
   }
   ```
   ```
   @LocalTCC
   public interface TccTestService {
       @TwoPhaseBusinessAction(name = "TccTestBean", commitMethod = "commit", 
rollbackMethod = "rollback")
       void prepare(BusinessActionContext 
actionContext,@BusinessActionContextParameter(paramName = "a") int a);;
   
       void commit(BusinessActionContext actionContext);
   
   
       void rollback(BusinessActionContext actionContext);
   }
   ```
   ```
   @Component
   @Slf4j
   public class TccTestServiceImpl implements TccTestService {
   
       @Override
       public void prepare(BusinessActionContext actionContext, int a) {
           //一些访问db的动作,省略了,非常简单
           log.info("prepare 被调用");
       }
   
       @Override
       public void commit(BusinessActionContext actionContext) {
           log.info("commit 被调用");
   
       }
   
       @Override
       public void rollback(BusinessActionContext actionContext) {
           log.info("rollback 被调用");
   
       }
   }
   
   ```
   启动正常,tcc resource注册成功:
   ```
   INFO org.apache.seata.core.rpc.netty.RmNettyRemotingClient [main] [] [] will 
register resourceId:TccTestBean
   ```
   
   代码执行后报错,报错日志:
   
   ```
   2024-12-04 20:56:12.615 ERROR[http-nio-8080-exec-1] [] [] 
java.lang.NoSuchMethodException: 
org.springframework.aop.SpringProxy.prepare(org.apache.seata.rm.tcc.api.BusinessActionContext,
 int)
   java.lang.RuntimeException: java.lang.NoSuchMethodException: 
org.springframework.aop.SpringProxy.prepare(org.apache.seata.rm.tcc.api.BusinessActionContext,
 int)
        at 
org.apache.seata.rm.tcc.interceptor.TccActionInterceptorHandler.lambda$parseAnnotation$0(TccActionInterceptorHandler.java:118)
        at 
java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
        at 
org.apache.seata.rm.tcc.interceptor.TccActionInterceptorHandler.parseAnnotation(TccActionInterceptorHandler.java:103)
        at 
org.apache.seata.rm.tcc.interceptor.TccActionInterceptorHandler.doInvoke(TccActionInterceptorHandler.java:71)
        at 
org.apache.seata.integration.tx.api.interceptor.handler.AbstractProxyInvocationHandler.invoke(AbstractProxyInvocationHandler.java:43)
        at 
org.apache.seata.spring.annotation.AdapterSpringSeataInterceptor.invoke(AdapterSpringSeataInterceptor.java:44)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
        at 
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
        at 
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at 
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
        at 
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
        at 
xxx.TccTestServiceImpl$$EnhancerBySpringCGLIB$$953891f3.prepare(<generated>)
        at 
xxxxx.seata.GlobalTransactionTestController.testTcc(GlobalTransactionTestController.java:77)
        at 
xxxxx.seata.GlobalTransactionTestController$$FastClassBySpringCGLIB$$14f5a059.invoke(<generated>)
   ```
   debug定位了一下报错的地方,这里拿到的接口是SpringProxy,八成是spring代理的,这个接口里肯定是没有的preapre
   
org.apache.seata.rm.tcc.interceptor.TccActionInterceptorHandler#parseAnnotation
   
   <img width="1089" alt="image" 
src="https://github.com/user-attachments/assets/b4f76c0e-7440-46ca-b95d-88dbaf3da0ca";>
   
   2.tcc相关注解在实现类
   看了和tcc使用的相关issue,怀疑是注解的位置导致的,因此我将注解移动到了实现类中,
   
   ```
   public interface TccTestService {
       void prepare(BusinessActionContext actionContext, int a);;
   
       void commit(BusinessActionContext actionContext);
   
   
       void rollback(BusinessActionContext actionContext);
   }
   ```
   ```
   @Component
   @Slf4j
   @LocalTCC
   public class TccTestServiceImpl implements TccTestService {
   
       @Override
       @TwoPhaseBusinessAction(name = "TccTestBean", commitMethod = "commit", 
rollbackMethod = "rollback")
       public void prepare(BusinessActionContext actionContext, 
@BusinessActionContextParameter(paramName = "a") int a) {
           //一些访问db的动作,省略了,非常简单
           log.info("prepare 被调用");
       }
   
       @Override
       public void commit(BusinessActionContext actionContext) {
           log.info("commit 被调用");
   
       }
   
       @Override
       public void rollback(BusinessActionContext actionContext) {
           log.info("rollback 被调用");
   
       }
   }
   
   ```
   启动后,虽然tm 和rm注册成功. 但是并没有看到tcc resource注册成功的这条日志:
   ```
   INFO org.apache.seata.core.rpc.netty.RmNettyRemotingClient [main] [] [] will 
register resourceId:TccTestBean
   ```
   
   代码执行后,确实返回了/ by zero异常,但是cacnel方法并没有被回调。
   
   
   
   以上,希望能得到帮助,多谢!
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org
For additional commands, e-mail: notifications-h...@seata.apache.org

Reply via email to