This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 741ad1bfa436f7f6244436f4e720f4a66bfcb6fc Author: Nicola Ferraro <ni.ferr...@gmail.com> AuthorDate: Mon Mar 2 12:04:19 2020 +0100 Fix #1304: fix the saga example to use default ports --- examples/saga/Flight.java | 6 +- examples/saga/Payment.java | 4 +- examples/saga/Readme.md | 46 ++++++-- examples/saga/Saga.java | 8 +- examples/saga/Train.java | 6 +- examples/saga/lra-coordinator-kub.yaml | 98 ----------------- examples/saga/lra-coordinator.yaml | 188 ++++++++++++++------------------- 7 files changed, 127 insertions(+), 229 deletions(-) diff --git a/examples/saga/Flight.java b/examples/saga/Flight.java index 0810c3c..f883678 100644 --- a/examples/saga/Flight.java +++ b/examples/saga/Flight.java @@ -27,8 +27,8 @@ public class Flight extends RouteBuilder { restConfiguration().port("8080"); LRASagaService service = new LRASagaService(); - service.setCoordinatorUrl("http://lra-coordinator:8080"); - service.setLocalParticipantUrl("http://flight:8080"); + service.setCoordinatorUrl("http://lra-coordinator"); + service.setLocalParticipantUrl("http://flight"); getContext().addService(service); rest("/api").post("/flight/buy") @@ -39,7 +39,7 @@ public class Flight extends RouteBuilder { .option("id", header("id")) .compensation("direct:cancelPurchase") .log("Buying flight #${header.id}") - .to("http://payment:8080/api/pay?bridgeEndpoint=true&type=flight") + .to("undertow:http://payment/api/pay?bridgeEndpoint=true&type=flight") .log("Payment for flight #${header.id} done"); from("direct:cancelPurchase") diff --git a/examples/saga/Payment.java b/examples/saga/Payment.java index a4a866b..8a6e35f 100644 --- a/examples/saga/Payment.java +++ b/examples/saga/Payment.java @@ -27,8 +27,8 @@ public class Payment extends RouteBuilder { restConfiguration().port("8080"); LRASagaService service = new LRASagaService(); - service.setCoordinatorUrl("http://lra-coordinator:8080"); - service.setLocalParticipantUrl("http://payment:8080"); + service.setCoordinatorUrl("http://lra-coordinator"); + service.setLocalParticipantUrl("http://payment"); getContext().addService(service); rest("/api/").post("/pay") diff --git a/examples/saga/Readme.md b/examples/saga/Readme.md index 5856c85..127ef99 100644 --- a/examples/saga/Readme.md +++ b/examples/saga/Readme.md @@ -1,22 +1,48 @@ # Saga example -This example is from [camel-saga-quickstart](https://github.com/nicolaferraro/camel-saga-quickstart/) and could work with the camel-k. -* Start the lra-coordinator by using the openshift +This example is from [camel-saga-quickstart](https://github.com/nicolaferraro/camel-saga-quickstart/) adapted to work with camel-k. + +Make sure Camel K is installed in your namespace, or execute the following command to install it: + ``` -oc create -f lra-coordinator.yaml +kamel install ``` -* Or start the lra-coordinator by using the kubernetes + +* Start the lra-coordinator by using the `oc` or `kubectl` tool: ``` -kubectl create -f lra-coordiantor-kub.yaml +kubectl apply -f lra-coordinator.yaml ``` + * Start the three demo services ``` -kamel run -t container.service-port=8080 --dependency=camel-rest --dependency=camel-undertow --dependency=camel-lra examples/saga/Flight.java -kamel run -t container.service-port=8080 --dependency=camel-rest --dependency=camel-undertow --dependency=camel-lra examples/saga/Train.java -kamel run -t container.service-port=8080 --dependency=camel-rest --dependency=camel-undertow --dependency=camel-lra examples/saga/Payment.java +kamel run -d camel-undertow -d camel-lra Payment.java +kamel run -d camel-lra Flight.java +kamel run -d camel-lra Train.java ``` + * Start the saga application ``` -kamel run -t container.service-port=8080 --dependency=camel-rest --dependency=camel-undertow --dependency=camel-lra examples/saga/Saga.java +kamel run -d camel-lra -t service.auto=false Saga.java +``` + +Then you can use ```kamel logs saga``` to check the output of the transactions. + +Focusing on one of the services, e.g. the flight service, you will notice that when unexpected events are found, +the operation is subsequently cancelled, e.g.: + +E.g. running: +``` +kamel logs flight +``` + +Possible workflow: +``` +flight-7c8df48b88-6pzwt integration 2020-03-02 10:56:30.148 INFO [default-workqueue-2] route2 - Buying flight #18 +flight-7c8df48b88-6pzwt integration 2020-03-02 10:56:30.165 ERROR [XNIO-1 I/O-1] DefaultErrorHandler - Failed delivery for (MessageId: ID-flight-7c8df48b88-6pzwt-1583146351094-0-106 on ExchangeId: ID-flight-7c8df48b88-6pzwt-1583146351094-0-105). Exhausted after delivery attempt: 1 caught: org.apache.camel.http.common.HttpOperationFailedException: HTTP operation failed invoking http://payment/api/pay?bridgeEndpoint=true&type=flight with statusCode: 500 +... +# after stacktrace +... +flight-7c8df48b88-6pzwt integration 2020-03-02 10:56:30.256 INFO [XNIO-2 task-6] route1 - Flight purchase #18 has been cancelled +flight-7c8df48b88-6pzwt integration 2020-03-02 10:56:35.150 INFO [default-workqueue-3] route2 - Buying flight #19 +flight-7c8df48b88-6pzwt integration 2020-03-02 10:56:35.197 INFO [XNIO-1 I/O-1] route2 - Payment for flight #19 done ``` -Then you can use ```kamel log saga``` to check the output of the transactions. diff --git a/examples/saga/Saga.java b/examples/saga/Saga.java index b37827c..5a97d8d 100644 --- a/examples/saga/Saga.java +++ b/examples/saga/Saga.java @@ -25,8 +25,8 @@ public class Saga extends RouteBuilder { restConfiguration().port("8080"); LRASagaService service = new LRASagaService(); - service.setCoordinatorUrl("http://lra-coordinator:8080"); - service.setLocalParticipantUrl("http://saga:8080"); + service.setCoordinatorUrl("http://lra-coordinator"); + service.setLocalParticipantUrl("http://saga"); getContext().addService(service); from("timer:clock?period=5000") @@ -34,8 +34,8 @@ public class Saga extends RouteBuilder { .setHeader("id", header(Exchange.TIMER_COUNTER)) .setHeader(Exchange.HTTP_METHOD, constant("POST")) .log("Executing saga #${header.id}") - .to("http://train:8080/api/train/buy/seat") - .to("http://flight:8080/api/flight/buy"); + .to("undertow:http://train/api/train/buy/seat") + .to("undertow:http://flight/api/flight/buy"); } } diff --git a/examples/saga/Train.java b/examples/saga/Train.java index 2c71fc5..c4613d3 100644 --- a/examples/saga/Train.java +++ b/examples/saga/Train.java @@ -27,8 +27,8 @@ public class Train extends RouteBuilder { restConfiguration().port("8080"); LRASagaService service = new LRASagaService(); - service.setCoordinatorUrl("http://lra-coordinator:8080"); - service.setLocalParticipantUrl("http://train:8080"); + service.setCoordinatorUrl("http://lra-coordinator"); + service.setLocalParticipantUrl("http://train"); getContext().addService(service); rest("/api/").post("/train/buy/seat") @@ -39,7 +39,7 @@ public class Train extends RouteBuilder { .option("id", header("id")) .compensation("direct:cancelPurchase") .log("Buying train seat #${header.id}") - .to("http://payment:8080/api/pay?bridgeEndpoint=true&type=train") + .to("undertow:http://payment/api/pay?bridgeEndpoint=true&type=train") .log("Payment for train #${header.id} done"); from("direct:cancelPurchase") diff --git a/examples/saga/lra-coordinator-kub.yaml b/examples/saga/lra-coordinator-kub.yaml deleted file mode 100644 index f43d413..0000000 --- a/examples/saga/lra-coordinator-kub.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# --------------------------------------------------------------------------- -# 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. -# --------------------------------------------------------------------------- - -apiVersion: v1 -kind: List -items: -- apiVersion: v1 - kind: Service - metadata: - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - ports: - - name: 8080-tcp - port: 8080 - protocol: TCP - targetPort: 8080 - selector: - app: lra-coordinator - type: ClusterIP -- apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 200Mi -- apiVersion: apps/v1 - kind: Deployment - metadata: - generation: 1 - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - replicas: 1 - selector: - matchLabels: - app: lra-coordinator - strategy: - type: Recreate - template: - metadata: - labels: - app: lra-coordinator - spec: - containers: - - imagePullPolicy: IfNotPresent - env: - - name: AB_JOLOKIA_OFF - value: "true" - livenessProbe: - httpGet: - path: /lra-coordinator - port: 8080 - scheme: HTTP - initialDelaySeconds: 180 - name: lra-coordinator - image: docker.io/jbosstm/lra-coordinator:5.9.4.Final - ports: - - containerPort: 8080 - protocol: TCP - readinessProbe: - httpGet: - path: /lra-coordinator - port: 8080 - scheme: HTTP - initialDelaySeconds: 10 - volumeMounts: - - mountPath: /data - name: lra-coordinator-data - volumes: - - name: lra-coordinator-data - persistentVolumeClaim: - claimName: lra-coordinator diff --git a/examples/saga/lra-coordinator.yaml b/examples/saga/lra-coordinator.yaml index 8dcc9fe..ef28c9f 100644 --- a/examples/saga/lra-coordinator.yaml +++ b/examples/saga/lra-coordinator.yaml @@ -15,114 +15,84 @@ # limitations under the License. # --------------------------------------------------------------------------- + apiVersion: v1 -kind: List -items: -- apiVersion: v1 - kind: Service - metadata: - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - ports: - - name: 8080-tcp - port: 8080 - protocol: TCP - targetPort: 8080 - selector: - app: lra-coordinator - deploymentconfig: lra-coordinator - type: ClusterIP -- apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 200Mi -- apiVersion: v1 - kind: ImageStream - metadata: - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - lookupPolicy: - local: true - tags: - - from: - kind: DockerImage - name: docker.io/jbosstm/lra-coordinator:5.9.4.Final - generation: 0 - importPolicy: {} - name: "5.9.4.Final" - referencePolicy: - type: Source -- apiVersion: v1 - kind: DeploymentConfig - metadata: - generation: 1 - labels: - app: lra-coordinator - template: lra-coordinator - name: lra-coordinator - spec: - replicas: 1 - selector: +kind: Service +metadata: + labels: + app: lra-coordinator + template: lra-coordinator + name: lra-coordinator +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 8080 + selector: + app: lra-coordinator + type: ClusterIP +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + app: lra-coordinator + template: lra-coordinator + name: lra-coordinator +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 200Mi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + generation: 1 + labels: + app: lra-coordinator + template: lra-coordinator + name: lra-coordinator +spec: + replicas: 1 + selector: + matchLabels: app: lra-coordinator - deploymentconfig: lra-coordinator - strategy: - type: Recreate - template: - metadata: - labels: - app: lra-coordinator - deploymentconfig: lra-coordinator - spec: - containers: - - imagePullPolicy: IfNotPresent - env: - - name: AB_JOLOKIA_OFF - value: "true" - livenessProbe: - httpGet: - path: /lra-coordinator - port: 8080 - scheme: HTTP - initialDelaySeconds: 180 - name: lra-coordinator - ports: - - containerPort: 8080 - protocol: TCP - readinessProbe: - httpGet: - path: /lra-coordinator - port: 8080 - scheme: HTTP - initialDelaySeconds: 10 - volumeMounts: - - mountPath: /data - name: lra-coordinator-data - volumes: - - name: lra-coordinator-data - persistentVolumeClaim: - claimName: lra-coordinator - triggers: - - type: ConfigChange - - imageChangeParams: - automatic: true - containerNames: - - lra-coordinator - from: - kind: ImageStreamTag - name: "lra-coordinator:5.9.4.Final" - type: ImageChange + strategy: + type: Recreate + template: + metadata: + labels: + app: lra-coordinator + spec: + containers: + - imagePullPolicy: IfNotPresent + env: + - name: AB_JOLOKIA_OFF + value: "true" + livenessProbe: + httpGet: + path: /lra-coordinator + port: 8080 + scheme: HTTP + initialDelaySeconds: 180 + name: lra-coordinator + image: docker.io/jbosstm/lra-coordinator:5.9.8.Final + ports: + - containerPort: 8080 + protocol: TCP + readinessProbe: + httpGet: + path: /lra-coordinator + port: 8080 + scheme: HTTP + initialDelaySeconds: 10 + volumeMounts: + - mountPath: /data + name: lra-coordinator-data + volumes: + - name: lra-coordinator-data + persistentVolumeClaim: + claimName: lra-coordinator