You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ni...@apache.org on 2018/06/26 00:20:45 UTC

[incubator-servicecomb-saga] branch master updated (1934ec1 -> b450957)

This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git.


    from 1934ec1  Added maven repo release badge into README.md
     new 92394da  SCB-244 fix servicecomb handler
     new 86b2523  SCB-244 add servicecomb demo
     new 778ff69  SCB-244 for docker compose
     new c812259  SCB-244 fix scope and package
     new 467b88f  SCB-244 fix docker compose yaml
     new b99bec4  SCB-244 add readme and add warn log in handler
     new b450957  SCB-244 fix pr comment

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../transport/servicecomb/SagaConsumerHandler.java | 29 ++++++----
 .../transport/servicecomb/SagaProviderHandler.java | 27 ++++++---
 .../servicecomb/SagaConsumerHandlerTest.java       |  9 ++-
 .../servicecomb/SagaProviderHandlerTest.java       | 10 ++--
 pom.xml                                            |  6 ++
 saga-demo/pom.xml                                  |  1 +
 saga-demo/saga-servicecomb-demo/README.md          | 61 +++++++++++++++++++++
 .../docker-compose.yaml                            | 24 +++++---
 .../booking => saga-servicecomb-demo}/pom.xml      | 64 +++++++++++++++++++---
 .../scb-booking}/pom.xml                           |  7 ++-
 .../saga/demo/scb/booking/BookingApplication.java} |  8 ++-
 .../saga/demo/scb}/booking/BookingController.java  | 21 +++----
 .../src/main/resources/application.yaml            |  0
 .../scb-booking}/src/main/resources/log4j2.xml     |  0
 .../src/main/resources/microservice.yaml           | 46 ++++++++++++++++
 .../scb-car}/pom.xml                               |  7 ++-
 .../saga/demo/scb/car/CarApplication.java}         |  8 ++-
 .../servicecomb/saga/demo/scb}/car/CarBooking.java |  2 +-
 .../saga/demo/scb}/car/CarBookingController.java   | 25 +++++----
 .../saga/demo/scb}/car/CarBookingService.java      |  8 +--
 .../scb-car}/src/main/resources/application.yaml   |  0
 .../scb-car}/src/main/resources/log4j2.xml         |  0
 .../scb-car/src/main/resources/microservice.yaml   | 46 ++++++++++++++++
 .../scb-hotel}/pom.xml                             |  7 ++-
 .../saga/demo/scb/hotel/HotelApplication.java}     |  8 ++-
 .../saga/demo/scb}/hotel/HotelBooking.java         |  2 +-
 .../demo/scb}/hotel/HotelBookingController.java    | 28 +++++-----
 .../saga/demo/scb}/hotel/HotelBookingService.java  |  8 +--
 .../scb-hotel}/src/main/resources/application.yaml |  0
 .../scb-hotel}/src/main/resources/log4j2.xml       |  0
 .../scb-hotel/src/main/resources/microservice.yaml | 46 ++++++++++++++++
 31 files changed, 402 insertions(+), 106 deletions(-)
 create mode 100644 saga-demo/saga-servicecomb-demo/README.md
 copy saga-demo/{saga-spring-cloud-demo => saga-servicecomb-demo}/docker-compose.yaml (80%)
 copy saga-demo/{saga-spring-cloud-demo/booking => saga-servicecomb-demo}/pom.xml (61%)
 copy saga-demo/{saga-dubbo-demo/service-pub => saga-servicecomb-demo/scb-booking}/pom.xml (88%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/Application.java => saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingApplication.java} (81%)
 copy saga-demo/{saga-spring-cloud-demo/booking/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb}/booking/BookingController.java (79%)
 copy saga-demo/{saga-spring-cloud-demo/booking => saga-servicecomb-demo/scb-booking}/src/main/resources/application.yaml (100%)
 copy saga-demo/{saga-spring-cloud-demo/hotel => saga-servicecomb-demo/scb-booking}/src/main/resources/log4j2.xml (100%)
 create mode 100644 saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
 copy saga-demo/{saga-dubbo-demo/service-pub => saga-servicecomb-demo/scb-car}/pom.xml (89%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/Application.java => saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarApplication.java} (82%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb}/car/CarBooking.java (97%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb}/car/CarBookingController.java (78%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb}/car/CarBookingService.java (96%)
 copy saga-demo/{saga-spring-cloud-demo/car => saga-servicecomb-demo/scb-car}/src/main/resources/application.yaml (100%)
 copy saga-demo/{saga-spring-cloud-demo/hotel => saga-servicecomb-demo/scb-car}/src/main/resources/log4j2.xml (100%)
 create mode 100644 saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
 copy saga-demo/{saga-dubbo-demo/service-pub => saga-servicecomb-demo/scb-hotel}/pom.xml (89%)
 copy saga-demo/{saga-spring-cloud-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/Application.java => saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelApplication.java} (81%)
 copy saga-demo/{saga-spring-cloud-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb}/hotel/HotelBooking.java (97%)
 copy saga-demo/{saga-spring-cloud-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb}/hotel/HotelBookingController.java (77%)
 copy saga-demo/{saga-spring-cloud-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack => saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb}/hotel/HotelBookingService.java (96%)
 copy saga-demo/{saga-spring-cloud-demo/hotel => saga-servicecomb-demo/scb-hotel}/src/main/resources/application.yaml (100%)
 copy saga-demo/{saga-spring-cloud-demo/hotel => saga-servicecomb-demo/scb-hotel}/src/main/resources/log4j2.xml (100%)
 create mode 100644 saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml


[incubator-servicecomb-saga] 05/07: SCB-244 fix docker compose yaml

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 467b88f64abeb88409d5bbddc2b05d9c457bfebe
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jun 20 18:23:45 2018 +0800

    SCB-244 fix docker compose yaml
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 saga-demo/saga-servicecomb-demo/docker-compose.yaml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/saga-demo/saga-servicecomb-demo/docker-compose.yaml b/saga-demo/saga-servicecomb-demo/docker-compose.yaml
index 0313e23..b6e6b38 100644
--- a/saga-demo/saga-servicecomb-demo/docker-compose.yaml
+++ b/saga-demo/saga-servicecomb-demo/docker-compose.yaml
@@ -32,7 +32,7 @@ services:
         retries: 5
 
   alpha:
-    image: "alpha-server:${TAG}"
+    image: "alpha-server:0.3.0-SNAPSHOT"
     hostname: alpha-server
     links:
       - "database:postgresql.servicecomb.io"
@@ -54,31 +54,31 @@ services:
       - "30100:30100"
 
   hotel:
-    image: "scb-hotel:${TAG}"
+    image: "scb-hotel:0.3.0-SNAPSHOT"
     hostname: hotel
     links:
       - "alpha:alpha-server.servicecomb.io"
       - "servicecenter:service-center.servicecomb.io"
     ports:
-      - "8081:8080"
+      - "8081:8081"
     depends_on:
       alpha:
         condition: service_healthy
 
   car:
-    image: "scb-car:${TAG}"
+    image: "scb-car:0.3.0-SNAPSHOT"
     hostname: car
     links:
       - "alpha:alpha-server.servicecomb.io"
       - "servicecenter:service-center.servicecomb.io"
     ports:
-      - "8082:8080"
+      - "8082:8082"
     depends_on:
       alpha:
         condition: service_healthy
 
   booking:
-    image: "scb-booking:${TAG}"
+    image: "scb-booking:0.3.0-SNAPSHOT"
     hostname: booking
     links:
       - "alpha:alpha-server.servicecomb.io"
@@ -86,7 +86,7 @@ services:
       - "car:car.servicecomb.io"
       - "servicecenter:service-center.servicecomb.io"
     ports:
-      - "8083:8080"
+      - "8083:8083"
     depends_on:
       - hotel
       - car


[incubator-servicecomb-saga] 07/07: SCB-244 fix pr comment

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit b45095701979767b10be5674aca1905758f2dd88
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Thu Jun 21 10:34:47 2018 +0800

    SCB-244 fix pr comment
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 omega/omega-transport/omega-transport-servicecomb/pom.xml |  4 ----
 .../omega/transport/servicecomb/SagaConsumerHandler.java  | 15 +++++++--------
 .../omega/transport/servicecomb/SagaProviderHandler.java  | 15 +++++++--------
 .../transport/servicecomb/SagaConsumerHandlerTest.java    | 12 +++++++-----
 .../transport/servicecomb/SagaProviderHandlerTest.java    | 13 +++++++------
 pom.xml                                                   |  6 ++++++
 saga-demo/saga-servicecomb-demo/pom.xml                   | 14 --------------
 7 files changed, 34 insertions(+), 45 deletions(-)

diff --git a/omega/omega-transport/omega-transport-servicecomb/pom.xml b/omega/omega-transport/omega-transport-servicecomb/pom.xml
index a85d8bf..8eb6203 100644
--- a/omega/omega-transport/omega-transport-servicecomb/pom.xml
+++ b/omega/omega-transport/omega-transport-servicecomb/pom.xml
@@ -28,10 +28,6 @@
 
   <artifactId>omega-transport-servicecomb</artifactId>
 
-  <properties>
-    <java-chassis.version>1.0.0-m2</java-chassis.version>
-  </properties>
-
   <dependencies>
     <!-- We just need this jar for compile, the runtime should provide full dependencies -->
     <dependency>
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
index 763de88..78a1045 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
@@ -30,24 +30,23 @@ import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-
 public class SagaConsumerHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private OmegaContext omegaContext;
+  private final OmegaContext omegaContext;
 
   public SagaConsumerHandler() {
+    OmegaContext context = null;
     try {
-      omegaContext = BeanUtils.getBean("omegaContext");
+      context = BeanUtils.getBean("omegaContext");
     } catch (NullPointerException npe) {
-      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
+      LOG.warn("SagaConsumerHandler is not disabled, it's just cannot inject transaction ID.");
     }
+    this.omegaContext = context;
   }
 
-  @VisibleForTesting
-  public void setOmegaContext(OmegaContext omegaContext) {
+  public SagaConsumerHandler(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
   }
 
@@ -63,7 +62,7 @@ public class SagaConsumerHandler implements Handler {
           LOCAL_TX_ID_KEY,
           omegaContext.localTxId());
     } else {
-      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
+      LOG.info("SagaConsumerHandler is not disabled, it's just cannot inject transaction ID.");
     }
 
     invocation.next(asyncResponse);
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
index 8ea9628..2dfcab5 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
@@ -30,24 +30,23 @@ import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-
 public class SagaProviderHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private OmegaContext omegaContext;
+  private final OmegaContext omegaContext;
 
   public SagaProviderHandler() {
+    OmegaContext context = null;
     try {
-      omegaContext = BeanUtils.getBean("omegaContext");
+      context = BeanUtils.getBean("omegaContext");
     } catch (NullPointerException npe) {
-      LOG.warn("The OmegaContext is not injected, The SagaProviderHandler is disabled.");
+      LOG.warn("SagaProviderHandler is not disabled, it's just cannot inject transaction ID.");
     }
+    this.omegaContext = context;
   }
 
-  @VisibleForTesting
-  public void setOmegaContext(OmegaContext omegaContext) {
+  public SagaProviderHandler(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
   }
 
@@ -63,7 +62,7 @@ public class SagaProviderHandler implements Handler {
         omegaContext.setLocalTxId(invocation.getContext().get(LOCAL_TX_ID_KEY));
       }
     } else {
-      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
+      LOG.info("SagaProviderHandler is not disabled, it's just cannot inject transaction ID.");
     }
 
     invocation.next(asyncResponse);
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
index 691b285..d66e3ee 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
@@ -26,31 +26,33 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.saga.omega.context.IdGenerator;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
+import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.swagger.invocation.AsyncResponse;
-
 public class SagaConsumerHandlerTest {
 
   private static final String globalTxId = UUID.randomUUID().toString();
+
   private static final String localTxId = UUID.randomUUID().toString();
+
   @SuppressWarnings("unchecked")
   private final IdGenerator<String> idGenerator = mock(IdGenerator.class);
 
   private final OmegaContext omegaContext = new OmegaContext(() -> "ignored");
+
   private final Invocation invocation = mock(Invocation.class);
+
   private final AsyncResponse asyncResponse = mock(AsyncResponse.class);
 
-  private final SagaConsumerHandler handler = new SagaConsumerHandler();
+  private final SagaConsumerHandler handler = new SagaConsumerHandler(omegaContext);
 
   @Before
   public void setUp() {
     when(idGenerator.nextId()).thenReturn(globalTxId, localTxId);
-    handler.setOmegaContext(omegaContext);
   }
 
   @Test
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
index 4a6e5d6..24c277b 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
@@ -30,27 +30,29 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
+import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
+import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.servicecomb.core.Invocation;
-import org.apache.servicecomb.swagger.invocation.AsyncResponse;
-
 public class SagaProviderHandlerTest {
 
   private static final String globalTxId = UUID.randomUUID().toString();
+
   private static final String localTxId = UUID.randomUUID().toString();
+
   private final OmegaContext omegaContext = new OmegaContext(() -> "ignored");
+
   private final Invocation invocation = mock(Invocation.class);
+
   private final AsyncResponse asyncResponse = mock(AsyncResponse.class);
 
-  private final SagaProviderHandler handler = new SagaProviderHandler();
+  private final SagaProviderHandler handler = new SagaProviderHandler(omegaContext);
 
   @Before
   public void setUp() {
     omegaContext.clear();
-    handler.setOmegaContext(omegaContext);
   }
 
   @Test
@@ -75,5 +77,4 @@ public class SagaProviderHandlerTest {
     assertThat(omegaContext.globalTxId(), is(nullValue()));
     assertThat(omegaContext.localTxId(), is(nullValue()));
   }
-
 }
diff --git a/pom.xml b/pom.xml
index d20f11f..4e11d2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -65,6 +65,7 @@
     <javax.activation.version>1.1.1</javax.activation.version>
     <maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
     <netty.version>2.0.7.Final</netty.version>
+    <java-chassis.version>1.0.0-m2</java-chassis.version>
   </properties>
 
   <name>ServiceComb Saga</name>
@@ -149,6 +150,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.servicecomb.saga</groupId>
+        <artifactId>omega-transport-servicecomb</artifactId>
+        <version>0.3.0-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.servicecomb.saga</groupId>
         <artifactId>omega-connector-grpc</artifactId>
         <version>0.3.0-SNAPSHOT</version>
       </dependency>
diff --git a/saga-demo/saga-servicecomb-demo/pom.xml b/saga-demo/saga-servicecomb-demo/pom.xml
index 0f0b501..6dec185 100644
--- a/saga-demo/saga-servicecomb-demo/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/pom.xml
@@ -37,14 +37,6 @@
     <module>scb-booking</module>
   </modules>
 
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.source>1.8</maven.compiler.source>
-    <maven.compiler.target>1.8</maven.compiler.target>
-    <saga.version>0.3.0-SNAPSHOT</saga.version>
-    <java-chassis.version>1.0.0-m2</java-chassis.version>
-  </properties>
-
   <dependencyManagement>
     <dependencies>
       <dependency>
@@ -54,12 +46,6 @@
         <type>pom</type>
         <scope>import</scope>
       </dependency>
-
-      <dependency>
-        <groupId>org.apache.servicecomb.saga</groupId>
-        <artifactId>omega-transport-servicecomb</artifactId>
-        <version>${saga.version}</version>
-      </dependency>
     </dependencies>
   </dependencyManagement>
 


[incubator-servicecomb-saga] 03/07: SCB-244 for docker compose

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 778ff69c235310cffb2c2093f9684ac41b0790a1
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jun 20 15:36:37 2018 +0800

    SCB-244 for docker compose
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../saga-servicecomb-demo/docker-compose.yaml      | 93 ++++++++++++++++++++++
 .../saga-servicecomb-demo/scb-booking/pom.xml      |  1 +
 .../src/main/resources/application.yaml            |  2 +-
 .../src/main/resources/microservice.yaml           |  4 +-
 saga-demo/saga-servicecomb-demo/scb-car/pom.xml    |  1 +
 .../scb-car/src/main/resources/application.yaml    |  2 +-
 .../scb-car/src/main/resources/microservice.yaml   |  4 +-
 saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml  |  1 +
 .../scb-hotel/src/main/resources/application.yaml  |  2 +-
 .../scb-hotel/src/main/resources/microservice.yaml |  4 +-
 10 files changed, 105 insertions(+), 9 deletions(-)

diff --git a/saga-demo/saga-servicecomb-demo/docker-compose.yaml b/saga-demo/saga-servicecomb-demo/docker-compose.yaml
new file mode 100644
index 0000000..0313e23
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/docker-compose.yaml
@@ -0,0 +1,93 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+version: '2.1'
+
+services:
+  database:
+    image: "postgres"
+    hostname: postgres
+    environment:
+      - POSTGRES_DB=saga
+      - POSTGRES_USER=saga
+      - POSTGRES_PASSWORD=password
+    healthcheck:
+        test: ["CMD-SHELL", "nc -z localhost 5432 &> /dev/null; echo $$?"]
+        interval: 30s
+        timeout: 10s
+        retries: 5
+
+  alpha:
+    image: "alpha-server:${TAG}"
+    hostname: alpha-server
+    links:
+      - "database:postgresql.servicecomb.io"
+    environment:
+      - JAVA_OPTS=-Dspring.profiles.active=prd
+    healthcheck:
+        test: ["CMD-SHELL", "nc -z localhost 8080 &> /dev/null; echo $$?"]
+        interval: 30s
+        timeout: 10s
+        retries: 5
+    depends_on:
+      database:
+        condition: service_healthy
+
+  servicecenter:
+    image: "servicecomb/service-center:latest"
+    hostname: service-center
+    ports:
+      - "30100:30100"
+
+  hotel:
+    image: "scb-hotel:${TAG}"
+    hostname: hotel
+    links:
+      - "alpha:alpha-server.servicecomb.io"
+      - "servicecenter:service-center.servicecomb.io"
+    ports:
+      - "8081:8080"
+    depends_on:
+      alpha:
+        condition: service_healthy
+
+  car:
+    image: "scb-car:${TAG}"
+    hostname: car
+    links:
+      - "alpha:alpha-server.servicecomb.io"
+      - "servicecenter:service-center.servicecomb.io"
+    ports:
+      - "8082:8080"
+    depends_on:
+      alpha:
+        condition: service_healthy
+
+  booking:
+    image: "scb-booking:${TAG}"
+    hostname: booking
+    links:
+      - "alpha:alpha-server.servicecomb.io"
+      - "hotel:hotel.servicecomb.io"
+      - "car:car.servicecomb.io"
+      - "servicecenter:service-center.servicecomb.io"
+    ports:
+      - "8083:8080"
+    depends_on:
+      - hotel
+      - car
+      - servicecenter
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml b/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
index fccd810..4a21c10 100644
--- a/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
@@ -27,5 +27,6 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>scb-booking</artifactId>
+  <name>Saga::Demo::ServiceComb-Demo::Booking</name>
 
 </project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml
index 568f739..65e6508 100644
--- a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml
@@ -19,4 +19,4 @@ spring:
     name: booking
 alpha:
   cluster:
-    address: 192.168.99.100:8080
+    address: alpha-server.servicecomb.io:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
index 0cc5767..60d9a7a 100644
--- a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
@@ -34,10 +34,10 @@ servicecomb:
   service:
   #Specifies the service center IP address.
     registry:
-      address: http://127.0.0.1:30100
+      address: http://service-center.servicecomb.io:30100
   #Specifies the rest transport listening IP address.
   rest:
-    address: 127.0.0.1:18080
+    address: 0.0.0.0:8083
 
   #Add Saga Handler
   handler:
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/pom.xml b/saga-demo/saga-servicecomb-demo/scb-car/pom.xml
index 8620d20..8f13b37 100644
--- a/saga-demo/saga-servicecomb-demo/scb-car/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-car/pom.xml
@@ -27,5 +27,6 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>scb-car</artifactId>
+  <name>Saga::Demo::ServiceComb-Demo::Car</name>
 
 </project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml
index bef9ad1..42572f3 100644
--- a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml
@@ -19,4 +19,4 @@ spring:
     name: car
 alpha:
   cluster:
-    address: 192.168.99.100:8080
+    address: alpha-server.servicecomb.io:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
index b6dbdbe..49aab59 100644
--- a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
@@ -34,10 +34,10 @@ servicecomb:
   service:
   #Specifies the service center IP address.
     registry:
-      address: http://127.0.0.1:30100
+      address: http://service-center.servicecomb.io:30100
   #Specifies the rest transport listening IP address.
   rest:
-    address: 127.0.0.1:28080
+    address: 0.0.0.0:8082
 
   #Add Saga Handler
   handler:
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml b/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
index 3e68be4..b617d4d 100644
--- a/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
@@ -27,5 +27,6 @@
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>scb-hotel</artifactId>
+  <name>Saga::Demo::ServiceComb-Demo::Hotel</name>
 
 </project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml
index 333f732..99bb4a8 100644
--- a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml
@@ -19,4 +19,4 @@ spring:
     name: hotel
 alpha:
   cluster:
-    address: 192.168.99.100:8080
+    address: alpha-server.servicecomb.io:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml
index 51d8133..0ac5dba 100644
--- a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml
@@ -34,10 +34,10 @@ servicecomb:
   service:
   #Specifies the service center IP address.
     registry:
-      address: http://127.0.0.1:30100
+      address: http://service-center.servicecomb.io:30100
   #Specifies the rest transport listening IP address.
   rest:
-    address: 127.0.0.1:38080
+    address: 0.0.0.0:8081
 
   #Add Saga Handler
   handler:


[incubator-servicecomb-saga] 06/07: SCB-244 add readme and add warn log in handler

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit b99bec4ada5df2d9e4ac79fb1f3b701b177344a0
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jun 20 18:42:26 2018 +0800

    SCB-244 add readme and add warn log in handler
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../transport/servicecomb/SagaConsumerHandler.java |  4 +-
 .../transport/servicecomb/SagaProviderHandler.java |  4 +-
 saga-demo/saga-servicecomb-demo/README.md          | 61 ++++++++++++++++++++++
 3 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
index 41f16ed..763de88 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
@@ -42,7 +42,7 @@ public class SagaConsumerHandler implements Handler {
     try {
       omegaContext = BeanUtils.getBean("omegaContext");
     } catch (NullPointerException npe) {
-      LOG.info("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
+      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
     }
   }
 
@@ -62,6 +62,8 @@ public class SagaConsumerHandler implements Handler {
           omegaContext.globalTxId(),
           LOCAL_TX_ID_KEY,
           omegaContext.localTxId());
+    } else {
+      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
     }
 
     invocation.next(asyncResponse);
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
index bd73c31..8ea9628 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
@@ -42,7 +42,7 @@ public class SagaProviderHandler implements Handler {
     try {
       omegaContext = BeanUtils.getBean("omegaContext");
     } catch (NullPointerException npe) {
-      LOG.info("The OmegaContext is not injected, The SagaProviderHandler is disabled.");
+      LOG.warn("The OmegaContext is not injected, The SagaProviderHandler is disabled.");
     }
   }
 
@@ -62,6 +62,8 @@ public class SagaProviderHandler implements Handler {
         omegaContext.setGlobalTxId(globalTxId);
         omegaContext.setLocalTxId(invocation.getContext().get(LOCAL_TX_ID_KEY));
       }
+    } else {
+      LOG.warn("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
     }
 
     invocation.next(asyncResponse);
diff --git a/saga-demo/saga-servicecomb-demo/README.md b/saga-demo/saga-servicecomb-demo/README.md
new file mode 100644
index 0000000..f9cd821
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/README.md
@@ -0,0 +1,61 @@
+# Booking Demo
+This demo simulates a booking application including three services:
+* booking
+* car
+* hotel
+
+## Prerequisites
+You will need:
+1. [JDK 1.8][jdk]
+2. [Maven 3.x][maven]
+3. [Docker][docker]
+4. [Docker compose][docker_compose]
+5. [alpha server][alpha_server]
+
+
+[jdk]: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
+[maven]: https://maven.apache.org/install.html
+[docker]: https://www.docker.com/get-docker
+[docker_compose]: https://docs.docker.com/compose/install/
+[alpha_server]: https://github.com/apache/incubator-servicecomb-saga/tree/master/alpha
+
+## Running Demo
+You can run the demo using either docker compose or executable files.
+### via docker compose
+1. run the following command to create docker images in saga project root folder.
+   ```
+   mvn clean package -DskipTests -Pdocker -Pdemo
+   ```
+2. start the whole application up(including alpha server and three demo services)
+   ```
+   docker-compose up
+   ```
+
+## User Requests by command line tools
+1. Booking 2 rooms and 2 cars, this booking will be OK.
+```
+curl -X POST http://${host_address}:8083/booking/test/2/2
+```
+Check the hotel booking status with
+```
+curl http://${host_address}:8081/bookings
+```
+Check the car booking status with
+```
+curl http://${host_address}:8082/bookings
+
+```
+
+2. Booking 3 rooms and 2 cars, this booking will cause the hotel order failed and trigger the compensate operation with car booking.
+```
+curl -X POST http://${host_address}:8083/booking/test/3/2
+```
+Check the hotel booking status with
+```
+curl http://${host_address}:8081/bookings
+```
+Check the car booking status with
+```
+curl http://${host_address}:8082/bookings
+```
+The second car booking will be marked with **cancel:true**
\ No newline at end of file


[incubator-servicecomb-saga] 04/07: SCB-244 fix scope and package

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit c81225930cf9968945b59a35871b076c254673f4
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jun 20 16:45:12 2018 +0800

    SCB-244 fix scope and package
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 saga-demo/saga-servicecomb-demo/pom.xml | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/saga-demo/saga-servicecomb-demo/pom.xml b/saga-demo/saga-servicecomb-demo/pom.xml
index 3c90925..0f0b501 100644
--- a/saga-demo/saga-servicecomb-demo/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/pom.xml
@@ -73,7 +73,7 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
       <version>3.6</version>
-      <scope>Compile</scope>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -108,6 +108,16 @@
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+            <configuration>
+              <classifier>exec</classifier>
+            </configuration>
+          </execution>
+        </executions>
       </plugin>
     </plugins>
   </build>


[incubator-servicecomb-saga] 01/07: SCB-244 fix servicecomb handler

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 92394dab6483ee12738af016b5e568454cbad4ad
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Tue Jun 19 16:56:23 2018 +0800

    SCB-244 fix servicecomb handler
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../transport/servicecomb/SagaBootListener.java    | 64 ++++++++++++++++++++++
 .../transport/servicecomb/SagaConsumerHandler.java | 18 +++---
 .../transport/servicecomb/SagaProviderHandler.java | 16 ++----
 3 files changed, 77 insertions(+), 21 deletions(-)

diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java
new file mode 100644
index 0000000..412aa12
--- /dev/null
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java
@@ -0,0 +1,64 @@
+/*
+ *   Copyright 2017 Huawei Technologies Co., Ltd
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.omega.transport.servicecomb;
+
+import java.util.List;
+
+import org.apache.servicecomb.core.BootListener;
+import org.apache.servicecomb.core.Handler;
+import org.apache.servicecomb.core.handler.ConsumerHandlerManager;
+import org.apache.servicecomb.core.handler.ProducerHandlerManager;
+import org.apache.servicecomb.saga.omega.context.OmegaContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SagaBootListener implements BootListener {
+  @Autowired(required = false)
+  private OmegaContext omegaContext;
+
+  @Override
+  public void onBootEvent(BootEvent bootEvent) {
+    if (EventType.AFTER_HANDLER.equals(bootEvent.getEventType())) {
+      for (List<Handler> handlers : ConsumerHandlerManager.INSTANCE.values()) {
+        injectOmegaContextIntoConsumerHandler(handlers);
+      }
+
+      for (List<Handler> handlers : ProducerHandlerManager.INSTANCE.values()) {
+        injectOmegaContextIntoProducerHandler(handlers);
+      }
+    }
+  }
+
+  private void injectOmegaContextIntoConsumerHandler(List<Handler> handlers) {
+    for (Handler handler : handlers) {
+      if (handler.getClass().equals(SagaConsumerHandler.class)) {
+        ((SagaConsumerHandler) handler).setOmegaContext(omegaContext);
+        return;
+      }
+    }
+  }
+
+  private void injectOmegaContextIntoProducerHandler(List<Handler> handlers) {
+    for (Handler handler : handlers) {
+      if (handler.getClass().equals(SagaProviderHandler.class)) {
+        ((SagaProviderHandler) handler).setOmegaContext(omegaContext);
+        return;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
index 82e49ef..a0b0b40 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
@@ -22,30 +22,26 @@ import static org.apache.servicecomb.saga.omega.context.OmegaContext.LOCAL_TX_ID
 
 import java.lang.invoke.MethodHandles;
 
-import org.apache.servicecomb.saga.omega.context.OmegaContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
 import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class SagaConsumerHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  private final OmegaContext omegaContext;
 
-  public SagaConsumerHandler(@Autowired(required=false) OmegaContext omegaContext) {
+  private OmegaContext omegaContext;
+
+  public void setOmegaContext(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
-    if (omegaContext == null) {
-      LOG.info("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
-    }
   }
 
   @Override
   public void handle(Invocation invocation, AsyncResponse asyncResponse) throws Exception {
-    if (omegaContext!= null && omegaContext.globalTxId() != null) {
+    if (omegaContext != null && omegaContext.globalTxId() != null) {
       invocation.getContext().put(GLOBAL_TX_ID_KEY, omegaContext.globalTxId());
       invocation.getContext().put(LOCAL_TX_ID_KEY, omegaContext.localTxId());
 
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
index a3a72b6..66e4a7f 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
@@ -22,25 +22,21 @@ import static org.apache.servicecomb.saga.omega.context.OmegaContext.LOCAL_TX_ID
 
 import java.lang.invoke.MethodHandles;
 
-import org.apache.servicecomb.saga.omega.context.OmegaContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
 import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class SagaProviderHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-  private final OmegaContext omegaContext;
 
-  public SagaProviderHandler(@Autowired(required=false) OmegaContext omegaContext) {
+  private OmegaContext omegaContext;
+
+  public void setOmegaContext(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
-    if (omegaContext == null) {
-      LOG.info("The OmegaContext is not injected, The SagaProviderHander is disabled.");
-    }
   }
 
   @Override


[incubator-servicecomb-saga] 02/07: SCB-244 add servicecomb demo

Posted by ni...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 86b2523e1948964538da0ca972c6338864498b98
Author: zhengyangyong <ya...@huawei.com>
AuthorDate: Wed Jun 20 15:04:21 2018 +0800

    SCB-244 add servicecomb demo
    
    Signed-off-by: zhengyangyong <ya...@huawei.com>
---
 .../omega-transport-servicecomb/pom.xml            |   4 +
 .../transport/servicecomb/SagaBootListener.java    |  64 ---------
 .../transport/servicecomb/SagaConsumerHandler.java |  12 ++
 .../transport/servicecomb/SagaProviderHandler.java |  12 ++
 .../servicecomb/SagaConsumerHandlerTest.java       |   3 +-
 .../servicecomb/SagaProviderHandlerTest.java       |   3 +-
 saga-demo/pom.xml                                  |   1 +
 saga-demo/saga-servicecomb-demo/pom.xml            | 148 +++++++++++++++++++++
 .../saga-servicecomb-demo/scb-booking}/pom.xml     |  24 +---
 .../saga/demo/scb/booking/BookingApplication.java  |  32 +++++
 .../saga/demo/scb/booking/BookingController.java   |  57 ++++++++
 .../src/main/resources/application.yaml            |  22 +++
 .../scb-booking/src/main/resources/log4j2.xml      |  30 +++++
 .../src/main/resources/microservice.yaml           |  46 +++++++
 .../saga-servicecomb-demo/scb-car}/pom.xml         |  24 +---
 .../saga/demo/scb/car/CarApplication.java          |  32 +++++
 .../servicecomb/saga/demo/scb/car/CarBooking.java  |  74 +++++++++++
 .../saga/demo/scb/car/CarBookingController.java    |  62 +++++++++
 .../saga/demo/scb/car/CarBookingService.java       |  51 +++++++
 .../scb-car/src/main/resources/application.yaml    |  22 +++
 .../scb-car/src/main/resources/log4j2.xml          |  30 +++++
 .../scb-car/src/main/resources/microservice.yaml   |  46 +++++++
 .../saga-servicecomb-demo/scb-hotel}/pom.xml       |  24 +---
 .../saga/demo/scb/hotel/HotelApplication.java      |  32 +++++
 .../saga/demo/scb/hotel/HotelBooking.java          |  74 +++++++++++
 .../demo/scb/hotel/HotelBookingController.java     |  62 +++++++++
 .../saga/demo/scb/hotel/HotelBookingService.java   |  54 ++++++++
 .../scb-hotel/src/main/resources/application.yaml  |  22 +++
 .../scb-hotel/src/main/resources/log4j2.xml        |  30 +++++
 .../scb-hotel/src/main/resources/microservice.yaml |  46 +++++++
 30 files changed, 1017 insertions(+), 126 deletions(-)

diff --git a/omega/omega-transport/omega-transport-servicecomb/pom.xml b/omega/omega-transport/omega-transport-servicecomb/pom.xml
index 8eb6203..a85d8bf 100644
--- a/omega/omega-transport/omega-transport-servicecomb/pom.xml
+++ b/omega/omega-transport/omega-transport-servicecomb/pom.xml
@@ -28,6 +28,10 @@
 
   <artifactId>omega-transport-servicecomb</artifactId>
 
+  <properties>
+    <java-chassis.version>1.0.0-m2</java-chassis.version>
+  </properties>
+
   <dependencies>
     <!-- We just need this jar for compile, the runtime should provide full dependencies -->
     <dependency>
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java
deleted file mode 100644
index 412aa12..0000000
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaBootListener.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *   Copyright 2017 Huawei Technologies Co., Ltd
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *   limitations under the License.
- */
-
-package org.apache.servicecomb.saga.omega.transport.servicecomb;
-
-import java.util.List;
-
-import org.apache.servicecomb.core.BootListener;
-import org.apache.servicecomb.core.Handler;
-import org.apache.servicecomb.core.handler.ConsumerHandlerManager;
-import org.apache.servicecomb.core.handler.ProducerHandlerManager;
-import org.apache.servicecomb.saga.omega.context.OmegaContext;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class SagaBootListener implements BootListener {
-  @Autowired(required = false)
-  private OmegaContext omegaContext;
-
-  @Override
-  public void onBootEvent(BootEvent bootEvent) {
-    if (EventType.AFTER_HANDLER.equals(bootEvent.getEventType())) {
-      for (List<Handler> handlers : ConsumerHandlerManager.INSTANCE.values()) {
-        injectOmegaContextIntoConsumerHandler(handlers);
-      }
-
-      for (List<Handler> handlers : ProducerHandlerManager.INSTANCE.values()) {
-        injectOmegaContextIntoProducerHandler(handlers);
-      }
-    }
-  }
-
-  private void injectOmegaContextIntoConsumerHandler(List<Handler> handlers) {
-    for (Handler handler : handlers) {
-      if (handler.getClass().equals(SagaConsumerHandler.class)) {
-        ((SagaConsumerHandler) handler).setOmegaContext(omegaContext);
-        return;
-      }
-    }
-  }
-
-  private void injectOmegaContextIntoProducerHandler(List<Handler> handlers) {
-    for (Handler handler : handlers) {
-      if (handler.getClass().equals(SagaProviderHandler.class)) {
-        ((SagaProviderHandler) handler).setOmegaContext(omegaContext);
-        return;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
index a0b0b40..41f16ed 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandler.java
@@ -24,17 +24,29 @@ import java.lang.invoke.MethodHandles;
 
 import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class SagaConsumerHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private OmegaContext omegaContext;
 
+  public SagaConsumerHandler() {
+    try {
+      omegaContext = BeanUtils.getBean("omegaContext");
+    } catch (NullPointerException npe) {
+      LOG.info("The OmegaContext is not injected, The SagaConsumerHandler is disabled.");
+    }
+  }
+
+  @VisibleForTesting
   public void setOmegaContext(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
   }
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
index 66e4a7f..bd73c31 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/main/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandler.java
@@ -24,17 +24,29 @@ import java.lang.invoke.MethodHandles;
 
 import org.apache.servicecomb.core.Handler;
 import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.saga.omega.context.OmegaContext;
 import org.apache.servicecomb.swagger.invocation.AsyncResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class SagaProviderHandler implements Handler {
 
   private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private OmegaContext omegaContext;
 
+  public SagaProviderHandler() {
+    try {
+      omegaContext = BeanUtils.getBean("omegaContext");
+    } catch (NullPointerException npe) {
+      LOG.info("The OmegaContext is not injected, The SagaProviderHandler is disabled.");
+    }
+  }
+
+  @VisibleForTesting
   public void setOmegaContext(OmegaContext omegaContext) {
     this.omegaContext = omegaContext;
   }
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
index edf2c79..691b285 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaConsumerHandlerTest.java
@@ -45,11 +45,12 @@ public class SagaConsumerHandlerTest {
   private final Invocation invocation = mock(Invocation.class);
   private final AsyncResponse asyncResponse = mock(AsyncResponse.class);
 
-  private final SagaConsumerHandler handler = new SagaConsumerHandler(omegaContext);
+  private final SagaConsumerHandler handler = new SagaConsumerHandler();
 
   @Before
   public void setUp() {
     when(idGenerator.nextId()).thenReturn(globalTxId, localTxId);
+    handler.setOmegaContext(omegaContext);
   }
 
   @Test
diff --git a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
index d789c93..4a6e5d6 100644
--- a/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
+++ b/omega/omega-transport/omega-transport-servicecomb/src/test/java/org/apache/servicecomb/saga/omega/transport/servicecomb/SagaProviderHandlerTest.java
@@ -45,11 +45,12 @@ public class SagaProviderHandlerTest {
   private final Invocation invocation = mock(Invocation.class);
   private final AsyncResponse asyncResponse = mock(AsyncResponse.class);
 
-  private final SagaProviderHandler handler = new SagaProviderHandler(omegaContext);
+  private final SagaProviderHandler handler = new SagaProviderHandler();
 
   @Before
   public void setUp() {
     omegaContext.clear();
+    handler.setOmegaContext(omegaContext);
   }
 
   @Test
diff --git a/saga-demo/pom.xml b/saga-demo/pom.xml
index 8b23e35..e321a16 100644
--- a/saga-demo/pom.xml
+++ b/saga-demo/pom.xml
@@ -32,6 +32,7 @@
   <modules>
     <module>saga-dubbo-demo</module>
     <module>saga-spring-cloud-demo</module>
+    <module>saga-servicecomb-demo</module>
   </modules>
 
   <dependencyManagement>
diff --git a/saga-demo/saga-servicecomb-demo/pom.xml b/saga-demo/saga-servicecomb-demo/pom.xml
new file mode 100644
index 0000000..3c90925
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/pom.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>saga-demo</artifactId>
+    <groupId>org.apache.servicecomb.saga.demo</groupId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>saga-servicecomb-demo</artifactId>
+  <name>Saga::Demo::ServiceComb-Demo</name>
+  <packaging>pom</packaging>
+
+
+  <modules>
+    <module>scb-car</module>
+    <module>scb-hotel</module>
+    <module>scb-booking</module>
+  </modules>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    <saga.version>0.3.0-SNAPSHOT</saga.version>
+    <java-chassis.version>1.0.0-m2</java-chassis.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.servicecomb</groupId>
+        <artifactId>java-chassis-dependencies</artifactId>
+        <version>${java-chassis.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.servicecomb.saga</groupId>
+        <artifactId>omega-transport-servicecomb</artifactId>
+        <version>${saga.version}</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>20.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.6</version>
+      <scope>Compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>spring-boot-starter-provider</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-validator</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.saga</groupId>
+      <artifactId>omega-spring-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.servicecomb.saga</groupId>
+      <artifactId>omega-transport-servicecomb</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <!-- mixin plugin configurations declared in another pom,
+      just like importing dependencies managed in another pom -->
+      <plugin>
+        <groupId>com.github.odavid.maven.plugins</groupId>
+        <artifactId>mixin-maven-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>docker</id>
+      <activation>
+        <file>
+          <exists>/var/run/docker.sock</exists>
+        </file>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>io.fabric8</groupId>
+            <artifactId>docker-maven-plugin</artifactId>
+          </plugin>
+          <plugin>
+            <groupId>org.commonjava.maven.plugins</groupId>
+            <artifactId>directory-maven-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>demo</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+</project>
\ No newline at end of file
diff --git a/omega/omega-transport/omega-transport-servicecomb/pom.xml b/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
similarity index 64%
copy from omega/omega-transport/omega-transport-servicecomb/pom.xml
copy to saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
index 8eb6203..fccd810 100644
--- a/omega/omega-transport/omega-transport-servicecomb/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/pom.xml
@@ -20,28 +20,12 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>omega-transport</artifactId>
-    <groupId>org.apache.servicecomb.saga</groupId>
+    <artifactId>saga-servicecomb-demo</artifactId>
+    <groupId>org.apache.servicecomb.saga.demo</groupId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>omega-transport-servicecomb</artifactId>
+  <artifactId>scb-booking</artifactId>
 
-  <dependencies>
-    <!-- We just need this jar for compile, the runtime should provide full dependencies -->
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>java-chassis-core</artifactId>
-      <version>${java.chassis.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingApplication.java b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingApplication.java
new file mode 100644
index 0000000..bc24337
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.booking;
+
+import org.apache.servicecomb.saga.omega.spring.EnableOmega;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableServiceComb
+@EnableOmega
+public class BookingApplication {
+  public static void main(String[] args) {
+    SpringApplication.run(BookingApplication.class, args);
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingController.java b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingController.java
new file mode 100644
index 0000000..cc6947b
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/java/org/apache/servicecomb/saga/demo/scb/booking/BookingController.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.booking;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
+import org.apache.servicecomb.saga.omega.context.annotations.SagaStart;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+@RestSchema(schemaId = "booking")
+@RequestMapping(path = "/")
+public class BookingController {
+
+  private RestTemplate template = RestTemplateBuilder.create();
+
+  @SagaStart
+  @PostMapping("/booking/{name}/{rooms}/{cars}")
+  public String order(@PathVariable String name,  @PathVariable Integer rooms, @PathVariable Integer cars) {
+    template.postForEntity(
+        "cse://car/order/{name}/{cars}",
+        null, String.class, name, cars);
+
+    template.postForEntity(
+        "cse://hotel/order/{name}/{rooms}",
+        null, String.class, name, rooms);
+
+    postBooking();
+
+    return name + " booking " + rooms + " rooms and " + cars + " cars OK";
+  }
+
+  // This method is used by the byteman to inject the faults such as the timeout or the crash
+  private void postBooking() {
+
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml
new file mode 100644
index 0000000..568f739
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/application.yaml
@@ -0,0 +1,22 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+spring:
+  application:
+    name: booking
+alpha:
+  cluster:
+    address: 192.168.99.100:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/log4j2.xml b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..cae04cb
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/log4j2.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <AsyncRoot level="info">
+      <AppenderRef ref="Console"/>
+    </AsyncRoot>
+  </Loggers>
+</Configuration>
diff --git a/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..0cc5767
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-booking/src/main/resources/microservice.yaml
@@ -0,0 +1,46 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#More details can be found :
+# 1.http://servicecomb.incubator.apache.org/users/service-definition/
+# 2.http://servicecomb.incubator.apache.org/users/service-configurations/
+# 3.http://servicecomb.incubator.apache.org/users/communicate-protocol/
+
+#Indicates an application name
+APPLICATION_ID: demo
+service_description:
+#Indicates a microservice name
+#The microservice name should be unique within an application.
+#The name can contain digits, uppercase and lowercase letters, hyphens(-), underscores(_), and periods(.); and can neither start nor end with punctuations.
+#The naming rule is as follows: ^[a-zA-Z0-9]+$|^[a-zA-Z0-9][a-zA-Z0-9_-.]*[a-zA-Z0-9]$.
+  name: booking
+#Indicates a service version
+  version: 1.0.0
+servicecomb:
+  service:
+  #Specifies the service center IP address.
+    registry:
+      address: http://127.0.0.1:30100
+  #Specifies the rest transport listening IP address.
+  rest:
+    address: 127.0.0.1:18080
+
+  #Add Saga Handler
+  handler:
+    chain:
+      Consumer:
+        default: loadbalance,saga-consumer
\ No newline at end of file
diff --git a/omega/omega-transport/omega-transport-servicecomb/pom.xml b/saga-demo/saga-servicecomb-demo/scb-car/pom.xml
similarity index 64%
copy from omega/omega-transport/omega-transport-servicecomb/pom.xml
copy to saga-demo/saga-servicecomb-demo/scb-car/pom.xml
index 8eb6203..8620d20 100644
--- a/omega/omega-transport/omega-transport-servicecomb/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-car/pom.xml
@@ -20,28 +20,12 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>omega-transport</artifactId>
-    <groupId>org.apache.servicecomb.saga</groupId>
+    <artifactId>saga-servicecomb-demo</artifactId>
+    <groupId>org.apache.servicecomb.saga.demo</groupId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>omega-transport-servicecomb</artifactId>
+  <artifactId>scb-car</artifactId>
 
-  <dependencies>
-    <!-- We just need this jar for compile, the runtime should provide full dependencies -->
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>java-chassis-core</artifactId>
-      <version>${java.chassis.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarApplication.java b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarApplication.java
new file mode 100644
index 0000000..435168d
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.car;
+
+import org.apache.servicecomb.saga.omega.spring.EnableOmega;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableServiceComb
+@EnableOmega
+public class CarApplication {
+  public static void main(String[] args) {
+    SpringApplication.run(CarApplication.class, args);
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBooking.java b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBooking.java
new file mode 100644
index 0000000..497f278
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBooking.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.car;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@JsonAutoDetect(fieldVisibility = Visibility.ANY)
+class CarBooking {
+  @JsonIgnore
+  private Integer id;
+  private String name;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
+
+  Integer getId() {
+    return id;
+  }
+
+  void setId(Integer id) {
+    this.id = id;
+  }
+
+  String getName() {
+    return name;
+  }
+
+  void setName(String name) {
+    this.name = name;
+  }
+
+  Integer getAmount() {
+    return amount;
+  }
+
+  void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  boolean isConfirmed() {
+    return confirmed;
+  }
+
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
+  }
+
+  boolean isCancelled() {
+    return cancelled;
+  }
+
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingController.java b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingController.java
new file mode 100644
index 0000000..35ff146
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingController.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.car;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RestSchema(schemaId = "car")
+@RequestMapping(path = "/")
+public class CarBookingController {
+  @Autowired
+  private CarBookingService service;
+
+  private final AtomicInteger id = new AtomicInteger(0);
+
+  @CrossOrigin
+  @GetMapping(path = "/bookings")
+  public List<CarBooking> getAll() {
+    return new ArrayList<>(service.getAllBookings());
+  }
+
+  @PostMapping(path = "/order/{name}/{cars}")
+  public CarBooking order(@PathVariable String name, @PathVariable Integer cars) {
+    CarBooking booking = new CarBooking();
+    booking.setId(id.incrementAndGet());
+    booking.setName(name);
+    booking.setAmount(cars);
+    service.order(booking);
+    return booking;
+  }
+
+  @DeleteMapping(path = "/bookings")
+  void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingService.java b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingService.java
new file mode 100644
index 0000000..a94cf09
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/java/org/apache/servicecomb/saga/demo/scb/car/CarBookingService.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.car;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
+import org.springframework.stereotype.Service;
+
+@Service
+class CarBookingService {
+  private Map<Integer, CarBooking> bookings = new ConcurrentHashMap<>();
+
+  @Compensable(compensationMethod = "cancel")
+  void order(CarBooking booking) {
+    booking.confirm();
+    bookings.put(booking.getId(), booking);
+  }
+
+  void cancel(CarBooking booking) {
+    Integer id = booking.getId();
+    if (bookings.containsKey(id)) {
+      bookings.get(id).cancel();
+    }
+  }
+
+  Collection<CarBooking> getAllBookings() {
+    return bookings.values();
+  }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml
new file mode 100644
index 0000000..bef9ad1
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/application.yaml
@@ -0,0 +1,22 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+spring:
+  application:
+    name: car
+alpha:
+  cluster:
+    address: 192.168.99.100:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/log4j2.xml b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..cae04cb
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/log4j2.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <AsyncRoot level="info">
+      <AppenderRef ref="Console"/>
+    </AsyncRoot>
+  </Loggers>
+</Configuration>
diff --git a/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..b6dbdbe
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-car/src/main/resources/microservice.yaml
@@ -0,0 +1,46 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#More details can be found :
+# 1.http://servicecomb.incubator.apache.org/users/service-definition/
+# 2.http://servicecomb.incubator.apache.org/users/service-configurations/
+# 3.http://servicecomb.incubator.apache.org/users/communicate-protocol/
+
+#Indicates an application name
+APPLICATION_ID: demo
+service_description:
+#Indicates a microservice name
+#The microservice name should be unique within an application.
+#The name can contain digits, uppercase and lowercase letters, hyphens(-), underscores(_), and periods(.); and can neither start nor end with punctuations.
+#The naming rule is as follows: ^[a-zA-Z0-9]+$|^[a-zA-Z0-9][a-zA-Z0-9_-.]*[a-zA-Z0-9]$.
+  name: car
+#Indicates a service version
+  version: 1.0.0
+servicecomb:
+  service:
+  #Specifies the service center IP address.
+    registry:
+      address: http://127.0.0.1:30100
+  #Specifies the rest transport listening IP address.
+  rest:
+    address: 127.0.0.1:28080
+
+  #Add Saga Handler
+  handler:
+    chain:
+      Provider:
+        default: saga-provider
\ No newline at end of file
diff --git a/omega/omega-transport/omega-transport-servicecomb/pom.xml b/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
similarity index 64%
copy from omega/omega-transport/omega-transport-servicecomb/pom.xml
copy to saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
index 8eb6203..3e68be4 100644
--- a/omega/omega-transport/omega-transport-servicecomb/pom.xml
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/pom.xml
@@ -20,28 +20,12 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <artifactId>omega-transport</artifactId>
-    <groupId>org.apache.servicecomb.saga</groupId>
+    <artifactId>saga-servicecomb-demo</artifactId>
+    <groupId>org.apache.servicecomb.saga.demo</groupId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>omega-transport-servicecomb</artifactId>
+  <artifactId>scb-hotel</artifactId>
 
-  <dependencies>
-    <!-- We just need this jar for compile, the runtime should provide full dependencies -->
-    <dependency>
-      <groupId>org.apache.servicecomb</groupId>
-      <artifactId>java-chassis-core</artifactId>
-      <version>${java.chassis.version}</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
+</project>
\ No newline at end of file
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelApplication.java b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelApplication.java
new file mode 100644
index 0000000..ce8c0cb
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.hotel;
+
+import org.apache.servicecomb.saga.omega.spring.EnableOmega;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@EnableServiceComb
+@EnableOmega
+public class HotelApplication {
+  public static void main(String[] args) {
+    SpringApplication.run(HotelApplication.class, args);
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBooking.java b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBooking.java
new file mode 100644
index 0000000..b183a79
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBooking.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.hotel;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@JsonAutoDetect(fieldVisibility = Visibility.ANY)
+class HotelBooking {
+  @JsonIgnore
+  private Integer id;
+  private String name;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
+
+  Integer getId() {
+    return id;
+  }
+
+  void setId(Integer id) {
+    this.id = id;
+  }
+
+  String getName() {
+    return name;
+  }
+
+  void setName(String name) {
+    this.name = name;
+  }
+
+  Integer getAmount() {
+    return amount;
+  }
+
+  void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  boolean isConfirmed() {
+    return confirmed;
+  }
+
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
+  }
+
+  boolean isCancelled() {
+    return cancelled;
+  }
+
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingController.java b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingController.java
new file mode 100644
index 0000000..d7d3cd3
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingController.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.hotel;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RestSchema(schemaId = "hotel")
+@RequestMapping(path = "/")
+public class HotelBookingController {
+  @Autowired
+  private HotelBookingService service;
+
+  private final AtomicInteger id = new AtomicInteger(0);
+
+  @CrossOrigin
+  @GetMapping(path = "/bookings")
+  public List<HotelBooking> getAll() {
+    return new ArrayList<>(service.getAllBookings());
+  }
+
+  @PostMapping(path = "/order/{name}/{rooms}")
+  public HotelBooking order(@PathVariable String name, @PathVariable Integer rooms) {
+    HotelBooking booking = new HotelBooking();
+    booking.setId(id.incrementAndGet());
+    booking.setName(name);
+    booking.setAmount(rooms);
+    service.order(booking);
+    return booking;
+  }
+
+  @DeleteMapping(path = "/bookings")
+  public void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingService.java b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingService.java
new file mode 100644
index 0000000..4d4d550
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/java/org/apache/servicecomb/saga/demo/scb/hotel/HotelBookingService.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.demo.scb.hotel;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
+import org.springframework.stereotype.Service;
+
+@Service
+class HotelBookingService {
+  private Map<Integer, HotelBooking> bookings = new ConcurrentHashMap<>();
+
+  @Compensable(compensationMethod = "cancel")
+  void order(HotelBooking booking) {
+    if (booking.getAmount() > 2) {
+      throw new IllegalArgumentException("can not order the rooms large than two");
+    }
+    booking.confirm();
+    bookings.put(booking.getId(), booking);
+  }
+
+  void cancel(HotelBooking booking) {
+    Integer id = booking.getId();
+    if (bookings.containsKey(id)) {
+      bookings.get(id).cancel();
+    }
+  }
+
+  Collection<HotelBooking> getAllBookings() {
+    return bookings.values();
+  }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
+}
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml
new file mode 100644
index 0000000..333f732
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/application.yaml
@@ -0,0 +1,22 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+spring:
+  application:
+    name: hotel
+alpha:
+  cluster:
+    address: 192.168.99.100:8080
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/log4j2.xml b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..cae04cb
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/log4j2.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <AsyncRoot level="info">
+      <AppenderRef ref="Console"/>
+    </AsyncRoot>
+  </Loggers>
+</Configuration>
diff --git a/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..51d8133
--- /dev/null
+++ b/saga-demo/saga-servicecomb-demo/scb-hotel/src/main/resources/microservice.yaml
@@ -0,0 +1,46 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#More details can be found :
+# 1.http://servicecomb.incubator.apache.org/users/service-definition/
+# 2.http://servicecomb.incubator.apache.org/users/service-configurations/
+# 3.http://servicecomb.incubator.apache.org/users/communicate-protocol/
+
+#Indicates an application name
+APPLICATION_ID: demo
+service_description:
+#Indicates a microservice name
+#The microservice name should be unique within an application.
+#The name can contain digits, uppercase and lowercase letters, hyphens(-), underscores(_), and periods(.); and can neither start nor end with punctuations.
+#The naming rule is as follows: ^[a-zA-Z0-9]+$|^[a-zA-Z0-9][a-zA-Z0-9_-.]*[a-zA-Z0-9]$.
+  name: hotel
+#Indicates a service version
+  version: 1.0.0
+servicecomb:
+  service:
+  #Specifies the service center IP address.
+    registry:
+      address: http://127.0.0.1:30100
+  #Specifies the rest transport listening IP address.
+  rest:
+    address: 127.0.0.1:38080
+
+  #Add Saga Handler
+  handler:
+    chain:
+      Provider:
+        default: saga-provider
\ No newline at end of file