dromara / hmily

Distributed transaction solutions
https://dromara.org
Apache License 2.0
4.11k stars 1.4k forks source link

用dubbo注解的方式作为rpc调用,consumer不会confirm #271

Closed MarcusJiang1306 closed 3 years ago

MarcusJiang1306 commented 3 years ago

Describe the bug

如题, 我尝试用dubbo的方式进行rpc调用, provider是确认了但是consumer没有确认的动作. 看报错我感觉有点类似 #236
在consumer启动的时候会有以下error出现

 org.dromara.hmily.spi.ExtensionLoader    : not found service provider for : org.dromara.hmily.core.field.AnnotationField

而且在consumer第一次调用provider的时候在provider会出现以下error

org.dromara.hmily.spi.ExtensionLoader    : not found service provider for : org.dromara.hmily.core.service.HmilyTransactionHandlerFactory

Environment

<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<dubbo.version>2.7.7</dubbo.version>
<hmily.version>2.1.1</hmily.version>

Steps to reproduce

https://github.com/MarcusJiang1306/dubbo-hmily-demo bug演示我放在这个库下面了, 里面有个sql文件,把数据表配好数据弄好然后起provider和consumer,再用swagger去调用就能复现

或者不用连数据库 用dubbo注解的方式定义provider和consumer,再用hmily配置主方法和confirm和cancel方法,当consumer调用完provider,consumer就是不会去confirm

provider

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.hmily.annotation.HmilyTCC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@DubboService(retries = 0)
public class EchoServiceImpl implements EchoService {

    @Override
    @HmilyTCC(confirmMethod = "confirm", cancelMethod = "cancel")
    public boolean echo(Object o) {
        log.info("provider update called");
        log.info("{}",o.toString);
        return true;
    }

    public boolean confirm(Object o) {
        log.info("provider update confirmed");
        log.info("{}",o.toString);
        return true;
    }

    public boolean cancel(Object o) {
        log.info("provider update cancelled");
        log.info("{}",o.toString);
        return true;
    }
}

consumer

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.hmily.annotation.HmilyTCC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class ConsumerFXServiceImpl implements ConsumerFXService {

    @DubboReference
    private EchoService echoService ;

    @Override
    @HmilyTCC(confirmMethod = "confirm", cancelMethod = "cancel")
    public int doUpdate(Object o) {
        log.info("consumer update called");
        echoService .echo("hello");
        return 1;
    }

    public void confirm(Object o) {
        log.info("consumer update confirmed");
        log.info("{}",o.toString);
    }

    public void cancel(Object o) {
        log.info("consumer update cancelled");
        log.info("{}",o.toString);
    }
}

Expected behavior

consumer 也应该执行confirm方法

Debug logs

Click to expand provider debug log ``` 2020-12-16 00:22:15.134 DEBUG 16212 --- [:20000-thread-2] o.s.a.aspectj.AspectJExpressionPointcut : Could not access current invocation - matching with limited context: java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor! In addition, ExposeInvocationInterceptor and ExposeInvocationInterceptor.currentInvocation() must be invoked from the same thread. 2020-12-16 00:22:15.149 ERROR 16212 --- [:20000-thread-2] org.dromara.hmily.spi.ExtensionLoader : not found service provider for : org.dromara.hmily.core.service.HmilyTransactionHandlerFactory 2020-12-16 00:22:15.156 DEBUG 16212 --- [:20000-thread-2] o.d.h.t.e.HmilyTccTransactionExecutor : ......hmily tcc transaction starter.... ```
MarcusJiang1306 commented 3 years ago

我的问题,经过研究没配aspect和contextAware tcc的依赖也配 回头整理完出文章去