Coder Social home page Coder Social logo

apache / servicecomb-pack Goto Github PK

View Code? Open in Web Editor NEW
1.9K 119.0 437.0 15.14 MB

Apache ServiceComb Pack is an eventually data consistency solution for micro-service applications. ServiceComb Pack currently provides TCC and Saga distributed transaction co-ordination solutions by using Alpha as a transaction coordinator and Omega as an transaction agent .

Home Page: https://servicecomb.apache.org/

License: Apache License 2.0

Java 82.00% Gherkin 3.37% Shell 0.15% HTML 4.29% CSS 0.20% JavaScript 2.47% TypeScript 5.36% SCSS 2.16%
servicecomb

servicecomb-pack's Introduction

Pack | 中文 Build Status Coverage Status Maven Central License Quality Gate Status Gitter

Apache ServiceComb Pack is an eventually data consistency solution for micro-service applications.

Features

  • High availability. The coordinator is stateless and thus can have multiple instances.
  • High reliability. All transaction events are stored in database permanently.
  • High performance. Transaction events are reported to coordinator via gRPC and transaction payloads are serialized/deserialized by Kyro.
  • Low invasion. All you need to do is add 2-3 annotations and the corresponding compensate methods.
  • Easy to deploy. All components can boot via docker.
  • Support both forward(retry) and backward(compensate) recovery.
  • Easy to extend other coordination protocol which is based on the Pack, now we have Saga and TCC support out of box.

Architecture

ServiceComb Pack is composed of alpha and omega.

  • The alpha plays as the coordinator. It is responsible for the management of transactions.
  • The omega plays as an agent inside the micro-service. It intercepts incoming/outgoing requests and reports transaction events to alpha.

The following diagram shows the relationships among alpha, omega and services. Pack Architecture

In this way, we can implement different coordination protocols, such as saga and TCC. See ServiceComb Pack Design for details.

Now we have different lanaguage implementation of Omega

Get Started

  • For ServiceComb Java Chassis application, please see Booking Demo for details.
  • For Spring applications, please see Booking Demo for details.
  • For Dubbo applications, please see Dubbo Demo for details.
  • For TCC with Spring application, please see Tcc Demo for details.
  • To debug the applications, please see Spring Demo Debugging for details.

Build and Run the tests from source

  • Build the source code and run the tests
       $ mvn clean install
  • Build the source demo docker images and run the accept tests
       $ mvn clean install -Pdemo
  • Build the source code and docker images without running tests, the docker profile will be activated if the maven detects the docker installation.
       $ mvn clean install -DskipTests=true -Pdemo
  • Build the release kit for distribution without running the tests, then you can find the release kits in the distribution/target directory.
       $ mvn clean install -DskipTests=true -Prelease

User Guide

How to build and use can refer to User Guide.

Get The Latest Version

Get released version:

Get snapshot version:

  • We publish the snapshot version to Apache nexus repo, please add below repositories into your pom.xml.
            <repositories>
              <repository>
                <releases />
                <snapshots>
                  <enabled>true</enabled>
                </snapshots>
                <id>repo.apache.snapshot</id>
                <url>https://repository.apache.org/content/repositories/snapshots/</url>
              </repository>
            </repositories>
            <pluginRepositories>
              <pluginRepository>
                <releases />
                <snapshots>
                  <enabled>true</enabled>
                </snapshots>
                <id>repo.apache.snapshot</id>
                <url>https://repository.apache.org/content/repositories/snapshots/</url>
              </pluginRepository>
            </pluginRepositories>
    
    
    

Contact Us

Contributors

contributors

How to Contribute

See Pull Request Guide for details.

License

Licensed under an Apache 2.0 license.

Export Notice

This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information.

The Apache Software Foundation has classified this software as Export Commodity Control Number (ECCN) 5D002, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the "publicly available" Section 742.15(b) exemption (see the BIS Export Administration Regulations, Section 742.15(b)) for both object code and source code.

The following provides more details on the included cryptographic software:

  • Omega/Alpha Transport can be configured use https

servicecomb-pack's People

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

servicecomb-pack's Issues

when mvn package -DskipTests -Pdocker -Pdemo can't find saga-persistence-jpa:jar:0.0.3-SNAPSHOT

when I used mvn package -DskipTests -Pdocker -Pdemo build the project ,find bad build info like this

[WARNING] The POM for org.apache.servicecomb.saga:saga-persistence-jpa:jar:0.0.3-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ServiceComb Saga ................................... SUCCESS [  1.085 s]
[INFO] Saga::Docker Build Config .......................... SUCCESS [  0.091 s]
[INFO] Saga::Pack Common .................................. SUCCESS [  0.844 s]
[INFO] Saga::Omega ........................................ SUCCESS [  0.071 s]
[INFO] Saga::Omega::Context ............................... SUCCESS [  0.301 s]
[INFO] Saga::Omega::Transaction ........................... SUCCESS [  0.521 s]
[INFO] Saga::Omega::Spring TX ............................. FAILURE [  0.123 s]
[INFO] Saga::Omega::Transport ............................. SKIPPED
[INFO] Saga::Omega::Transport::Rest Template .............. SKIPPED
[INFO] omega-transport-servicecomb ........................ SKIPPED
[INFO] Saga::Pack Contracts ............................... SKIPPED
[INFO] Saga::Pack Contracts::Grpc ......................... SKIPPED
[INFO] Saga::Omega::Connector ............................. SKIPPED
[INFO] Saga::Omega::Connector::GRPC ....................... SKIPPED
[INFO] Saga::Omega::Format ................................ SKIPPED
[INFO] Saga::Omega::Spring Starter ........................ SKIPPED
[INFO] Saga::Alpha ........................................ SKIPPED
[INFO] Saga::Alpha::Core .................................. SKIPPED
[INFO] Saga::Alpha::Server ................................ SKIPPED
[INFO] Saga::Integration Tests ............................ SKIPPED
[INFO] Saga::Integration Tests::Pack Tests ................ SKIPPED
[INFO] Saga::Integration Tests::Coverage Aggregate ........ SKIPPED
[INFO] Saga::Demo ......................................... SKIPPED
[INFO] Saga::Demo::Booking ................................ SKIPPED
[INFO] Saga::Demo::Pack::Booking .......................... SKIPPED
[INFO] Saga::Demo::Pack::Car .............................. SKIPPED
[INFO] Saga::Demo::Pack::Hotel ............................ SKIPPED
[INFO] Saga:Acceptance Tests .............................. SKIPPED
[INFO] Saga:Acceptance Tests::Pack ........................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.916 s
[INFO] Finished at: 2018-03-07T13:10:59+08:00
[INFO] Final Memory: 37M/483M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project omega-spring-tx: Could not resolve dependencies for project org.apache.servicecomb.saga:omega-spring-tx:jar:0.0.3-SNAPSHOT: Failure to find org.apache.servicecom
b.saga:saga-persistence-jpa:jar:0.0.3-SNAPSHOT in http:/xxxxxxxxxxxxxxxxxxxxxxxx was cached in the local repository, resolution will not be reattempted until the update interval of nexus
-public has elapsed or updates are forced -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :omega-spring-tx

maybe it's not need anymore

It is useless for @SagaStart timeout,and it could not be compensated under @SagaStart

I don't know what SagaStart annotation timeout use, because the timeout is not work.
In the spring cloud demo,if hotel set a wrong address or port,the car service won't be compensated

 @SagaStart(timeout = 60000) //timeout no use,can not affect compensate 
  @PostMapping("/booking/{name}/{rooms}/{cars}")
  public String order(@PathVariable String name,  @PathVariable Integer rooms, @PathVariable Integer cars) {

    template.postForEntity(
        carServiceUrl + "/order/{name}/{cars}",
        null, String.class, name, cars);

   //if set a wrong hotel address,car service compensated method not be triggered
    template.postForEntity(
        hotelServiceUrl + "/order/{name}/{rooms}",
        null, String.class, name, rooms);
    
     postBooking();

     return name + " booking " + rooms + " rooms and " + cars + " cars OK";}

  public void postBooking(@PathVariable String name,  @PathVariable Integer rooms, @PathVariable Integer cars) { }

关于MessageHandler执行时间问题

我通过观察代码发现MessageHandler的实现类CompensationMessageHandler,是调用回撤方法compensationMethod,但这个回调方法什么时候被哪个类执行,请指点。

service discovery across applications with service center

service center has application group concept and services under different application group may have the same service name.

service discovery across applications requires application id + service name, in order to locate the right service.

given
saga is up & running

when
saga receives a request involves services in another application

then
saga sends application id along with service name to discover the services

When TxEndedEvent comes after TxAbortedEvent, it would not be compensated?

I write a test in AlphaIntegrationTest like this,

  @Test
  public void compensateTxEndedEventAfterOtherTxAborted() {
    String sagaGlobalId = UUID.randomUUID().toString();
    String bookingApplicationLocalId = UUID.randomUUID().toString();
    String carServiceLocalId = UUID.randomUUID().toString();
    String hotelServiceLocalId = UUID.randomUUID().toString();

    asyncStub.onConnected(serviceConfig, compensateResponseObserver);

    blockingStub
            .onTxEvent(someGrpcEvent(SagaStartedEvent, sagaGlobalId, bookingApplicationLocalId));

    blockingStub.onTxEvent(someGrpcEvent(TxStartedEvent, sagaGlobalId, carServiceLocalId));
    blockingStub.onTxEvent(someGrpcEvent(TxAbortedEvent, sagaGlobalId, carServiceLocalId));

    blockingStub.onTxEvent(someGrpcEvent(TxStartedEvent, sagaGlobalId, hotelServiceLocalId));
    blockingStub.onTxEvent(someGrpcEvent(TxEndedEvent, sagaGlobalId, hotelServiceLocalId));

    await().atMost(30, SECONDS).until(() -> receivedCommands.size() > 0); //fail here
    assertThat(receivedCommands.size(), is(1));

    GrpcCompensateCommand command = receivedCommands.poll();
    assertThat(command.getGlobalTxId(), is(sagaGlobalId));
    assertThat(command.getLocalTxId(), is(hotelServiceLocalId));
    assertThat(command.getParentTxId(), is(parentTxId));
    assertThat(command.getCompensationMethod(), is(compensationMethod));
    assertThat(command.getPayloads().toByteArray(), is(payload.getBytes()));
  }

is it a valid testcase?

Saga executes compensation, but excludes interface which throws exception.

Does the compensation depends on Spring Transaction?

I defined an compensable interface without Spring Transaction, but it didn't call rollback method when produced an exception in it.

My code:

@Compensable(compensationMethod = "updateMoneyByUserId_rollback")
public int updateMoneyByUserId(@Param("userId") long userId, @Param("money") long money) {
	System.err.println("[" + sdf.format(new Date()) + "] 进入 " + this.getClass() + ".updateMoneyByUserId 提交方法……\t\tid = " + userId + ", money = " + money);
		
	int result = userRepository.updateMoneyByUserId(userId, money);// commit to update balance immediately
		
	Integer.parseInt("");
		
	return result;
}

public int updateMoneyByUserId_rollback(@Param("userId") long userId, @Param("money") long money) {
	System.err.println("[" + sdf.format(new Date()) + "] 进入 " + this.getClass() + ".rollback 补偿方法……\t\tid = " + userId + ", money = " + -money);
	return userRepository.updateMoneyByUserId(userId, -money);
}

Information for txevent data:
image

dubbo demo运行问题

1、jar冲突:log4j的两个桥接包冲突,guava16.1和20.0版本冲突,多个版本的netty冲突
2、dubbo2.6.1存在服务注册不到zookeeper上的bug

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'payloads' at row 1

I encounter an Exception at Alpha Server

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'payloads' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3974) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source) ~[na:na]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_102]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
	at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.31.jar:na]
	at com.sun.proxy.$Proxy106.executeUpdate(Unknown Source) ~[na:na]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895) ~[org.eclipse.persistence.core-2.7.1.jar:na]
	... 60 common frames omitted

I find it's because payload bytes is more than 10240

public class TxAbortedEvent extends TxEvent {
  public TxAbortedEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Throwable throwable) {
    super(EventType.TxAbortedEvent, globalTxId, localTxId, parentTxId, compensationMethod, 0, "", 0,
        stackTrace(throwable));
  }

  private static String stackTrace(Throwable e) {
    StringWriter writer = new StringWriter();
    e.printStackTrace(new PrintWriter(writer));
    return writer.toString();
  }
}

why not use varchar with store in json format

forward recovery with delay

given
saga is up & running

when
saga receives a request with forward recovery
a transaction in the request fails

then
saga delays retryDelay seconds specified in the request before each retry

saga-web naming

saga-web doesn't seem to be an appropriate name to express its intention.

probably something like saga visualizer is better?

stateful service support

currently saga sub-transactions are load balanced to multiple service instances with service discovery, but it doesn't work well with stateful service.

stateful service support can either be supported with service registry or caching request address in saga

tracing with zipkin

integration with zipkin to providing timing info of transactions/compensations

given
configured saga with zipkin trace collector address and zipkin enabled

when
saga receives a request

then
tracing info is reported to zipkin trace collector

where can i find retry demo?

the booking demo only demonstrates how to roll back a transaction, but now i want to do forward(retry). where can i find the demo or document?please help!

reactive saga with akka actor

reactive transaction execution with akka actor to improve performance of complex transaction flow.

eg. for such a transaction flow, graph based saga can only process b & e in parallel. if e is very slow, saga won't be able to proceed with c after b is done, because the transaction execution is based on graph traversal.

a -- b -- c -- d
  \-- e -------/

but with akka actor model, each request is an actor and they run asynchronously. transaction c will start immediately when it receives the response from b and there's no need to wait for e.

Dubbo事务补偿问题

A系统调用B系统服务,A系统调用C系统服务, Saga-0.2.0版本;
1、A-B调用返回成功;
2、A-C调用返回失败;
出现问题:
B执行完后,C事务中断,C并“没有”调用自身补偿方法进行补偿,A也没有调用方法进行补偿?使用提供的Dubbo示例加入如下代码,也是同样的结果;

@SagaStart
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
public void transfer(String from, String to, BigDecimal amount){
//B服务Dubbo调用
transBDubboService.transferBIn(to, 50);
//C服务Dubbo调用
transCDubboService.transferCIn(to, 50);
}

//B服务Dubbo接口方法
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
@OverRide
public void transferBIn(String to, int amount) {
LOG.info("C.Called,开始转入资金:"+amount);
AccountPo accountPo= accountPoDao.queryByUserName(to);
LOG.info("C.Called,开始转入资金:"+amount);
//转入资金操作
accountPo.setBalance(accountPo.getBalance().add(BigDecimal.valueOf(amount)));
accountPoDao.updateByCond(accountPo);
}

//C服务Dubbo接口方法
@Compensable(compensationMethod="cancel")
@transactional(rollbackFor = Exception.class)
@OverRide
public void transferCIn(String to, int amount) {
LOG.info("C.Called,开始转入资金:"+amount);
AccountPo accountPo= accountPoDao.queryByUserName(to);
//转入资金操作
accountPo.setBalance(accountPo.getBalance().add(BigDecimal.valueOf(amount)));
accountPoDao.updateByCond(accountPo);
}

//B和C服务补偿方法
public void cancel(String to, int amount) {
    LOG.info("Called Cancel 开始取消转入转款:"+amount);
    AccountPo accountPo= accountPoDao.queryByUserName(to);
      //补偿,取消转入
     accountPo.setBalance(accountPo.getBalance().subtract(BigDecimal.valueOf(amount)));
     accountPoDao.updateByCond(accountPo);
    LOG.info("Called Cancel 补偿成功");
}

1531803341 1

saga spring demo 启动报错

. ____ _ __ _ _
/\ / ' __ _ () __ __ _ \ \ \
( ( )_
_ | '_ | '| | ' / ` | \ \ \
\/ )| |)| | | | | || (| | ) ) ) )
' |
| .__|| ||| |_, | / / / /
=========|
|==============|/=////
:: Spring Boot :: (v1.5.14.RELEASE)

2018-09-11 19:30:50.235 INFO 38844 --- [ main] o.a.s.saga.demo.pack.car.Application : Starting Application on fe-wangmingl-1 with PID 38844 (C:\Users\wangminglei01\git\incubator-servicecomb-saga\saga-demo\saga-spring-demo\car\target\classes started by wangminglei01 in C:\Users\wangminglei01\git\incubator-servicecomb-saga\saga-demo\saga-spring-demo\car)
2018-09-11 19:30:50.238 INFO 38844 --- [ main] o.a.s.saga.demo.pack.car.Application : No active profile set, falling back to default profiles: default
2018-09-11 19:30:50.306 INFO 38844 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7f552bd3: startup date [Tue Sep 11 19:30:50 CST 2018]; root of context hierarchy
2018-09-11 19:30:51.468 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.servicecomb.saga.omega.transaction.spring.TransactionAspectConfig' of type [org.apache.servicecomb.saga.omega.transaction.spring.TransactionAspectConfig$$EnhancerBySpringCGLIB$$c631e80] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:52.415 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.servicecomb.saga.omega.spring.OmegaSpringConfig' of type [org.apache.servicecomb.saga.omega.spring.OmegaSpringConfig$$EnhancerBySpringCGLIB$$a2c048e8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:52.437 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'omegaUniqueIdGenerator' of type [org.apache.servicecomb.saga.omega.context.UniqueIdGenerator] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:52.442 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'omegaContext' of type [org.apache.servicecomb.saga.omega.context.OmegaContext] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:52.457 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'compensationContext' of type [org.apache.servicecomb.saga.omega.context.CallbackContext] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:52.477 INFO 38844 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'coordinateContext' of type [org.apache.servicecomb.saga.omega.context.CallbackContext] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-09-11 19:30:53.349 INFO 38844 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-09-11 19:30:53.378 INFO 38844 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2018-09-11 19:30:53.378 INFO 38844 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.31
2018-09-11 19:30:53.511 INFO 38844 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-09-11 19:30:53.512 INFO 38844 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3209 ms
2018-09-11 19:30:54.205 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2018-09-11 19:30:54.211 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'metricsFilter' to: [/]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/
]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/
]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webRequestLoggingFilter' to: [/
]
2018-09-11 19:30:54.212 INFO 38844 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'applicationContextIdFilter' to: [/*]
2018-09-11 19:30:54.960 WARN 38844 --- [ main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'coordinateMessageHandler' defined in org.apache.servicecomb.saga.omega.transaction.spring.TransactionAspectConfig: Unsatisfied dependency expressed through method 'coordinateMessageHandler' parameter 3; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.servicecomb.saga.omega.transaction.tcc.ParametersContext' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
2018-09-11 19:30:54.965 INFO 38844 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2018-09-11 19:30:54.972 ERROR 38844 --- [ault-executor-1] a.s.s.o.c.g.GrpcCompensateStreamObserver : Failed to process grpc compensate command.

io.grpc.StatusRuntimeException: UNAVAILABLE: Channel shutdownNow invoked
at io.grpc.Status.asRuntimeException(Status.java:526) ~[grpc-core-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:420) [grpc-stub-1.14.0.jar:1.14.0]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:684) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:403) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:459) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:63) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) [grpc-core-1.14.0.jar:1.14.0]
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) [grpc-core-1.14.0.jar:1.14.0]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_92]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_92]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_92]

2018-09-11 19:30:54.972 INFO 38844 --- [pool-1-thread-1] o.a.s.s.o.c.g.PushBackReconnectRunnable : Retry connecting to alpha at localhost:8080
2018-09-11 19:30:54.982 ERROR 38844 --- [pool-1-thread-1] o.a.s.s.o.c.g.PushBackReconnectRunnable : Failed to reconnect to alpha at localhost:8080

io.grpc.StatusRuntimeException: UNAVAILABLE: Channel shutdown invoked
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:222) ~[grpc-stub-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:203) ~[grpc-stub-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:132) ~[grpc-stub-1.14.0.jar:1.14.0]
at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$TxEventServiceBlockingStub.onDisconnected(TxEventServiceGrpc.java:280) ~[pack-contract-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.connector.grpc.GrpcClientMessageSender.onDisconnected(GrpcClientMessageSender.java:79) ~[omega-connector-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.connector.grpc.PushBackReconnectRunnable.run(PushBackReconnectRunnable.java:51) ~[omega-connector-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.connector.grpc.LoadBalancedClusterMessageSender$2.run(LoadBalancedClusterMessageSender.java:196) [omega-connector-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_92]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_92]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_92]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_92]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_92]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_92]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_92]

2018-09-11 19:30:54.988 INFO 38844 --- [ main] utoConfigurationReportLoggingInitializer :

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-09-11 19:30:55.133 ERROR 38844 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :


APPLICATION FAILED TO START


Description:

Parameter 3 of method coordinateMessageHandler in org.apache.servicecomb.saga.omega.transaction.spring.TransactionAspectConfig required a bean of type 'org.apache.servicecomb.saga.omega.transaction.tcc.ParametersContext' that could not be found.

Action:

Consider defining a bean of type 'org.apache.servicecomb.saga.omega.transaction.tcc.ParametersContext' in your configuration.

2018-09-11 19:30:55.138 ERROR 38844 --- [ Thread-2] s.o.c.g.LoadBalancedClusterMessageSender : Failed disconnecting from alpha at localhost:8080

io.grpc.StatusRuntimeException: UNAVAILABLE: Channel shutdown invoked
at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:222) ~[grpc-stub-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:203) ~[grpc-stub-1.14.0.jar:1.14.0]
at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:132) ~[grpc-stub-1.14.0.jar:1.14.0]
at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$TxEventServiceBlockingStub.onDisconnected(TxEventServiceGrpc.java:280) ~[pack-contract-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.connector.grpc.GrpcClientMessageSender.onDisconnected(GrpcClientMessageSender.java:79) ~[omega-connector-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.connector.grpc.LoadBalancedClusterMessageSender.onDisconnected(LoadBalancedClusterMessageSender.java:143) ~[omega-connector-grpc-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at org.apache.servicecomb.saga.omega.spring.OmegaSpringConfig$1.run(OmegaSpringConfig.java:105) [omega-spring-starter-0.3.0-SNAPSHOT.jar:0.3.0-SNAPSHOT]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_92]

mysql duplicate key

使用0d04161b9ea1ea1793fb1a0c9c64a08103488867编译的版本,使用mysql 数据库作为tx event 存储,日志中发现下列错误

[EL Warning]: 2018-03-23 03:32:59.887--UnitOfWork(159067768)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1613' for key 'eventId'
Error Code: 1062
Call: INSERT INTO Command (COMPENSATIONMETHOD, EVENTID, GLOBALTXID, INSTANCEID, LASTMODIFIED, LOCALTXID, PARENTTXID, PAYLOADS, SERVICENAME, STATUS, VERSION) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [11 parameters bound]

An unusual problem for SagaEndedEvet

Yesterday, it's very accurately to the data of the table 'txevent'. However, the 'creationTime' to 'SagaEndedEvent' were changed when I started the Alpha program.

In fact, it had happened many times before.

I apologize to this problem due to I didn't know how to make it happen again.

Please pay attention to it.
Thank you so much!

image

Several questions about repeated events.

Q1: What problems the repeated SagaEndedEvent would cause?

Q2: It would write the same TxStartedEvent/TxEndedEvent in case of trying commit again.
Then what was the idea for initial design?
What problems the repeated TxStartedEvent/TxEndedEvent would cause?

Q3: Are there any other situations except above?

Problem for Saga Load Balance Strategy

Currently, Saga's load balancer will select a fastest 'MessageSender' to send msg from pool.

My problem:
At some point, if every Alpha node need take 10 minutes to handle business for some reasons(e.g. network), that means, Saga will handle all following requests by the fastest 'MessageSender' within 10 minutes.
So, I think that the performance for Saga's load balancer will get a discount.

Of course, I believe one alpha node can handle many many requests. Just for improving Saga.

Part of code from LoadBalancedClusterMessageSender.java ....

MessageSender messageSender = fastestSender();
try {
        long startTime = System.nanoTime();
        AlphaResponse response = messageSender.send(event);
        senders.put(messageSender, System.nanoTime() - startTime);
        return response;
} catch (OmegaException e) {
        throw e;
}

Please point them out when I make some mistakes. Thank you.

If Alpha Server Fail when book-service do send event, the book-service will fail forerver

It report every time when alpha server fail for example database down

{
	"timestamp": 1531398807451,
	"status": 500,
	"error": "Internal Server Error",
	"exception": "javax.transaction.TransactionalException",
	"message": "Failed to process subsequent requests because no alpha server is available",
	"path": "/booking/abc/3/3"
}

Why RetryableMessageSender do throw OmegaException when send event :SagaStartedEvent

@Override
  public AlphaResponse send(TxEvent event) {
    if (event.type() == SagaStartedEvent) {
      throw new OmegaException("Failed to process subsequent requests because no alpha server is available");
    }
    try {
      return availableMessageSenders.take().send(event);
    } catch (InterruptedException e) {
      throw new OmegaException("Failed to send event " + event + " due to interruption", e);
    }
  }
LoadBalancedClusterMessageSender.java

@Override
  public AlphaResponse send(TxEvent event) {
    do {
      MessageSender messageSender = fastestSender();//If Failure First Time, the sender must be 
                                                                                             //large latency,the second try must be the 
                                                                                             //RetryableMessageSender
      try {
        long startTime = System.nanoTime();
        AlphaResponse response = messageSender.send(event);
        senders.put(messageSender, System.nanoTime() - startTime); //Only success can modify the 
                                                                                                                  //senders map

        return response;
      } catch (OmegaException e) {
        throw e;
      } catch (Exception e) {
        LOG.error("Retry sending event {} due to failure", event, e);

        // very large latency on exception
        senders.put(messageSender, Long.MAX_VALUE);
      }
    } while (!Thread.currentThread().isInterrupted());

    throw new OmegaException("Failed to send event " + event + " due to interruption");
  }


  private MessageSender fastestSender() {
    return senders.entrySet()
        .stream()
        .filter(entry -> entry.getValue() < Long.MAX_VALUE)
        .min(Comparator.comparingLong(Entry::getValue))
        .map(Entry::getKey)
        .orElse(retryableMessageSender);
  }

Duplicated database record when save TxTimeoutEvent

Alpha-Server Print Error Log
when execute code

private void findTimeoutEvents() {
    eventRepository.findTimeoutEvents()
        .forEach(event -> {
          LOG.info("Found timeout event {}", event);
          timeoutRepository.save(txTimeoutOf(event));
        });
  }
2018-07-11 18:08:28.406  INFO 3700 --- [pool-2-thread-1] o.a.s.saga.alpha.core.EventScanner       : Found timeout event TxEvent{surrogateId=20, serviceName='booking', instanceId='booking-127.0.0.1', creationTime=Wed Jul 11 17:31:29 CST 2018, globalTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', localTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', parentTxId='null', type='SagaStartedEvent', compensationMethod='', expiryTime=Thu Jul 12 10:11:29 CST 2018, retryMethod='', retries=0}
[EL Warning]: 2018-07-11 18:08:31.446--UnitOfWork(1680426037)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '20' for key 'eventId'
Error Code: 1062
Call: INSERT INTO TxTimeout (EVENTID, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, SERVICENAME, STATUS, TYPE, VERSION) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	bind => [10 parameters bound]
Query: InsertObjectQuery(TxTimeout{eventId=20, serviceName='booking', instanceId='booking-127.0.0.1', globalTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', localTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', parentTxId='null', type='SagaStartedEvent', expiryTime=Thu Jul 12 10:11:29 CST 2018, status=NEW})
2018-07-11 18:08:31.452  WARN 3700 --- [pool-2-thread-1] o.a.s.s.a.s.SpringTxTimeoutRepository    : Failed to save some timeout TxTimeout{eventId=20, serviceName='booking', instanceId='booking-127.0.0.1', globalTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', localTxId='94fc1a1f-8dff-41bd-bb7b-82984456ed1c', parentTxId='null', type='SagaStartedEvent', expiryTime=Thu Jul 12 10:11:29 CST 2018, status=NEW}

ERROR: value too long for type character varying(16)

The length of field serviceName is too short, when insert into table get an error, suggest change the length of field serviceName

Internal Exception: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(16)
Error Code: 0
Call: INSERT INTO TxEvent (COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [12 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-dubbo-consumer', instanceId='saga-dubbo-consumer-192.168.43.214', creationTime=Thu May 03 23:15:43 CST 2018, globalTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', localTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', parentTxId='null', type='SagaStartedEvent', compensationMethod='', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', retries=0})
2018-05-03 23:15:43.868 ERROR 26402 --- [ault-executor-0] io.grpc.internal.SerializingExecutor : Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@2963da30

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(16)
Error Code: 0
Call: INSERT INTO TxEvent (COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [12 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-dubbo-consumer', instanceId='saga-dubbo-consumer-192.168.43.214', creationTime=Thu May 03 23:15:43 CST 2018, globalTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', localTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', parentTxId='null', type='SagaStartedEvent', compensationMethod='', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', retries=0})
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526) ~[spring-orm-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:518) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) ~[spring-data-jpa-1.11.10.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-1.13.10.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.apache.servicecomb.saga.alpha.server.$Proxy94.save(Unknown Source) ~[na:na]
at org.apache.servicecomb.saga.alpha.server.SpringTxEventRepository.save(SpringTxEventRepository.java:39) ~[classes/:na]
at org.apache.servicecomb.saga.alpha.core.TxConsistentService.handle(TxConsistentService.java:49) ~[classes/:na]
at org.apache.servicecomb.saga.alpha.server.GrpcTxEventEndpointImpl.onTxEvent(GrpcTxEventEndpointImpl.java:78) ~[classes/:na]
at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$MethodHandlers.invoke(TxEventServiceGrpc.java:347) ~[classes/:na]
at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:171) ~[grpc-stub-1.8.0.jar:1.8.0]
at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:271) ~[grpc-core-1.8.0.jar:1.8.0]
at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:648) ~[grpc-core-1.8.0.jar:1.8.0]
at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.8.0.jar:1.8.0]
at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) ~[grpc-core-1.8.0.jar:1.8.0]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) [na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [na:na]
at java.base/java.lang.Thread.run(Thread.java:844) [na:na]
Caused by: javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(16)
Error Code: 0
Call: INSERT INTO TxEvent (COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [12 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-dubbo-consumer', instanceId='saga-dubbo-consumer-192.168.43.214', creationTime=Thu May 03 23:15:43 CST 2018, globalTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', localTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', parentTxId='null', type='SagaStartedEvent', compensationMethod='', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', retries=0})
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:159) ~[org.eclipse.persistence.jpa-2.7.1.jar:na]
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.14.RELEASE.jar:4.3.14.RELEASE]
... 28 common frames omitted
Caused by: org.eclipse.persistence.exceptions.DatabaseException:
Internal Exception: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(16)
Error Code: 0
Call: INSERT INTO TxEvent (COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [12 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-dubbo-consumer', instanceId='saga-dubbo-consumer-192.168.43.214', creationTime=Thu May 03 23:15:43 CST 2018, globalTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', localTxId='e2b8836e-4700-4caf-8ba9-9e309dc6e75c', parentTxId='null', type='SagaStartedEvent', compensationMethod='', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', retries=0})
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:340) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.processExceptionForCommError(DatabaseAccessor.java:1645) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:903) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:967) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:637) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:564) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2093) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:309) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:270) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:256) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:405) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:502) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:314) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:810) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2979) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:227) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:126) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4384) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1491) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1581) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:278) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1218) ~[org.eclipse.persistence.core-2.7.1.jar:na]
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:134) ~[org.eclipse.persistence.jpa-2.7.1.jar:na]
... 29 common frames omitted
Caused by: org.postgresql.util.PSQLException: ERROR: value too long for type character varying(16)
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2455) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2155) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at org.postgresql.jdbc.PgPreparedStatement.executeUpdate(PgPreparedStatement.java:135) ~[postgresql-9.4.1212.jre7.jar:9.4.1212.jre7]
at jdk.internal.reflect.GeneratedMethodAccessor83.invoke(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.27.jar:na]
at com.sun.proxy.$Proxy102.executeUpdate(Unknown Source) ~[na:na]
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895) ~[org.eclipse.persistence.core-2.7.1.jar:na]
... 60 common frames omitted

Doesn't Saga support the compensation when the value of retries is greater than naught?

I wrote a compensable method (retries = 2), its rollback method would not be called when the program encounter some errors.

I guess that there is a problem on script which is response for finding uncompensation method out.

Code:

private void saveUncompensatedEventsToCommands() {
    eventRepository.findFirstUncompensatedEventByIdGreaterThan(nextEndedEventId, TxEndedEvent.name())
        .forEach(event -> {
          LOG.info("Found uncompensated event {}", event);
          nextEndedEventId = event.id();
          commandRepository.saveCompensationCommands(event.globalTxId());
        });
}

@Override
public List<TxEvent> findFirstUncompensatedEventByIdGreaterThan(long id, String type) {
    return eventRepo.findFirstByTypeAndSurrogateIdGreaterThan(type, id, SINGLE_TX_EVENT_REQUEST);
 }

// script for finding uncompensation out
@Query("SELECT t FROM TxEvent t "
      + "WHERE t.type = ?1 AND t.surrogateId > ?2 AND EXISTS ( "
      + "  SELECT t1.globalTxId FROM TxEvent t1 "
      + "  WHERE t1.globalTxId = t.globalTxId "
      + "    AND t1.type = 'TxAbortedEvent' AND NOT EXISTS ( "
      + "    SELECT t2.globalTxId FROM TxEvent t2 "
      + "    WHERE t2.globalTxId = t1.globalTxId "
      + "      AND t2.localTxId = t1.localTxId "
      + "      AND t2.type = 'TxStartedEvent' "
      + "      AND t2.creationTime > t1.creationTime)) AND NOT EXISTS ( "
      + "  SELECT t3.globalTxId FROM TxEvent t3 "
      + "  WHERE t3.globalTxId = t.globalTxId "
      + "    AND t3.localTxId = t.localTxId "
      + "    AND t3.type = 'TxCompensatedEvent') AND ( "
      + "  SELECT MIN(t4.retries) FROM TxEvent t4 "
      + "  WHERE t4.globalTxId = t.globalTxId "
      + "    AND t4.localTxId = t.localTxId "
      + "    AND t4.type = 'TxStartedEvent' ) = 0 "
      + "ORDER BY t.surrogateId ASC")
  List<TxEvent> findFirstByTypeAndSurrogateIdGreaterThan(String type, long surrogateId, Pageable pageable);

formative script:
image

This script told us what it's invalid to rollback a compensable method of enabled retry, because the value of retries attribute must be greater than naught in its last condition.

Please point them out when I make some mistakes. Thank you!

Looking forward to call compensation functions immediately in case of one aborted event.

So far, if Saga encountered an aborted event, then it could not execute compensation functions immediately yet. Instead, the Alpha EventScanner tool would call compensation methods within 500ms.

As we all know, 500ms is a long time in terms of computer. That will lead to a lot of wrong data probably. Hope to reduce the frequencies on errors, even though we could not solve it completely at present.

image

Please point them out when I make mistakes. Thank you!

alpha server error:io.netty.handler.codec.http2.Http2Exception: Unexpected HTTP/1.x request: GET /**

### I am using saga in my sping cloud microservice project with eureka as the service registry
spring cloud version: 2.0.3

the test code:

`@Compensable(compensationMethod="cancelTransaction")
@OverRide
public void testTransaction(String questionNo) {
throw new RuntimeException("Error!");
}

@Override
public void cancelTransaction(String questionNo) {
	System.out.println("cancelTransaction....");
}`

When I test the distributed transaction in my project, the "cancelTransaction" method can't be invoked
and I got the Alpha Server error down below:

**09:20:49.209 [grpc-default-worker-ELG-3-3] INFO io.grpc.netty.NettyServerTransport.connections - Transport failed

io.netty.handler.codec.http2.Http2Exception: Unexpected HTTP/1.x request: GET /**

at io.netty.handler.codec.http2.Http2Exception.connectionError(Http2Exception.java:85) ~[netty-codec-http2-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.readClientPrefaceString(Http2ConnectionHandler.java:314) ~[netty-codec-http2-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.http2.Http2ConnectionHandler$PrefaceDecoder.decode(Http2ConnectionHandler.java:251) ~[netty-codec-http2-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.http2.Http2ConnectionHandler.decode(Http2ConnectionHandler.java:450) ~[netty-codec-http2-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) ~[netty-codec-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) ~[netty-codec-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) ~[netty-codec-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) ~[netty-transport-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-common-4.1.24.Final.jar!/:4.1.24.Final]


at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.24.Final.jar!/:4.1.24.Final]


at java.lang.Thread.run(Thread.java:745) [?:1.8.0_111]

Client output log:

2018-09-14 18:10:25.035 DEBUG [settlement,401a65f27fcc7085,0b5ac42f36a61db9,false] 38292 --- [ XNIO-2 task-6] c.i.z.m.web.aop.logging.LoggingAspect : Enter: com.ifelc.z.microservice.service.yiwen.settlement.web.controller.SettlementController.testTransaction() with argument[s] = [test]
2018-09-14 18:10:25.038 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND HEADERS: streamId=15 headers=GrpcHttp2OutboundHeaders[:authority: 172.24.120.33:8888, :path: /TxEventService/OnTxEvent, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.14.0, grpc-accept-encoding: gzip, grpc-trace-bin: ] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.039 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND DATA: streamId=15 padding=0 endStream=true length=150 bytes=0000000091088bd5bdbcdd2c122435633437643238622d363933642d346663302d396363302d3737313839323365353661311a2435633437643238622d363933...
2018-09-14 18:10:25.060 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=15 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.060 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND DATA: streamId=15 padding=0 endStream=false length=5 bytes=0000000000
2018-09-14 18:10:25.061 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=15 headers=GrpcHttp2ResponseHeaders[grpc-status: 0] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
2018-09-14 18:10:25.061 DEBUG [settlement,401a65f27fcc7085,0b5ac42f36a61db9,false] 38292 --- [ XNIO-2 task-6] c.i.z.m.web.aop.logging.LoggingAspect : Enter: com.ifelc.z.microservice.service.yiwen.settlement.service.impl.WithdrawServiceImpl.testTransaction() with argument[s] = [test]
2018-09-14 18:10:25.063 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND HEADERS: streamId=17 headers=GrpcHttp2OutboundHeaders[:authority: 172.24.120.33:8888, :path: /TxEventService/OnTxEvent, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.14.0, grpc-accept-encoding: gzip, grpc-trace-bin: ] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.063 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND DATA: streamId=17 padding=0 endStream=true length=325 bytes=000000014008a6d5bdbcdd2c122435633437643238622d363933642d346663302d396363302d3737313839323365353661311a2463653361346262362d363636...
2018-09-14 18:10:25.079 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=17 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.079 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND DATA: streamId=17 padding=0 endStream=false length=5 bytes=0000000000
2018-09-14 18:10:25.080 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=17 headers=GrpcHttp2ResponseHeaders[grpc-status: 0] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
2018-09-14 18:10:25.083 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND HEADERS: streamId=19 headers=GrpcHttp2OutboundHeaders[:authority: 172.24.120.33:8888, :path: /TxEventService/OnTxEvent, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.14.0, grpc-accept-encoding: gzip, grpc-trace-bin: ] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.084 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND DATA: streamId=19 padding=0 endStream=true length=10565 bytes=000000294008b9d5bdbcdd2c122435633437643238622d363933642d346663302d396363302d3737313839323365353661311a2463653361346262362d363636...
2018-09-14 18:10:25.097 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=19 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.097 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND DATA: streamId=19 padding=0 endStream=false length=5 bytes=0000000000
2018-09-14 18:10:25.097 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=19 headers=GrpcHttp2ResponseHeaders[grpc-status: 0] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
2018-09-14 18:10:25.098 ERROR [settlement,401a65f27fcc7085,0b5ac42f36a61db9,false] 38292 --- [ XNIO-2 task-6] c.i.z.m.web.aop.logging.LoggingAspect : Exception in com.ifelc.z.microservice.service.yiwen.settlement.service.impl.WithdrawServiceImpl.testTransaction() with cause = 'NULL' and exception = 'Error!'

java.lang.RuntimeException: Error!
at com.ifelc.z.microservice.service.yiwen.settlement.service.impl.WithdrawServiceImpl.testTransaction(WithdrawServiceImpl.java:102)
at com.ifelc.z.microservice.service.yiwen.settlement.service.impl.WithdrawServiceImpl$$FastClassBySpringCGLIB$$eb230637.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at org.apache.servicecomb.saga.omega.transaction.DefaultRecovery.apply(DefaultRecovery.java:69)
at org.apache.servicecomb.saga.omega.transaction.TransactionAspect.advise(TransactionAspect.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.ifelc.z.microservice.web.aop.logging.LoggingAspect.logAround(LoggingAspect.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.ifelc.z.microservice.service.yiwen.settlement.service.impl.WithdrawServiceImpl$$EnhancerBySpringCGLIB$$c3e2d2f.testTransaction()
at com.ifelc.z.microservice.service.yiwen.settlement.web.controller.SettlementController.testTransaction(SettlementController.java:83)
at com.ifelc.z.microservice.service.yiwen.settlement.web.controller.SettlementController$$FastClassBySpringCGLIB$$88d1559c.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at org.apache.servicecomb.saga.omega.transaction.SagaStartAspect.advise(SagaStartAspect.java:53)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
at com.ifelc.z.microservice.web.aop.logging.LoggingAspect.logAround(LoggingAspect.java:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:48)
at com.ryantenney.metrics.spring.TimedMethodInterceptor.invoke(TimedMethodInterceptor.java:34)
at com.ryantenney.metrics.spring.AbstractMetricMethodInterceptor.invoke(AbstractMetricMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.ifelc.z.microservice.service.yiwen.settlement.web.controller.SettlementController$$EnhancerBySpringCGLIB$$7485ca41.testTransaction()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:111)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:158)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:126)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter.doFilter(ExceptionLoggingFilter.java:48)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at brave.servlet.TracingFilter.doFilter(TracingFilter.java:86)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:64)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:336)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

2018-09-14 18:10:25.102 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND HEADERS: streamId=21 headers=GrpcHttp2OutboundHeaders[:authority: 172.24.120.33:8888, :path: /TxEventService/OnTxEvent, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.14.0, grpc-accept-encoding: gzip, grpc-trace-bin: ] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.103 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] OUTBOUND DATA: streamId=21 padding=0 endStream=true length=10528 bytes=000000291b08ccd5bdbcdd2c122435633437643238622d363933642d346663302d396363302d3737313839323365353661311a2435633437643238622d363933...
2018-09-14 18:10:25.116 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=21 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false
2018-09-14 18:10:25.116 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND DATA: streamId=21 padding=0 endStream=false length=5 bytes=0000000000
2018-09-14 18:10:25.116 DEBUG [settlement,,,] 38292 --- [-worker-ELG-1-5] io.grpc.netty.NettyClientHandler : [id: 0x38e2a690, L:/10.32.24.127:56850 - R:/172.24.120.33:8888] INBOUND HEADERS: streamId=21 headers=GrpcHttp2ResponseHeaders[grpc-status: 0] streamDependency=0 weight=16 exclusive=false padding=0 endStream=true
2018-09-14 18:10:25.117 ERROR [settlement,401a65f27fcc7085,0b5ac42f36a61db9,false] 38292 --- [ XNIO-2 task-6] o.a.s.s.o.transaction.SagaStartAspect : Transaction 5c47d28b-693d-4fc0-9cc0-7718923e56a1 failed.

JDK9 not supported when unit testing while doc showing JDK8+

Results :

Tests in error:
blowsUpWhenRemoteIsNotReachable(io.servicecomb.saga.discovery.service.center.ServiceCenterDiscoveryRestTransportTest): Failed to load ApplicationContext
sendsGetRequestToDiscoveredService(io.servicecomb.saga.discovery.service.center.ServiceCenterDiscoveryRestTransportTest): Failed to load ApplicationContext
blowsUpWhenRemoteResponseIsNot2XX(io.servicecomb.saga.discovery.service.center.ServiceCenterDiscoveryRestTransportTest): Failed to load ApplicationContext
blowsUpWhenMethodIsUnknown(io.servicecomb.saga.discovery.service.center.ServiceCenterDiscoveryRestTransportTest): Failed to load ApplicationContext
putsRequestToDiscoveredService(io.servicecomb.saga.discovery.service.center.ServiceCenterDiscoveryRestTransportTest): Failed to load ApplicationContext

Tests run: 5, Failures: 0, Errors: 5, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ServiceComb Saga ................................... SUCCESS [ 0.231 s]
[INFO] saga-core .......................................... SUCCESS [ 10.948 s]
[INFO] saga-format ........................................ SUCCESS [ 1.505 s]
[INFO] transports ......................................... SUCCESS [ 0.023 s]
[INFO] transport-httpclient ............................... SUCCESS [ 5.566 s]
[INFO] transport-httpclient-spring ........................ SUCCESS [ 3.882 s]
[INFO] transport-resttemplate ............................. SUCCESS [ 0.112 s]
[INFO] saga-discovery ..................................... SUCCESS [ 0.032 s]
[INFO] saga-discovery-servicecenter ....................... FAILURE [ 13.044 s]
[INFO] saga-spring ........................................ SKIPPED
[INFO] integration-tests .................................. SKIPPED
[INFO] coverage-aggregate ................................. SKIPPED
[INFO] docker-build-config ................................ SKIPPED
[INFO] saga-web ........................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 36.036 s
[INFO] Finished at: 2017-12-10T17:10:59+08:00
[INFO] Final Memory: 31M/103M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project saga-discovery-servicecenter: There are test failures.
[ERROR]
[ERROR] Please refer to F:\Code\ServiceComb-Saga\saga-discovery\saga-discovery-servicecenter\target\surefire-reports for the individual test results.
[ERROR] -> [Help 1]

F:\Code\ServiceComb-Saga>java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

surefire-reports.zip

links are invalid

Some links are invalid and move to somewhere else, e.g. some links in Readme like the Pull Request Guide.

when AbortEvent is late

I write a test in AlphaIntegrationTest,
`
public void whenAbortEventIsLate(){

  String sagaGlobalId = UUID.randomUUID().toString();
  String localIdEntry = UUID.randomUUID().toString();
  String localIdEndpoint = UUID.randomUUID().toString();
  
  String anotherSagaGlobalId = UUID.randomUUID().toString();
  String anotheEntryLocalId = UUID.randomUUID().toString();
  String anotherEndPointLocalId = UUID.randomUUID().toString();
  
  asyncStub.onConnected(serviceConfig, compensateResponseObserver);
  blockingStub.onTxEvent(someGrpcEvent(SagaStartedEvent, sagaGlobalId, localIdEntry));
  blockingStub.onTxEvent(someGrpcEvent(SagaStartedEvent, anotherSagaGlobalId, anotheEntryLocalId));
  
  blockingStub.onTxEvent(someGrpcEvent(TxStartedEvent, sagaGlobalId, localIdEndpoint));
  blockingStub.onTxEvent(someGrpcEvent(TxEndedEvent, sagaGlobalId, localIdEndpoint));
  await().atMost(1, SECONDS).until(() -> eventRepo.count() == 4);
  
  blockingStub.onTxEvent(someGrpcEvent(TxStartedEvent, anotherSagaGlobalId, anotherEndPointLocalId));
  blockingStub.onTxEvent(someGrpcEvent(TxEndedEvent, anotherSagaGlobalId, anotherEndPointLocalId));
  blockingStub.onTxEvent(someGrpcEvent(TxAbortedEvent, anotherSagaGlobalId, anotherEndPointLocalId));
  
  
  await().atMost(2, SECONDS).until(() -> !receivedCommands.isEmpty());
  
  blockingStub.onTxEvent(someGrpcEvent(TxAbortedEvent, sagaGlobalId, anotheEntryLocalId));
  
  await().atMost(10, SECONDS).until(() -> receivedCommands.size() > 1);
  assertThat(receivedCommands.size(), is(2));

}`
and the test fail.
image

It seems that the first uncompensate tx can not be found if another abort event has been found.
I believe that the variable "nextEndedEventId" cause this problem.

request json generator

as a user, i want to generate saga request json by dragging and dropping services on GUI, so that i can minimize the manual coding myself and avoid human error

Why servicecomb-saga Only compensate TxEndedEvent Transaction?

If the book method throw some exception,omega will report txAbortEvent to alpha, this sub tx( book method ) also need to be compensated,but the eventScanner only compensate TxEndedEvent Transaction

test code

 @Compensable(compensationMethod = "cancelBook")
  public void book(String name,Integer cars,Integer rooms){
    someBook.confirm(); //my be throw exception
    bookingMap.put(name,cars);//my be throw exception

    template.postForEntity(
            hotelServiceUrl + "/order/{name}/{rooms}",
            null, String.class, name, rooms); // Error
  }

// not invoked
public void cancelBook(String name,Integer cars,Integer rooms){
  someBook.cancel();
 bookingMap.remove(name);
}

eventScaner

 private void saveUncompensatedEventsToCommands() {
    eventRepository.findFirstUncompensatedEventByIdGreaterThan(nextEndedEventId, TxEndedEvent.name())
        .forEach(event -> {
          LOG.info("Found uncompensated event {}", event);
          nextEndedEventId = event.id();
          commandRepository.saveCompensationCommands(event.globalTxId());
        });
  }

saga-demo port change

saga-demo/dependency-free-transaction-demo/docker-compose.yaml

 saga:
    image: "saga-spring:0.0.3-SNAPSHOT"
    hostname: saga
    ......
    ports:
      - "8080:8080"
    depends_on:
      postgres:
        condition: service_healthy

I think http://<docker.host.ip>:8083/requests port need change or docker-compose.yaml port need change

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.