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/01/24 15:12:51 UTC
[incubator-servicecomb-saga] 05/07: SCB-237 linked pack demos with
cucumber test
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 <se...@huawei.com>
AuthorDate: Wed Jan 24 17:36:11 2018 +0800
SCB-237 linked pack demos with cucumber test
Signed-off-by: seanyinx <se...@huawei.com>
---
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
ningjiang@apache.org.