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 99172eb3cf32795062120153181ff764db5e19b8
Author: seanyinx <[email protected]>
AuthorDate: Wed Jan 24 17:36:11 2018 +0800

    SCB-237 linked pack demos with cucumber test
    
    Signed-off-by: seanyinx <[email protected]>
---
 acceptance-tests/acceptance-pack/pom.xml           | 103 ++++++++++++++++++++-
 .../org/apache/servicecomb/saga/PackStepdefs.java  |  68 ++++++++++----
 .../test/resources/pack_success_scenario.feature   |  10 +-
 .../servicecomb/saga/alpha/core/EventScanner.java  |   1 -
 .../saga/alpha/server/AlphaEventController.java    |   7 ++
 .../src/main/resources/application.yaml            |   3 +
 pom.xml                                            |   3 +-
 .../servicecomb/saga/demo/pack/car/CarBooking.java |  48 ++++++----
 .../saga/demo/pack/car/CarBookingController.java   |  11 ++-
 .../saga/demo/pack/car/CarBookingService.java      |  22 +++--
 .../saga/demo/pack/hotel/HotelBooking.java         |  48 ++++++----
 .../demo/pack/hotel/HotelBookingController.java    |  11 ++-
 .../saga/demo/pack/hotel/HotelBookingService.java  |  24 ++---
 saga-demo/pack-demo/pom.xml                        |   6 ++
 saga-format/pom.xml                                |   4 +-
 15 files changed, 274 insertions(+), 95 deletions(-)

diff --git a/acceptance-tests/acceptance-pack/pom.xml 
b/acceptance-tests/acceptance-pack/pom.xml
index 67938f6..cc4a384 100644
--- a/acceptance-tests/acceptance-pack/pom.xml
+++ b/acceptance-tests/acceptance-pack/pom.xml
@@ -28,6 +28,19 @@
 
   <artifactId>acceptance-pack</artifactId>
 
+  <dependencies>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+  </dependencies>
+
   <profiles>
     <profile>
       <id>docker</id>
@@ -78,18 +91,94 @@
                       <tcp>
                         <ports>
                           <port>8080</port>
+                          <port>8090</port>
                         </ports>
                       </tcp>
                       <time>120000</time>
                     </wait>
                     <ports>
                       <port>alpha.port:8080</port>
+                      <port>alpha.rest.port:8090</port>
                     </ports>
                     <dependsOn>
                       <dependsOn>postgres</dependsOn>
                     </dependsOn>
                   </run>
                 </image>
+                <image>
+                  <name>pack-car:${project.version}</name>
+                  <alias>car</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>car.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
+                <image>
+                  <name>pack-hotel:${project.version}</name>
+                  <alias>hotel</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>hotel.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
+                <image>
+                  <name>pack-booking:${project.version}</name>
+                  <alias>booking</alias>
+                  <run>
+                    <env>
+                      <JAVA_OPTS />
+                    </env>
+                    <wait>
+                      <log>Started [a-zA-Z]+ in [0-9.]+ seconds</log>
+                      <tcp>
+                        <ports>
+                          <port>8080</port>
+                        </ports>
+                      </tcp>
+                      <time>120000</time>
+                    </wait>
+                    <links>
+                      <link>alpha:alpha-server.servicecomb.io</link>
+                      <link>car:pack-car.servicecomb.io</link>
+                      <link>hotel:pack-hotel.servicecomb.io</link>
+                    </links>
+                    <ports>
+                      <port>booking.port:8080</port>
+                    </ports>
+                  </run>
+                </image>
               </images>
             </configuration>
             <executions>
@@ -135,8 +224,20 @@
             <configuration>
               <systemPropertyVariables>
                 <alpha.cluster.address>
-                  ${docker.hostname}:${alpha.port}
+                  http://${docker.hostname}:${alpha.port}
                 </alpha.cluster.address>
+                <alpha.rest.address>
+                  http://${docker.hostname}:${alpha.rest.port}
+                </alpha.rest.address>
+                <car.service.address>
+                  http://${docker.hostname}:${car.port}
+                </car.service.address>
+                <hotel.service.address>
+                  http://${docker.hostname}:${hotel.port}
+                </hotel.service.address>
+                <booking.service.address>
+                  http://${docker.hostname}:${booking.port}
+                </booking.service.address>
                 <spring.datasource.url>
                   
jdbc:postgresql://${docker.hostname}:${postgres.port}/saga?useSSL=false
                 </spring.datasource.url>
diff --git 
a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
 
b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
index 0cd13a9..0d73423 100644
--- 
a/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
+++ 
b/acceptance-tests/acceptance-pack/src/test/java/org/apache/servicecomb/saga/PackStepdefs.java
@@ -18,30 +18,38 @@
 package org.apache.servicecomb.saga;
 
 import static io.restassured.RestAssured.given;
+import static java.util.Arrays.asList;
 import static org.hamcrest.core.Is.is;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Arrays;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.function.Consumer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import cucumber.api.DataTable;
+import cucumber.api.java.After;
 import cucumber.api.java8.En;
 
 public class PackStepdefs implements En {
   private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
+  private static final String ALPHA_REST_ADDRESS = "alpha.rest.address";
+  private static final String CAR_SERVICE_ADDRESS = "car.service.address";
+  private static final String HOTEL_SERVICE_ADDRESS = "hotel.service.address";
+  private static final String[] addresses = {CAR_SERVICE_ADDRESS, 
HOTEL_SERVICE_ADDRESS};
+
+  private static final Consumer<Map<String, String>[]> NO_OP_CONSUMER = 
(dataMap) -> {
+  };
+
   public PackStepdefs() {
     Given("^Car Service is up and running$", () -> {
-      probe(System.getProperty("car.service.address"));
+      probe(System.getProperty(CAR_SERVICE_ADDRESS));
     });
 
     And("^Hotel Service is up and running$", () -> {
-      probe(System.getProperty("hotel.service.address"));
+      probe(System.getProperty(HOTEL_SERVICE_ADDRESS));
     });
 
     When("^User ([A-Za-z]+) requests to book ([0-9]+) cars and ([0-9]+) 
rooms$", (username, cars, rooms) -> {
@@ -58,43 +66,63 @@ public class PackStepdefs implements En {
     });
 
     Then("^Alpha records the following events$", (DataTable dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, 
String.class);
-      log.info("events {}", maps);
+      Consumer<Map<String, String>[]> columnStrippingConsumer = dataMap -> {
+        for (Map<String, String> map : dataMap)
+          map.keySet().retainAll(dataTable.topCells());
+      };
+
+      dataMatches(System.getProperty(ALPHA_REST_ADDRESS) + "/events", 
dataTable, columnStrippingConsumer);
     });
 
     And("^Car Service contains the following booking orders$", (DataTable 
dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, 
String.class);
-      log.info("car orders {}", maps);
-
-      bookingsMatches(dataTable, "car.service.address");
+      dataMatches(System.getProperty(CAR_SERVICE_ADDRESS) + "/bookings", 
dataTable, NO_OP_CONSUMER);
     });
 
     And("^Hotel Service contains the following booking orders$", (DataTable 
dataTable) -> {
-      List<Map<String, String>> maps = dataTable.asMaps(String.class, 
String.class);
-      log.info("hotel orders {}", maps);
-
-      bookingsMatches(dataTable, "hotel.service.address");
+      dataMatches(System.getProperty(HOTEL_SERVICE_ADDRESS) + "/bookings", 
dataTable, NO_OP_CONSUMER);
     });
   }
 
+  @After
+  public void cleanUp() {
+    log.info("Cleaning up services");
+    for (String address : addresses) {
+      given()
+          .when()
+          .delete(System.getProperty(address) + "/bookings")
+          .then()
+          .statusCode(is(200));
+    }
+
+    given()
+        .when()
+        .delete(System.getProperty(ALPHA_REST_ADDRESS) + "/events")
+        .then()
+        .statusCode(is(200));
+  }
+
   @SuppressWarnings("unchecked")
-  private void bookingsMatches(DataTable dataTable, String address) {
-    Map<String, String>[] bookings = given()
+  private void dataMatches(String address, DataTable dataTable, 
Consumer<Map<String, String>[]> dataProcessor) {
+    Map<String, String>[] dataMap = given()
         .when()
-        .post(System.getProperty(address) + "/bookings")
+        .get(address)
         .then()
         .statusCode(is(200))
         .extract()
         .body()
         .as(Map[].class);
 
-    dataTable.diff(Arrays.stream(bookings).collect(Collectors.toList()));
+    dataProcessor.accept(dataMap);
+
+    log.info("Retrieved data {} from service", dataMap);
+    dataTable.diff(DataTable.create(asList(dataMap)));
   }
 
   private void probe(String address) {
+    log.info("Connecting to service address {}", address);
     given()
         .when()
-        .post(address + "/info")
+        .get(address + "/info")
         .then()
         .statusCode(is(200));
   }
diff --git 
a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
 
b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
index da233b0..5013cb9 100644
--- 
a/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
+++ 
b/acceptance-tests/acceptance-pack/src/test/resources/pack_success_scenario.feature
@@ -7,7 +7,7 @@ Feature: Alpha records transaction events
     When User Sean requests to book 2 cars and 1 rooms
 
     Then Alpha records the following events
-      | service name | event type       |
+      | serviceName  | type             |
       | pack-booking | SagaStartedEvent |
       | pack-car     | TxStartedEvent   |
       | pack-car     | TxEndedEvent     |
@@ -16,9 +16,9 @@ Feature: Alpha records transaction events
       | pack-booking | SagaEndedEvent   |
 
     And Car Service contains the following booking orders
-      | user name | amount | confirmed |
-      | Sean      | 2      | true      |
+      | name | amount | confirmed | cancelled |
+      | Sean | 2      | true      | false     |
 
     And Hotel Service contains the following booking orders
-      | user name | amount | confirmed |
-      | Sean      | 1      | true      |
+      | name | amount | confirmed | cancelled |
+      | Sean | 1      | true      | false     |
diff --git 
a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
 
b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
index 80deeb3..2d51a74 100644
--- 
a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
+++ 
b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/EventScanner.java
@@ -133,7 +133,6 @@ public class EventScanner implements Runnable {
         EMPTY_PAYLOAD);
   }
 
-  // TODO: 2018/1/19 potentially compensation may be out of order if we don't 
wait till received compensated event for the previous one, since compensation 
is async
   private void compensate() {
     commandRepository.findFirstCommandToCompensate()
         .forEach(command -> {
diff --git 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
index 0f6e139..aa469c4 100644
--- 
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
+++ 
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/AlphaEventController.java
@@ -24,6 +24,7 @@ import java.util.List;
 import org.apache.servicecomb.saga.alpha.core.TxEvent;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
@@ -50,6 +51,12 @@ class AlphaEventController {
     return ResponseEntity.ok(eventVos);
   }
 
+  @DeleteMapping("/events")
+  ResponseEntity<String> clear() {
+    eventRepository.deleteAll();
+    return ResponseEntity.ok("All events deleted");
+  }
+
   @JsonAutoDetect(fieldVisibility = Visibility.ANY)
   private static class TxEventVo extends TxEvent {
     private TxEventVo(TxEvent event) {
diff --git a/alpha/alpha-server/src/main/resources/application.yaml 
b/alpha/alpha-server/src/main/resources/application.yaml
index cf3c896..a4790e2 100644
--- a/alpha/alpha-server/src/main/resources/application.yaml
+++ b/alpha/alpha-server/src/main/resources/application.yaml
@@ -22,3 +22,6 @@ spring:
     url: jdbc:postgresql://postgresql.servicecomb.io:5432/saga?useSSL=false
     platform: postgresql
 #    continue-on-error: true
+
+server:
+  port: 8090
diff --git a/pom.xml b/pom.xml
index 9939b7f..13e9ca0 100755
--- a/pom.xml
+++ b/pom.xml
@@ -44,7 +44,6 @@
     <module>pack-common</module>
     <module>integration-tests</module>
     <module>saga-persistence</module>
-    <module>acceptance-tests</module>
   </modules>
 
   <properties>
@@ -64,6 +63,7 @@
     <kryo.version>4.0.1</kryo.version>
     <javax.transaction.version>1.2</javax.transaction.version>
     <eclipse.link.version>2.7.1</eclipse.link.version>
+    <jackson.version>2.9.0</jackson.version>
   </properties>
 
   <name>ServiceComb Saga</name>
@@ -710,6 +710,7 @@
       <id>demo</id>
       <modules>
         <module>saga-demo</module>
+        <module>acceptance-tests</module>
       </modules>
     </profile>
     <profile>
diff --git 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
index 11b936d..94f40d4 100644
--- 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
+++ 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBooking.java
@@ -17,50 +17,58 @@
 
 package org.apache.servicecomb.saga.demo.pack.car;
 
-public class CarBooking {
+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 cars;
-  private boolean confirm;
-  private boolean cancel;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
 
-  public Integer getId() {
+  Integer getId() {
     return id;
   }
 
-  public void setId(Integer id) {
+  void setId(Integer id) {
     this.id = id;
   }
 
-  public String getName() {
+  String getName() {
     return name;
   }
 
-  public void setName(String name) {
+  void setName(String name) {
     this.name = name;
   }
 
-  public Integer getCars() {
-    return cars;
+  Integer getAmount() {
+    return amount;
   }
 
-  public void setCars(Integer cars) {
-    this.cars = cars;
+  void setAmount(Integer amount) {
+    this.amount = amount;
   }
 
-  public boolean isConfirm() {
-    return confirm;
+  boolean isConfirmed() {
+    return confirmed;
   }
 
-  public void setConfirm(boolean confirm) {
-    this.confirm = confirm;
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
   }
 
-  public boolean isCancel() {
-    return cancel;
+  boolean isCancelled() {
+    return cancelled;
   }
 
-  public void setCancel(boolean cancel) {
-    this.cancel = cancel;
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
   }
 }
diff --git 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
index 60849aa..4528c22 100644
--- 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
+++ 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingController.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.saga.demo.pack.car;
 
 import org.springframework.beans.factory.annotation.Autowired;
+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;
@@ -32,7 +33,7 @@ public class CarBookingController {
   @Autowired
   private CarBookingService service;
 
-  private AtomicInteger id = new AtomicInteger(0);
+  private final AtomicInteger id = new AtomicInteger(0);
 
   @GetMapping("/bookings") List<CarBooking> getAll() {
     return new ArrayList<>(service.getAllBookings());
@@ -43,8 +44,14 @@ public class CarBookingController {
     CarBooking booking = new CarBooking();
     booking.setId(id.incrementAndGet());
     booking.setName(name);
-    booking.setCars(cars);
+    booking.setAmount(cars);
     service.order(booking);
     return booking;
   }
+
+  @DeleteMapping("/bookings")
+  void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
 }
diff --git 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
index 8c3f8f4..3be4d36 100644
--- 
a/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
+++ 
b/saga-demo/pack-demo/car/src/main/java/org/apache/servicecomb/saga/demo/pack/car/CarBookingService.java
@@ -21,29 +21,31 @@ import 
org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Service
-public class CarBookingService {
-  private ConcurrentHashMap<Integer, CarBooking> bookings = new 
ConcurrentHashMap<>();
+class CarBookingService {
+  private Map<Integer, CarBooking> bookings = new ConcurrentHashMap<>();
 
   @Compensable(compensationMethod = "cancel")
-  public void order(CarBooking booking) {
-    booking.setConfirm(true);
-    booking.setCancel(false);
+  void order(CarBooking booking) {
+    booking.confirm();
     bookings.put(booking.getId(), booking);
   }
 
-  public void cancel(CarBooking booking) {
+  void cancel(CarBooking booking) {
     Integer id = booking.getId();
     if (bookings.containsKey(id)) {
-      CarBooking origin = bookings.get(id);
-      origin.setConfirm(false);
-      origin.setCancel(true);
+      bookings.get(id).cancel();
     }
   }
 
-  public Collection<CarBooking> getAllBookings() {
+  Collection<CarBooking> getAllBookings() {
     return bookings.values();
   }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
 }
diff --git 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
index e7c748c..e621b23 100644
--- 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
+++ 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBooking.java
@@ -17,50 +17,58 @@
 
 package org.apache.servicecomb.saga.demo.pack.hotel;
 
-public class HotelBooking {
+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 rooms;
-  private boolean confirm;
-  private boolean cancel;
+  private Integer amount;
+  private boolean confirmed;
+  private boolean cancelled;
 
-  public Integer getId() {
+  Integer getId() {
     return id;
   }
 
-  public void setId(Integer id) {
+  void setId(Integer id) {
     this.id = id;
   }
 
-  public String getName() {
+  String getName() {
     return name;
   }
 
-  public void setName(String name) {
+  void setName(String name) {
     this.name = name;
   }
 
-  public Integer getRooms() {
-    return rooms;
+  Integer getAmount() {
+    return amount;
   }
 
-  public void setRooms(Integer rooms) {
-    this.rooms = rooms;
+  void setAmount(Integer amount) {
+    this.amount = amount;
   }
 
-  public boolean isConfirm() {
-    return confirm;
+  boolean isConfirmed() {
+    return confirmed;
   }
 
-  public void setConfirm(boolean confirm) {
-    this.confirm = confirm;
+  void confirm() {
+    this.confirmed = true;
+    this.cancelled = false;
   }
 
-  public boolean isCancel() {
-    return cancel;
+  boolean isCancelled() {
+    return cancelled;
   }
 
-  public void setCancel(boolean cancel) {
-    this.cancel = cancel;
+  void cancel() {
+    this.confirmed = false;
+    this.cancelled = true;
   }
 }
diff --git 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
index 0474d71..22f9b2c 100644
--- 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
+++ 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingController.java
@@ -18,6 +18,7 @@
 package org.apache.servicecomb.saga.demo.pack.hotel;
 
 import org.springframework.beans.factory.annotation.Autowired;
+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;
@@ -32,7 +33,7 @@ public class HotelBookingController {
   @Autowired
   private HotelBookingService service;
 
-  private AtomicInteger id = new AtomicInteger(0);
+  private final AtomicInteger id = new AtomicInteger(0);
 
   @GetMapping("/bookings")
   List<HotelBooking> getAll() {
@@ -44,8 +45,14 @@ public class HotelBookingController {
     HotelBooking booking = new HotelBooking();
     booking.setId(id.incrementAndGet());
     booking.setName(name);
-    booking.setRooms(rooms);
+    booking.setAmount(rooms);
     service.order(booking);
     return booking;
   }
+
+  @DeleteMapping("/bookings")
+  void clear() {
+    service.clearAllBookings();
+    id.set(0);
+  }
 }
diff --git 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
index d819843..9abf040 100644
--- 
a/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
+++ 
b/saga-demo/pack-demo/hotel/src/main/java/org/apache/servicecomb/saga/demo/pack/hotel/HotelBookingService.java
@@ -21,32 +21,34 @@ import 
org.apache.servicecomb.saga.omega.transaction.annotations.Compensable;
 import org.springframework.stereotype.Service;
 
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Service
-public class HotelBookingService {
-  private ConcurrentHashMap<Integer, HotelBooking> bookings = new 
ConcurrentHashMap<>();
+class HotelBookingService {
+  private Map<Integer, HotelBooking> bookings = new ConcurrentHashMap<>();
 
   @Compensable(compensationMethod = "cancel")
-  public void order(HotelBooking booking) {
-    if (booking.getRooms() > 2) {
+  void order(HotelBooking booking) {
+    if (booking.getAmount() > 2) {
       throw new IllegalArgumentException("can not order the rooms large than 
two");
     }
-    booking.setConfirm(true);
-    booking.setCancel(false);
+    booking.confirm();
     bookings.put(booking.getId(), booking);
   }
 
-  public void cancel(HotelBooking booking) {
+  void cancel(HotelBooking booking) {
     Integer id = booking.getId();
     if (bookings.containsKey(id)) {
-      HotelBooking origin = bookings.get(id);
-      origin.setConfirm(false);
-      origin.setCancel(true);
+      bookings.get(id).cancel();
     }
   }
 
-  public Collection<HotelBooking> getAllBookings() {
+  Collection<HotelBooking> getAllBookings() {
     return bookings.values();
   }
+
+  void clearAllBookings() {
+    bookings.clear();
+  }
 }
diff --git a/saga-demo/pack-demo/pom.xml b/saga-demo/pack-demo/pom.xml
index 3b3453e..8deb910 100644
--- a/saga-demo/pack-demo/pom.xml
+++ b/saga-demo/pack-demo/pom.xml
@@ -34,4 +34,10 @@
     <module>hotel</module>
   </modules>
 
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-actuator</artifactId>
+    </dependency>
+  </dependencies>
 </project>
diff --git a/saga-format/pom.xml b/saga-format/pom.xml
index 4d3952f..a6c0457 100644
--- a/saga-format/pom.xml
+++ b/saga-format/pom.xml
@@ -35,12 +35,12 @@
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
-      <version>2.9.0</version>
+      <version>${jackson.version}</version>
     </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
-      <version>2.9.0</version>
+      <version>${jackson.version}</version>
     </dependency>
     <dependency>
       <groupId>io.kamon</groupId>

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to