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:47 UTC
[incubator-servicecomb-saga] 02/07: SCB-244 add servicecomb demo
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