Code Monkey home page Code Monkey logo

bytetcc's People

Contributors

liuyangming avatar liuyangming9f avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bytetcc's Issues

byteTCC 是如何保证 try/confirm/cancle 的调用幂等的?

您好, 请问, byteTCC 是如何保证 try/confirm/cancle 的调用幂等的? 比如, 我在服务A 中调用了 b, c 服务, 然后, b 出现问题了, 这个时候 c 的cancle 会被调用吗? 这个时候, 如何保证调用幂等的? 谢谢...

运行报错

hi,你好,最近看了你的项目,仔细看完了wiki,并且按照上面的示例把bytetcc集成到了自己项目里。但是问题来了,一直报错 [http-bio-8080-exec-2] [org.mybatis.spring.SqlSessionUtils]
DEBUG Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64cda98f]
2017-05-08.14:30:37.598 [http-bio-8080-exec-2] [org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter] ERROR Error occurred in remote call!
java.lang.IllegalStateException: Only compensable transaction can propagate its transaction context to the remote node!。我参考了WIKI 上的FAQ,刚好符合第六条的 2)。但是我检查过了代码,是有加@Compensable注解的。测试了很久还是会报上面的错。。。。。。。。。。。。目前还没解决。想请问还有其他的地方会影响吗?另外,我用的spring版本是4.0.3release。有个奇怪的问题是TransactionManagerImpl.begin()的执行是在CompensableMethodInterceptor.invoke(MethodInvocation mi)之前执行的。。。。。。。。。。。。。。。能帮忙看下吗。谢谢了

spring boot data jpa 能支持不?

请问是否支持spring boot data jpa,我按jpa方式配置,服务启动没问题,但是运行到jpa的Repository更新操作的时候,数据库没有任何变化,结果就是Jpa Repository事务提交失败,该如何搞呢?

当不使用Controller实现Service的try阶段,造成的cancel方法不被调用问题

问题描述

在使用demo项目provider和consumer过程中,我测试各个阶段抛出异常的处理逻辑,逻辑都是没有问题,但是直接在Controller层实现了Service接口的try阶段方法这种做法,私以为不够优雅,于是新写了一个Service实现类,实现了try阶段逻辑,并在Controller层注入使用,代码如下:

AccountServiceImpl.java

@Service("accountService")
@Compensable(interfaceClass = IAccountService.class, confirmableKey = "accountServiceConfirm", cancellableKey = "accountServiceCancel")
public class AccountServiceImpl implements IAccountService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional
    public void increaseAmount(String accountId, double amount) {
        int value = this.jdbcTemplate.update("update tb_account_one set frozen = frozen + ? where acct_id = ?", amount, accountId);
        if (value != 1) {
            throw new IllegalStateException("ERROR!");
        }
        System.out.printf("exec increase: acct= %s, amount= %7.2f%n", accountId, amount);
    }

    @Transactional
    public void decreaseAmount(String accountId, double amount) {
        int value = this.jdbcTemplate.update("update tb_account_one set amount = amount - ?, frozen = frozen + ? where acct_id = ?", amount, amount, accountId);
        if (value != 1) {
            throw new IllegalStateException("ERROR!");
        }
        System.out.printf("exec decrease: acct= %s, amount= %7.2f%n", accountId, amount);

        // throw new IllegalStateException("error");
    }
}

AccountController.java

@RestController
public class AccountController {

    @Resource(name = "accountService")
    private IAccountService iAccountService;

    @ResponseBody
    @RequestMapping(value = "/increase", method = RequestMethod.POST)
    public void increaseAmount(@RequestParam("acctId") String acctId, @RequestParam("amount") double amount) {
        iAccountService.increaseAmount(acctId, amount);
    }

    @ResponseBody
    @RequestMapping(value = "/decrease", method = RequestMethod.POST)
    public void decreaseAmount(@RequestParam("acctId") String acctId, @RequestParam("amount") double amount) {
        iAccountService.decreaseAmount(acctId, amount);
    }

}

如果改成这样之后当在consumer的try阶段抛出异常,provider的try阶段和confirm阶段都会被调用,并且cancel阶段不会被调用,猜想可能的事务传播问题,于是在Controller的方法上也都加上@transactional,之后在前面的那种情况下provider的confirm阶段不会再被调用,但是仍然没有调用cancel补偿provider的try阶段。

最终将Service上的@Compensable注解移动到Controller上一切恢复正常

即使用如下代码:
AccountServiceImpl.java

@Service("accountService")
public class AccountServiceImpl implements IAccountService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional
    public void increaseAmount(String accountId, double amount) {
        int value = this.jdbcTemplate.update("update tb_account_one set frozen = frozen + ? where acct_id = ?", amount, accountId);
        if (value != 1) {
            throw new IllegalStateException("ERROR!");
        }
        System.out.printf("exec increase: acct= %s, amount= %7.2f%n", accountId, amount);
    }

    @Transactional
    public void decreaseAmount(String accountId, double amount) {
        int value = this.jdbcTemplate.update("update tb_account_one set amount = amount - ?, frozen = frozen + ? where acct_id = ?", amount, amount, accountId);
        if (value != 1) {
            throw new IllegalStateException("ERROR!");
        }
        System.out.printf("exec decrease: acct= %s, amount= %7.2f%n", accountId, amount);

        // throw new IllegalStateException("error");
    }
}

AccountController.java

@Compensable(interfaceClass = IAccountService.class, confirmableKey = "accountServiceConfirm", cancellableKey = "accountServiceCancel")
@RestController
public class AccountController {

    @Resource(name = "accountService")
    private IAccountService iAccountService;

    @ResponseBody
    @RequestMapping(value = "/increase", method = RequestMethod.POST)
    @Transactional
    public void increaseAmount(@RequestParam("acctId") String acctId, @RequestParam("amount") double amount) {
        iAccountService.increaseAmount(acctId, amount);
    }

    @ResponseBody
    @RequestMapping(value = "/decrease", method = RequestMethod.POST)
    @Transactional
    public void decreaseAmount(@RequestParam("acctId") String acctId, @RequestParam("amount") double amount) {
        iAccountService.decreaseAmount(acctId, amount);
    }

}

PS consumer项目的SQL少了frozen字段

在一个可补偿事务中调用另一个服务,要求调用的服务也必须使用ByteTCC问题

问题描述

如题,在开发一个支付扣款功能中使用了ByteTCC,在try阶段会调用一个Spring Cloud的生成订单号的服务,由于生成订单号的服务并没有使用ByteTCC,抛出如下异常:

org.bytesoft.bytetcc.CompensableTransactionImpl:337||408d5c1b841f000001600bb083ba00015b4d576e| error occurred while confirming remote branch: *.*.*.*:COMMON-SERVICE:10003, transaction is not exists! || ||
org.bytesoft.bytetcc.CompensableTransactionImpl:179||408d5c1b841f000001600bb083ba00015b4d576e| confirm remote branchs failed! org.bytesoft.transaction.CommitRequiredException: null

由于生成订单号服务自己保证了幂等性,并且调用方配置了Spring Cloud的重试机制,所以并不考虑在生成订单号服务使用ByteTCC。

是否有方法可以避免将事务传播到其他在事务中调用的服务?

事务不能回滚,也不近cancel类

你好!
我的框架是spring+mybatis
下面是我的代码

@Service("tbAccountOneService")
@Compensable(interfaceClass= TbAccountOneService.class, cancellableKey = "tbAccountOneCancel")
public class TbAccountOneServiceImpl implements TbAccountOneService {
    @Autowired
    TbAccountOneMapper tbAccountOneMapper;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void insert(TbAccountOne tbAccountOne) throws Exception {
        tbAccountOneMapper.insertSelective(tbAccountOne);
        throw new Exception();
    }
}

当我执行到throw new Exception();后不会回滚,也不进tbAccountOneCancel。

不知道是不是我哪里理解错了。
谢谢。

事务 Context 在分支事务间是如何传递的

请教一个问题,从根事务开始,Context 需要传递到分支事务中,这是在哪里做的能否提示一下?
另外,org.bytesoft.transaction.TransactionContext 是全局事务的,org.bytesoft.compensable.TransactionContext 是分支,这样理解没问题吧;
然后看到这里没有可扩展的字段,比如我需要一个字段来传递到所有分支事务,目前好像无法实现

谢谢

请问com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at end of file怎么解决

com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at end of file
at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697) ~[hessian-4.0.38.jar:na]
at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177) ~[hessian-4.0.38.jar:na]
at org.bytesoft.common.utils.CommonUtils.deserializeObject(CommonUtils.java:62) ~[bytejta-core-0.4.0-alpha4.jar:na]
at org.bytesoft.bytetcc.supports.springcloud.web.CompensableRequestInterceptor.invokeAfterRecvResponse(CompensableRequestInterceptor.java:193) ~[bytetcc-supports-springcloud-0.4.0-beta2.jar:na]
at org.bytesoft.bytetcc.supports.springcloud.web.CompensableRequestInterceptor.intercept(CompensableRequestInterceptor.java:150) ~[bytetcc-supports-springcloud-0.4.0-beta2.jar:na]
at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:86) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:70) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:652) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407) ~[spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at com.bytesvc.consumer.service.impl.TransferService.transfer(TransferService.java:40) ~[classes/:na]
at com.bytesvc.consumer.controller.TransferController.transfer(TransferController.java:38) ~[classes/:na]
at com.bytesvc.consumer.controller.TransferController$$FastClassBySpringCGLIB$$d59c2c04.invoke() ~[classes/:na]

跟eureka有耦合么?

spring-cloud-starter-zookeeper-discovery
使用直接连接zk做的负载。不行,要用eureka才正常

bytetcc-supports 里好多类编译不过

CompensableDubboServiceFilter.java里引用的好多类找不到,如
org.bytesoft.bytejta.supports.dubbo.DubboRemoteCoordinator 没jar,也google不到,最终导致编译不过
类似的有:
import org.bytesoft.bytejta.supports.dubbo.DubboRemoteCoordinator;
import org.bytesoft.bytejta.supports.invoke.InvocationContext;
import org.bytesoft.bytejta.supports.rpc.TransactionRequestImpl;
import org.bytesoft.bytejta.supports.rpc.TransactionResponseImpl;
import org.bytesoft.bytejta.supports.wire.RemoteCoordinator;
import org.bytesoft.bytejta.supports.wire.RemoteCoordinatorRegistry;

dubbo中使用时 消费者报错

java.lang.IllegalStateException: Class com.javaxxw.manager.service.impl.TransferServiceImpl does not implement interface org.bytesoft.bytetcc.supports.spring.aware.CompensableBeanNameAware, and there are multiple bean definitions!
at org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor.invoke(CompensableMethodInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.javaxxw.manager.service.impl.TransferServiceImpl$$EnhancerBySpringCGLIB$$c5a4e117.transfer()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

当发生异常的时候没有调用Cancel类方法

Hi,
你好!
当我在运行你的示例代码的时候,发现一个问题,请看下面代码:
sample-consumer module:

public class MultiDsTransferServiceImpl implements ITransferService {
    ...
    @Transactional(rollbackFor = ServiceException.class)
    public void transfer(String sourceAcctId, String targetAcctId, double amount) throws ServiceException {

	     this.nativeAccountService.decreaseAmount(sourceAcctId, amount);
	     this.increaseAmount(targetAcctId, amount);

	    throw new ServiceException("rollback");
    }
    ...
}

我把你注释的那个异常打开,按我拉理解,应该是AccountServiceCancel.decreaseAmount 和 TransferServiceCancel.transfer 两个方法都应该被调用, 但实际只是AccountServiceCancel.decreaseAmount 被触发, 而TransferServiceCancel.transfer 没有被调用。请看下面日志:

com.bytesvc.service.impl.AccountServiceImpl: exec decrease: acct= 1001, amount=    1.00
com.bytesvc.service.impl.MultiDsTransferServiceImpl: exec increase: acct= 2001, amount=    1.00
com.bytesvc.service.cancel.AccountServiceCancel: undo decrease: acct= 1001, amount=    1.00
com.bytesvc.ServiceException: rollback
     at com.bytesvc.service.impl.MultiDsTransferServiceImpl.transfer(MultiDsTransferServiceImpl.java:29)
       # ...

不知道这是bug还是我的理解有误?
能否解释一下。
谢谢。

按照例子没跑起来

实在是不理解例子中的查询语句之间的关系,用Spring cloud按照例子写了一遍,没有跑起来。
使用fegin调用服务,抛出异常后被调用的服务并未进入回滚。

bytetcc使用,beanFactory.getCompensableCoordinator()报空指针

场景:

  1. A服务提供一个rpc接口,配置的TCC
  2. B服务提供一个rpc接口,配置了TCC
  3. C服务的Controller中注入了A服务和B服务的接口,进行调用,先调用A服务接口,再调用B服务接口
    C服务不操作DB,只提供RestController
    在调用过程遇到下列问题,如下是错误日志

java.lang.NullPointerException: null
at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.consumerInvokeForSVC(CompensableServiceFilter.java:364) ~[classes/:na]
at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.consumerInvoke(CompensableServiceFilter.java:330) ~[classes/:na]
at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.invoke(CompensableServiceFilter.java:71) ~[classes/:na]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) ~[dubbo-2.5.3.jar:2.5.3]
at com.alibaba.dubbo.common.bytecode.proxy4.create(proxy4.java) ~[na:2.5.3]
at com.jiuyescm.account.controller.NotFoundController.tcc(NotFoundController.java:61) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_45]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_45]
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) ~[spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) ~[spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931) [spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822) [spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:735) [javax.servlet.jar:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807) [spring-webmvc-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) [javax.servlet.jar:na]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) [jetty-servlet.jar:8.1.14.v20131031]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1496) [jetty-servlet.jar:8.1.14.v20131031]
at com.jiuyescm.account.filter.CookieFilter.doFilter(CookieFilter.java:70) [classes/:na]
at com.jiuyescm.account.filter.LoginFilter.doFilter(LoginFilter.java:97) [classes/:na]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1484) [jetty-servlet.jar:8.1.14.v20131031]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) [spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) [spring-web-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1476) [jetty-servlet.jar:8.1.14.v20131031]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499) [jetty-servlet.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) [jetty-security.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428) [jetty-servlet.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.Server.handle(Server.java:370) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) [jetty-http.jar:8.1.14.v20131031]
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-http.jar:8.1.14.v20131031]
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) [jetty-server.jar:8.1.14.v20131031]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667) [jetty-io.jar:8.1.14.v20131031]
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) [jetty-io.jar:8.1.14.v20131031]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) [jetty-util.jar:8.1.14.v20131031]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) [jetty-util.jar:8.1.14.v20131031]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45]

Who is using ByteTCC?

Thank you to everyone who likes, follows and uses ByteTCC. Your support is the greatest encouragement to ByteTCC.

非常感谢每一位关注并使用ByteTCC的朋友,你们的支持是对ByteTCC最大的鼓励。

The purpose of this issue

  • We want to attract more people to participate in the contribution;
  • We want to find friends who are also using ByteTCC;
  • We will push you our recently documents, release report etc.

本Issue的目的

  • 希望能吸引更多的人来参与贡献;
  • 发现你身边使用ByteTCC的朋友;
  • 向您推送最新的Bug更新,文档等;

How to do

Submit a comment here, including:

  • Your company, school or organization;
  • Your city;
  • Your contact information: blog/twitter, email (at least one).

Thank you!

怎么参与

在此提交一条评论, 评论内容包括:

  • 你所在公司, 学校或组织
  • 你所在的城市
  • 你的联系方式: 微博, 邮箱 (至少一个)

感谢你的参与!

怎么去除dubbo依赖?

我看源码引用了dubbo-support里的代码,如果我不配置dubbo-config文件,启动直接报错

关于CompensableLoadBalancerRuleImpl 的疑问和建议

在排查代码的过程中发现,byte定义了一个IRule 叫做 CompensableLoadBalancerRuleImpl,这个类定义了随机的负载均衡策略,同时运行了 interceptor.afterCompletion(server);
@see CompensableLoadBalancerRuleImpl


package org.bytesoft.bytetcc.supports.springcloud.loadbalancer;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.Random;
import org.bytesoft.bytetcc.supports.springcloud.SpringCloudBeanRegistry;
import org.bytesoft.bytetcc.supports.springcloud.loadbalancer.CompensableLoadBalancerInterceptor;

public class CompensableLoadBalancerRuleImpl extends AbstractLoadBalancerRule implements IRule {
    static Random random = new Random();
    private IClientConfig clientConfig;

    public CompensableLoadBalancerRuleImpl() {
    }

    public Server choose(Object key) {
        SpringCloudBeanRegistry registry = SpringCloudBeanRegistry.getInstance();
        CompensableLoadBalancerInterceptor interceptor = registry.getLoadBalancerInterceptor();
        if(interceptor == null) {
            return this.chooseServer(key);
        } else {
            ILoadBalancer loadBalancer = this.getLoadBalancer();
            List servers = loadBalancer.getAllServers();
            Server server = null;

            try {
                List serverList = interceptor.beforeCompletion(servers);
                server = this.chooseServer(key, serverList);
            } finally {
                interceptor.afterCompletion(server);
            }

            return server;
        }
    }

    public Server chooseServer(Object key) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        List reachableServers = loadBalancer.getReachableServers();
        List allServers = loadBalancer.getAllServers();
        return reachableServers != null && !reachableServers.isEmpty()?(Server)reachableServers.get(random.nextInt(reachableServers.size())):(allServers != null && !allServers.isEmpty()?(Server)allServers.get(random.nextInt(allServers.size())):null);
    }

    public Server chooseServer(Object key, List<Server> serverList) {
        return serverList != null && !serverList.isEmpty()?(serverList.size() == 1?(Server)serverList.get(0):(Server)serverList.get(random.nextInt(serverList.size()))):null;
    }

    public void initWithNiwsConfig(IClientConfig clientConfig) {
        this.clientConfig = clientConfig;
    }

    public IClientConfig getClientConfig() {
        return this.clientConfig;
    }
}

因为我们的项目中自定义了 IRule

参考代码:

    @Bean
    @Scope("prototype")
    public IRule getIRule() {
        return new IRuleFactory();
    }

导致这个负载均衡器失效了,出现了调用的provider 事物不被确认的情况。反过来说如果bytetcc 的 IRule 生效了,那么我自定义的负载均衡策略就失效了,这又导致了不兼容的情况。

也不知道我理解的对不对

LocalXADataSource transactionManager NullPointerException

Hi,
你好!
不好意思,再次打扰。
我试着把bytetcc 集成到springboot的时候,我遇到了LocalXADataSource transactionManager NullPointerException,

请看现在配置和代码:

pom.xml

	<dependency>
		<groupId>commons-dbutils</groupId>
		<artifactId>commons-dbutils</artifactId>
		<version>1.6</version>
	</dependency>
	<dependency>
		<groupId>org.bytesoft</groupId>
		<artifactId>bytetcc-common</artifactId>
		<version>0.3.0</version>
	</dependency>
	<dependency>
		<groupId>org.bytesoft</groupId>
		<artifactId>bytetcc-supports</artifactId>
		<version>0.3.0</version>
	</dependency>

因为我是用的yml来配置的数据源,所以LocalXADataSource 的初始化是在代码里面做的,而不是在xml文件

@ConfigurationProperties(prefix = "spring.datasource.common")
@Bean
@Primary
@Qualifier(MAIN_DATA_SOURCE)
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@Qualifier(XA_DATA_SOURCE)
public LocalXADataSource localXADataSource(@Qualifier(MAIN_DATA_SOURCE) DataSource ds) {
    LocalXADataSource dataSource = new LocalXADataSource();
    dataSource.setDataSource(ds);
    return dataSource;
}

@Bean
public JdbcTemplate jdbcTemplate(@Qualifier(XA_DATA_SOURCE) DataSource ds) {
    return new JdbcTemplate(ds);
}

这段代码应该是和你示例代码XML配置等价的:

<bean id="mysql1" class="org.apache.commons.dbcp.BasicDataSource">
	 ...
</bean>
<bean id="dataSource1" class="org.bytesoft.bytejta.supports.jdbc.LocalXADataSource">
	<property name="dataSource" ref="mysql1" />
</bean>
<bean id="jdbcTemplate1" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource1" />
</bean>

但我在运行我的代码的时候,总是报

java.lang.NullPointerException: null
    at org.bytesoft.bytejta.supports.jdbc.LocalXADataSource.getConnection(LocalXADataSource.java:54) ~[bytejta-supports-0.3.0.jar:na]

public class LocalXADataSource extends TransactionListenerAdapter
     ..
public Connection getConnection() throws SQLException {
	TransactionXid transactionXid = null;
	try {
54	        Transaction transaction = (Transaction) this.transactionManager.getTransaction();
		if (transaction == null) {
			return this.dataSource.getConnection();
		}
    ....

transactionManager is null

我试着设置一个transactionManager进去,但是springboot的是org.springframework.jdbc.datasource.DataSourceTransactionManager,
这个类不是javax.transaction.TransactionManager的子类,所以不能放进去.
我又试着初始化一个你实现的TransactionManagerImpl, 但是这个类需要一个TransactionBeanFactoryImpl 实例, 但TransactionBeanFactoryImpl实例又需要一个TransactionManagerImpl,这样就形成了一个环形依赖。不知道怎么来解决。
请问你能提供一下帮助吗?谢谢

还有就是用XML配置的时候,为什么没有这个异常呢?

事务 Propagation 后续是考虑有其它处理吗

这里 org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor#execute() 有段代码(点击直达
)

Propagation propagation = transactional == null ? null : transactional.propagation();
if (propagation == null) {
	compensable.registerCompensable(invocation);
} else if (Propagation.REQUIRED.equals(propagation)) {
	compensable.registerCompensable(invocation);
} else if (Propagation.MANDATORY.equals(propagation)) {
	compensable.registerCompensable(invocation);
} else if (Propagation.SUPPORTS.equals(propagation)) {
	compensable.registerCompensable(invocation);
}

看到处理方法都一样,一开始误以为事务传播性还没有实现,才想起 Spring 的事务模块已经提前处理了;
那么,这里这么写是后续考虑对 Propagation 有其它处理吗?
谢谢

SpringCloudConfiguration 创建Contract 错误导致扩展的AnnotatedParameterProcessor 丢失

原始的 是这样的@see org.bytesoft.bytetcc.supports.springcloud.SpringCloudConfiguration


    @ConditionalOnMissingBean({Contract.class})
    @Bean
    public Contract feignContract() {
        return new SpringMvcContract(annotatedParameterProcessors);
    }

我们查看 SpringMvcContract 的构造器 不难看出,实际上他是有一个可以传入List annotatedParameterProcessors 的构造器,也就是说,允许我们 扩展List annotatedParameterProcessors

	public SpringMvcContract(
			List<AnnotatedParameterProcessor> annotatedParameterProcessors) {
		this(annotatedParameterProcessors, new DefaultConversionService());
	}

在我们的项目中就扩展了一个一个AnnotatedParameterProcessor

    @Bean
    public List<AnnotatedParameterProcessor> setAnnotatedParameterProcessor() {
        List<AnnotatedParameterProcessor> annotatedArgumentResolvers = new ArrayList<>();
        annotatedArgumentResolvers.add(new PathVariableParameterProcessor());
        annotatedArgumentResolvers.add(new RequestParamParameterProcessor());
        annotatedArgumentResolvers.add(new RequestHeaderParameterProcessor());
        annotatedArgumentResolvers.add(new CookieValueParameterProcessor());
        return annotatedArgumentResolvers;
    }

feign 原生也是支持这样扩展的,但是在TCC 中没有调用这个构造器,导致扩展丢失了。建议修改为:


	@Bean
    @ConditionalOnMissingBean
    public  List<AnnotatedParameterProcessor> annotatedParameterProcessors () {
        List<AnnotatedParameterProcessor> annotatedArgumentResolvers = new ArrayList<AnnotatedParameterProcessor>();
        annotatedArgumentResolvers.add(new PathVariableParameterProcessor());
        annotatedArgumentResolvers.add(new RequestParamParameterProcessor());
        annotatedArgumentResolvers.add(new RequestHeaderParameterProcessor());
        return annotatedArgumentResolvers;
    }

	@org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean(feign.Contract.class)
	@org.springframework.context.annotation.Bean
	public feign.Contract feignContract( @Autowired List<AnnotatedParameterProcessor> annotatedParameterProcessors) {
		return new SpringMvcContract(annotatedParameterProcessors);
	}

其中public List annotatedParameterProcessors () 方法创建的其实就是 SpringMvcContract 中的getDefaultAnnotatedArgumentsProcessors(),参考代码:

	private List<AnnotatedParameterProcessor> getDefaultAnnotatedArgumentsProcessors() {

		List<AnnotatedParameterProcessor> annotatedArgumentResolvers = new ArrayList<>();

		annotatedArgumentResolvers.add(new PathVariableParameterProcessor());
		annotatedArgumentResolvers.add(new RequestParamParameterProcessor());
		annotatedArgumentResolvers.add(new RequestHeaderParameterProcessor());

		return annotatedArgumentResolvers;
	}

只不过他是private 的所以只能自己写一遍了。如果框架不做修改,那么我就只有去多创建一个 feign.Contract来覆盖你的了,但是我觉得这样不好,容易有歧义毕竟我只想扩展List ,既然feign 原生都支持这样扩展,那么TCC 也应该支持。

IllegalStateException: AnnotationAwareAspectJAutoProxyCreator is only available on Java 1.5 and higher

<dependency> <groupId>org.bytesoft</groupId> <artifactId>bytetcc-supports</artifactId> <version>0.3.0-SNAPSHOT</version> </dependency>
未添加依赖前,项目可以正常启动。添加依赖后报
Caused by: java.lang.IllegalStateException: AnnotationAwareAspectJAutoProxyCreator is only available on Java 1.5 and higher at org.springframework.aop.config.AopConfigUtils.getAspectJAnnotationAutoProxyCreatorClassIfPossible(AopConfigUtils.java:134) at org.springframework.aop.config.AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(AopConfigUtils.java:99) at org.springframework.aop.config.AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(AopNamespaceUtils.java:71) at org.springframework.aop.config.AspectJAutoProxyBeanDefinitionParser.parse(AspectJAutoProxyBeanDefinitionParser.java:41) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398) ... 68 more

升级到 0.4.11 NoSuchMethodError

使用 ByteTCC-sample 最新代码,出现下面的异常

2018-04-24 10:39:15,905 INFO  [main] org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@39fe9ce1: startup date [Tue Apr 24 10:39:15 CST 2018]; root of context hierarchy
2018-04-24 10:39:15,977 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [application.xml]
2018-04-24 10:39:16,104 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-supports-dubbo.xml]
2018-04-24 10:39:16,140 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-disable-tx-advice.xml]
2018-04-24 10:39:16,164 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-supports-dubbo-core.xml]
2018-04-24 10:39:16,184 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-supports-jta.xml]
2018-04-24 10:39:16,202 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-supports-tcc.xml]
2018-04-24 10:39:16,229 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [bytetcc-supports-task.xml]
2018-04-24 10:39:16,306 INFO  [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [dubbo-consumer.xml]
2018-04-24 10:39:16,829 WARN  [main] org.bytesoft.bytetcc.supports.dubbo.validator.ReferenceConfigValidator - The remote call method(public abstract void com.bytesvc.service.IAccountService.increaseAmount(java.lang.String,double) throws com.bytesvc.ServiceException) should be declared to throw a remote exception: org.bytesoft.compensable.RemotingException!
2018-04-24 10:39:16,829 WARN  [main] org.bytesoft.bytetcc.supports.dubbo.validator.ReferenceConfigValidator - The remote call method(public abstract void com.bytesvc.service.IAccountService.decreaseAmount(java.lang.String,double) throws com.bytesvc.ServiceException) should be declared to throw a remote exception: org.bytesoft.compensable.RemotingException!
2018-04-24 10:39:16,835 INFO  [main] org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2018-04-24 10:39:16,897 INFO  [main] org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0' of type [org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-04-24 10:39:17,715 INFO  [ZkClient-EventThread-18-localhost:2181] org.I0Itec.zkclient.ZkEventThread - Starting ZkClient event thread.
2018-04-24 10:39:22,325 INFO  [main-EventThread] org.I0Itec.zkclient.ZkClient - zookeeper state changed (SyncConnected)
2018-04-24 10:39:22,624 INFO  [main] org.springframework.transaction.jta.JtaTransactionManager - Using JTA UserTransaction: org.bytesoft.bytetcc.UserCompensableImpl@128bc54a
2018-04-24 10:39:22,625 INFO  [main] org.springframework.transaction.jta.JtaTransactionManager - Using JTA TransactionManager: org.bytesoft.bytetcc.TransactionManagerImpl@488d3603
2018-04-24 10:39:27,071 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| register compensable service: 0a002700000400000162f5851c0d000154a084d1.
2018-04-24 10:39:27,173 INFO  [main] org.bytesoft.bytetcc.CompensableManagerImpl - 0a002700000400000162f5851c0d000154a084d1| compensable transaction begin!
2018-04-24 10:39:27,241 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| enlist remote resource: 192.168.99.1:sample-provider:20882.
2018-04-24 10:39:27,279 INFO  [main] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162f5851c0d000154a084d1] rollback-transaction start
2018-04-24 10:39:27,280 INFO  [main] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162f5851c0d000154a084d1] rollback-transaction complete successfully
2018-04-24 10:39:27,280 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| The operation in try phase is rolled back, so the cancel operation is ignored, compensable service: 0a002700000400000162f5851c0d000154a084d1.
Exception in thread "main" java.lang.NoSuchMethodError: org.bytesoft.compensable.CompensableInvocation.isEnlisted()Z
	at org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor.afterBegin(CompensableMethodInterceptor.java:63)
	at org.bytesoft.bytetcc.CompensableManagerImpl.invokeBegin(CompensableManagerImpl.java:167)
	at org.bytesoft.bytetcc.CompensableManagerImpl.begin(CompensableManagerImpl.java:146)
	at org.bytesoft.bytetcc.TransactionManagerImpl.begin(TransactionManagerImpl.java:54)
	at org.bytesoft.bytetcc.UserCompensableImpl.begin(UserCompensableImpl.java:87)
	at org.springframework.transaction.jta.JtaTransactionManager.doJtaBegin(JtaTransactionManager.java:875)
	at org.springframework.transaction.jta.JtaTransactionManager.doBegin(JtaTransactionManager.java:832)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor.execute(CompensableMethodInterceptor.java:193)
	at org.bytesoft.bytetcc.supports.spring.CompensableMethodInterceptor.invoke(CompensableMethodInterceptor.java:103)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
	at com.bytesvc.service.impl.AccountServiceImpl$$EnhancerBySpringCGLIB$$3f3902a.decreaseAmount(<generated>)
	at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.wrapResultForProvider(CompensableServiceFilter.java:285)
	at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.providerInvokeForSVC(CompensableServiceFilter.java:251)
	at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.providerInvoke(CompensableServiceFilter.java:88)
	at org.bytesoft.bytetcc.supports.dubbo.spi.CompensableServiceFilter.invoke(CompensableServiceFilter.java:71)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
2018-04-24 10:39:27,283 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| cancel remote branch: 192.168.99.1:sample-provider:20882
2018-04-24 10:39:27,283 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| compensable transaction rolled back!
2018-04-24 10:39:27,283 INFO  [main] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162f5851c0d000154a084d1| forget transaction.

CompensableContextAware 没有持久化吗

实现 org.bytesoft.bytetcc.supports.spring.aware.CompensableContextAware 设置自定义信息,confirm 出现异常,修复问题后重启服务,重试 confirm 获取 CompensableContext 信息丢失,这里没有持久化吧

针对这一场景需求,觉得还是应该对本地的做持久化,或者也可支持全局事务 Context 扩展自定义字段

问一个Confirm和Cancel幂等的问题

如果在执行NativeCancel和RemoteCancel时,我看默认使用的是文本log来干的这个事情,如果Cancel的业务代码执行成功了,但是在updateCompensable文本log之前JVM挂了(基于数据库事务业务代码和文本补偿log之间的原子性如何保证),下次jvm启动起来之后,worker又会读入updateCompensable文本log,然后再次执行Cancel的业务代码。这个Cancel的幂等有保证不了(我想的只有在Cancel的业务代码做幂等了)?

我读了一下贵兄的源码,或许可能没有理解到,或者有其他方案可以做,请指点一二,如果我没有描述清楚,请反问我?

多表操作疑问?

看了看/springcloud-sample/sample-provider。
像是单表操作的事务。

要的多表操作的时候是怎么样一个流程呢?这一块不是很了解,请作者给我讲解一下?

TCC confirm 调用错位

调试过程发现一个问题,provider 端 confirm 存在 bug,然后重启,大概率出现事务恢复初始化失败,然后 confirm 重试的时候就不对了, 这个 https://github.com/wujun8/ByteTCC-sample/tree/confirm-compensableContext-bug 可以重现,应该是前面提到的 Map 序列化问题,但是不至于影响到调用链吧

2018-04-25 11:30:47,818 INFO  [ZkClient-EventThread-18-localhost:2181] org.I0Itec.zkclient.ZkEventThread - Starting ZkClient event thread.
2018-04-25 11:30:47,823 ERROR [pool-1-thread-1] org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer - Error occurred while deserializing object: [1, 1, 0, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 72, 97, 115, 104, 77, 97, -16, 1, 1, 3, 1, 100, 97, 116, 97, 45, 97, 102, 116, 101, 114, 45, 114, 101, 115, 116, 97, 114, -12, 3, 1, 49, 49, 49, 49, 50, 50, 50, -78]
com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x1 (�)
	at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177)
	at org.bytesoft.common.utils.SerializeUtils.hessianDeserialize(SerializeUtils.java:165)
	at org.bytesoft.common.utils.CommonUtils.deserializeObject(CommonUtils.java:75)
	at org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer.deserialize(TransactionArchiveDeserializer.java:221)
	at org.bytesoft.bytetcc.logging.ArchiveDeserializerImpl.deserialize(ArchiveDeserializerImpl.java:72)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.execOperation(SampleCompensableLogger.java:161)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.recvOperation(SampleCompensableLogger.java:152)
	at org.bytesoft.bytejta.logging.store.VirtualLoggingSystemImpl.traversal(VirtualLoggingSystemImpl.java:181)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger.recover(SampleCompensableLogger.java:148)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.fireCompensableStartRecovery(TransactionRecoveryImpl.java:92)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.startRecovery(TransactionRecoveryImpl.java:80)
	at org.bytesoft.bytetcc.work.CompensableWork.initializeIfNecessary(CompensableWork.java:43)
	at org.bytesoft.bytetcc.work.CompensableWork.run(CompensableWork.java:55)
	at org.bytesoft.transaction.work.SimpleWork.run(SimpleWork.java:30)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:262)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
2018-04-25 11:30:47,826 ERROR [pool-1-thread-1] org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer - Error occurred while deserializing object: [1, 1, 0, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 72, 97, 115, 104, 77, 97, -16, 1, 1, 3, 1, 100, 97, 116, 97, 45, 97, 102, 116, 101, 114, 45, 114, 101, 115, 116, 97, 114, -12, 3, 1, 49, 49, 49, 49, 50, 50, 50, -78]
com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x1 (�)
	at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177)
	at org.bytesoft.common.utils.SerializeUtils.hessianDeserialize(SerializeUtils.java:165)
	at org.bytesoft.common.utils.CommonUtils.deserializeObject(CommonUtils.java:75)
	at org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer.deserialize(TransactionArchiveDeserializer.java:221)
	at org.bytesoft.bytetcc.logging.ArchiveDeserializerImpl.deserialize(ArchiveDeserializerImpl.java:72)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.execOperation(SampleCompensableLogger.java:161)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.recvOperation(SampleCompensableLogger.java:152)
	at org.bytesoft.bytejta.logging.store.VirtualLoggingSystemImpl.traversal(VirtualLoggingSystemImpl.java:181)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger.recover(SampleCompensableLogger.java:148)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.fireCompensableStartRecovery(TransactionRecoveryImpl.java:92)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.startRecovery(TransactionRecoveryImpl.java:80)
	at org.bytesoft.bytetcc.work.CompensableWork.initializeIfNecessary(CompensableWork.java:43)
	at org.bytesoft.bytetcc.work.CompensableWork.run(CompensableWork.java:55)
	at org.bytesoft.transaction.work.SimpleWork.run(SimpleWork.java:30)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:262)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
2018-04-25 11:30:47,828 ERROR [pool-1-thread-1] org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer - Error occurred while deserializing object: [1, 1, 0, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 72, 97, 115, 104, 77, 97, -16, 1, 1, 3, 1, 100, 97, 116, 97, 45, 97, 102, 116, 101, 114, 45, 114, 101, 115, 116, 97, 114, -12, 3, 1, 49, 49, 49, 49, 50, 50, 50, -78]
com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x1 (�)
	at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177)
	at org.bytesoft.common.utils.SerializeUtils.hessianDeserialize(SerializeUtils.java:165)
	at org.bytesoft.common.utils.CommonUtils.deserializeObject(CommonUtils.java:75)
	at org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer.deserialize(TransactionArchiveDeserializer.java:221)
	at org.bytesoft.bytetcc.logging.ArchiveDeserializerImpl.deserialize(ArchiveDeserializerImpl.java:72)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.execOperation(SampleCompensableLogger.java:161)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.recvOperation(SampleCompensableLogger.java:152)
	at org.bytesoft.bytejta.logging.store.VirtualLoggingSystemImpl.traversal(VirtualLoggingSystemImpl.java:181)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger.recover(SampleCompensableLogger.java:148)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.fireCompensableStartRecovery(TransactionRecoveryImpl.java:92)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.startRecovery(TransactionRecoveryImpl.java:80)
	at org.bytesoft.bytetcc.work.CompensableWork.initializeIfNecessary(CompensableWork.java:43)
	at org.bytesoft.bytetcc.work.CompensableWork.run(CompensableWork.java:55)
	at org.bytesoft.transaction.work.SimpleWork.run(SimpleWork.java:30)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:262)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
2018-04-25 11:30:47,829 ERROR [pool-1-thread-1] org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer - Error occurred while deserializing object: [1, 1, 0, 106, 97, 118, 97, 46, 117, 116, 105, 108, 46, 72, 97, 115, 104, 77, 97, -16, 1, 1, 3, 1, 100, 97, 116, 97, 45, 97, 102, 116, 101, 114, 45, 114, 101, 115, 116, 97, 114, -12, 3, 1, 49, 49, 49, 49, 50, 50, 50, -78]
com.caucho.hessian.io.HessianProtocolException: unknown code for readObject at 0x1 (�)
	at com.caucho.hessian.io.HessianInput.error(HessianInput.java:1697)
	at com.caucho.hessian.io.HessianInput.readObject(HessianInput.java:1177)
	at org.bytesoft.common.utils.SerializeUtils.hessianDeserialize(SerializeUtils.java:165)
	at org.bytesoft.common.utils.CommonUtils.deserializeObject(CommonUtils.java:75)
	at org.bytesoft.bytetcc.logging.deserializer.TransactionArchiveDeserializer.deserialize(TransactionArchiveDeserializer.java:221)
	at org.bytesoft.bytetcc.logging.ArchiveDeserializerImpl.deserialize(ArchiveDeserializerImpl.java:72)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.execOperation(SampleCompensableLogger.java:161)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger$2.recvOperation(SampleCompensableLogger.java:152)
	at org.bytesoft.bytejta.logging.store.VirtualLoggingSystemImpl.traversal(VirtualLoggingSystemImpl.java:181)
	at org.bytesoft.bytetcc.logging.SampleCompensableLogger.recover(SampleCompensableLogger.java:148)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.fireCompensableStartRecovery(TransactionRecoveryImpl.java:92)
	at org.bytesoft.bytetcc.TransactionRecoveryImpl.startRecovery(TransactionRecoveryImpl.java:80)
	at org.bytesoft.bytetcc.work.CompensableWork.initializeIfNecessary(CompensableWork.java:43)
	at org.bytesoft.bytetcc.work.CompensableWork.run(CompensableWork.java:55)
	at org.bytesoft.transaction.work.SimpleWork.run(SimpleWork.java:30)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:262)
	at java.util.concurrent.FutureTask.run(FutureTask.java)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
2018-04-25 11:30:52,391 INFO  [main-EventThread] org.I0Itec.zkclient.ZkClient - zookeeper state changed (SyncConnected)

转账,应该是 provider decreaseAmount,结果却调用了 increaseAmount

2018-04-25 11:30:53,804 INFO  [main] org.springframework.transaction.jta.JtaTransactionManager - Using JTA UserTransaction: org.bytesoft.bytetcc.UserCompensableImpl@5491669a
2018-04-25 11:30:53,804 INFO  [main] org.springframework.transaction.jta.JtaTransactionManager - Using JTA TransactionManager: org.bytesoft.bytetcc.TransactionManagerImpl@22947acd
sample-provider started!
decreaseAmount
2018-04-25 11:32:03,804 INFO  [main-EventThread] org.I0Itec.zkclient.ZkClient - zookeeper state changed (Disconnected)
2018-04-25 11:33:07,496 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] enlist: xares= xa-res-archive[descriptor: local-xa-resource[dataSource]], branch= 0a002700000400000162fadca7270002f769c444, flags: 0
done increase: acct= 1001, amount=    1.00
2018-04-25 11:33:19,307 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] delist: xares= xa-res-archive[descriptor: local-xa-resource[dataSource]], branch= 0a002700000400000162fadca7270002f769c444, flags= 67108864
2018-04-25 11:33:19,310 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] prepare-transaction start
2018-04-25 11:33:19,310 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.resource.XATerminatorOptd - [0a002700000400000162fadb19ba00014f694991] prepare: xares= xa-res-archive[descriptor: local-xa-resource[dataSource]], branch= 0a002700000400000162fadca7270002f769c444, vote= 0
2018-04-25 11:33:19,310 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] prepare-transaction complete successfully
2018-04-25 11:33:19,310 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] commit-transaction start
2018-04-25 11:33:19,317 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.resource.XATerminatorOptd - [0a002700000400000162fadb19ba00014f694991] commit: xares= xa-res-archive[descriptor: local-xa-resource[dataSource]], branch= 0a002700000400000162fadca7270002f769c444, opc= false
2018-04-25 11:33:19,317 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162fad4af780001d1fd8acc| confirm: identifier= 0a002700000400000162fad4af780001d1fd8acc, resourceKey= dataSource, resourceXid= 1207-0a002700000400000162fadb19ba00014f694991-0a002700000400000162fadca7270002f769c444.
2018-04-25 11:33:19,317 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytejta.TransactionImpl - [0a002700000400000162fadb19ba00014f694991] commit-transaction complete successfully
2018-04-25 11:33:19,317 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162fad4af780001d1fd8acc| compensable transaction committed!
2018-04-25 11:33:19,318 INFO  [DubboServerHandler-192.168.99.1:20882-thread-3] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162fad4af780001d1fd8acc| forget transaction.
2018-04-25 11:33:19,318 INFO  [pool-1-thread-1] org.bytesoft.bytetcc.CompensableTransactionImpl - 0a002700000400000162fad4af780001d1fd8acc| forget transaction.

Debug 看到 CompensableInvocation 的 method 是 decreaseAmount,但是下一步执行就不对

increaseAmount:22, AccountServiceConfirm (com.bytesvc.service.confirm)
invoke:-1, AccountServiceConfirm$$FastClassBySpringCGLIB$$bc4514ce (com.bytesvc.service.confirm)
invoke:204, MethodProxy (org.springframework.cglib.proxy)
invokeJoinpoint:711, CglibAopProxy$CglibMethodInvocation (org.springframework.aop.framework)
proceed:157, ReflectiveMethodInvocation (org.springframework.aop.framework)
proceedWithInvocation:98, TransactionInterceptor$1 (org.springframework.transaction.interceptor)
invokeWithinTransaction:262, TransactionAspectSupport (org.springframework.transaction.interceptor)
invoke:95, TransactionInterceptor (org.springframework.transaction.interceptor)
proceed:179, ReflectiveMethodInvocation (org.springframework.aop.framework)
intercept:644, CglibAopProxy$DynamicAdvisedInterceptor (org.springframework.aop.framework)
increaseAmount:-1, AccountServiceConfirm$$EnhancerBySpringCGLIB$$f9d47d80 (com.bytesvc.service.confirm)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:57, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:606, Method (java.lang.reflect)
confirmComplicated:89, SpringContainerContextImpl (org.bytesoft.bytetcc.supports.spring)
confirm:46, SpringContainerContextImpl (org.bytesoft.bytetcc.supports.spring)
fireNativeParticipantConfirm:256, CompensableTransactionImpl (org.bytesoft.bytetcc)
fireCommit:156, CompensableTransactionImpl (org.bytesoft.bytetcc)
participantCommit:123, CompensableTransactionImpl (org.bytesoft.bytetcc)
invokeCommit:206, CompensableCoordinator (org.bytesoft.bytetcc)
commit:160, CompensableCoordinator (org.bytesoft.bytetcc)
commit:56, TransactionCoordinator (org.bytesoft.bytetcc)
invokeMethod:-1, Wrapper2 (com.alibaba.dubbo.common.bytecode)
doInvoke:46, JavassistProxyFactory$1 (com.alibaba.dubbo.rpc.proxy.javassist)
invoke:72, AbstractProxyInvoker (com.alibaba.dubbo.rpc.proxy)
invoke:53, InvokerWrapper (com.alibaba.dubbo.rpc.protocol)
wrapResultForProvider:285, CompensableServiceFilter (org.bytesoft.bytetcc.supports.dubbo.spi)
providerInvokeForTCC:178, CompensableServiceFilter (org.bytesoft.bytetcc.supports.dubbo.spi)
providerInvoke:86, CompensableServiceFilter (org.bytesoft.bytetcc.supports.dubbo.spi)
invoke:71, CompensableServiceFilter (org.bytesoft.bytetcc.supports.dubbo.spi)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:64, ExceptionFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:42, TimeoutFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:75, MonitorFilter (com.alibaba.dubbo.monitor.support)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:78, TraceFilter (com.alibaba.dubbo.rpc.protocol.dubbo.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:60, ContextFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:112, GenericFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:38, ClassLoaderFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
invoke:38, EchoFilter (com.alibaba.dubbo.rpc.filter)
invoke:91, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
reply:108, DubboProtocol$1 (com.alibaba.dubbo.rpc.protocol.dubbo)
handleRequest:84, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
received:170, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
received:52, DecodeHandler (com.alibaba.dubbo.remoting.transport)
run:82, ChannelEventRunnable (com.alibaba.dubbo.remoting.transport.dispatcher)
runWorker:1145, ThreadPoolExecutor (java.util.concurrent)
run:615, ThreadPoolExecutor$Worker (java.util.concurrent)
run:745, Thread (java.lang)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.