├── images ├── Code Flow.jpg ├── Code_Flow.png ├── CreateOrder.png └── GetAll_Orders.png ├── .settings ├── org.eclipse.m2e.core.prefs ├── org.eclipse.core.resources.prefs └── org.eclipse.jdt.core.prefs ├── target └── classes │ ├── META-INF │ ├── MANIFEST.MF │ └── maven │ │ ├── com.vinsguru │ │ └── kafka-saga-pattern │ │ │ ├── pom.properties │ │ │ └── pom.xml │ │ └── com.learningwithsomesh │ │ └── kafka-saga-pattern │ │ ├── pom.properties │ │ └── pom.xml │ ├── com │ └── learningwithsomesh │ │ └── kafkasagapattern │ │ ├── model │ │ ├── evt │ │ │ ├── OrderEvent.class │ │ │ ├── PaymentEvent.class │ │ │ ├── ShippingEvent.class │ │ │ └── ShppingAfterPaymentEvent.class │ │ ├── enums │ │ │ ├── OrderStatus.class │ │ │ ├── PaymentStatus.class │ │ │ ├── ShippingStatus.class │ │ │ └── ShippingOrderStatus.class │ │ └── dto │ │ │ ├── OrderRequestDTO.class │ │ │ └── OrderResponseDTO.class │ │ ├── KafkaSagaPatternApplication.class │ │ ├── orderservice │ │ ├── entity │ │ │ └── PurchaseOrder.class │ │ ├── service │ │ │ └── OrderService.class │ │ ├── controller │ │ │ └── OrderController.class │ │ ├── configuration │ │ │ └── OrderServiceConfig.class │ │ ├── repository │ │ │ └── PurchaseOrderRepository.class │ │ └── eventhandlers │ │ │ ├── OrderEventPublisherService.class │ │ │ ├── PaymentEventConsumerService.class │ │ │ ├── ShippingEventConsumerService.class │ │ │ └── ShippingEventPublisherService.class │ │ ├── paymentservice │ │ ├── configuration │ │ │ └── PaymentServiceConfig.class │ │ └── eventhandlers │ │ │ └── OrderEventProcessorService.class │ │ └── shippingservice │ │ ├── configuration │ │ └── ShippingServiceConfig.class │ │ └── eventhandlers │ │ └── ShippingEventProcessorService.class │ └── application.yml ├── src └── main │ ├── java │ └── com │ │ └── learningwithsomesh │ │ └── kafkasagapattern │ │ ├── model │ │ ├── enums │ │ │ ├── PaymentStatus.java │ │ │ ├── ShippingStatus.java │ │ │ ├── OrderStatus.java │ │ │ └── ShippingOrderStatus.java │ │ ├── evt │ │ │ ├── OrderEvent.java │ │ │ ├── ShppingAfterPaymentEvent.java │ │ │ ├── PaymentEvent.java │ │ │ └── ShippingEvent.java │ │ └── dto │ │ │ ├── OrderRequestDTO.java │ │ │ └── OrderResponseDTO.java │ │ ├── KafkaSagaPatternApplication.java │ │ ├── orderservice │ │ ├── repository │ │ │ └── PurchaseOrderRepository.java │ │ ├── entity │ │ │ └── PurchaseOrder.java │ │ ├── eventhandlers │ │ │ ├── OrderEventPublisherService.java │ │ │ ├── ShippingEventPublisherService.java │ │ │ ├── PaymentEventConsumerService.java │ │ │ └── ShippingEventConsumerService.java │ │ ├── controller │ │ │ └── OrderController.java │ │ ├── configuration │ │ │ └── OrderServiceConfig.java │ │ └── service │ │ │ └── OrderService.java │ │ ├── paymentservice │ │ ├── configuration │ │ │ └── PaymentServiceConfig.java │ │ └── eventhandlers │ │ │ └── OrderEventProcessorService.java │ │ └── shippingservice │ │ ├── configuration │ │ └── ShippingServiceConfig.java │ │ └── eventhandlers │ │ └── ShippingEventProcessorService.java │ └── resources │ └── application.yml ├── .project ├── .classpath ├── README.md └── pom.xml /images/Code Flow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/images/Code Flow.jpg -------------------------------------------------------------------------------- /images/Code_Flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/images/Code_Flow.png -------------------------------------------------------------------------------- /images/CreateOrder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/images/CreateOrder.png -------------------------------------------------------------------------------- /images/GetAll_Orders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/images/GetAll_Orders.png -------------------------------------------------------------------------------- /.settings/org.eclipse.m2e.core.prefs: -------------------------------------------------------------------------------- 1 | activeProfiles= 2 | eclipse.preferences.version=1 3 | resolveWorkspaceProjects=true 4 | version=1 5 | -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/main/java=UTF-8 3 | encoding//src/main/resources=UTF-8 4 | encoding/=UTF-8 5 | -------------------------------------------------------------------------------- /target/classes/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Implementation-Title: kafka-saga-pattern 3 | Implementation-Version: 0.0.1-SNAPSHOT 4 | Build-Jdk-Spec: 1.8 5 | Created-By: Maven Integration for Eclipse 6 | 7 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/enums/PaymentStatus.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.enums; 2 | 3 | public enum PaymentStatus { 4 | 5 | APPROVED, 6 | REJECTED; 7 | 8 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingStatus.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.enums; 2 | 3 | public enum ShippingStatus { 4 | 5 | SUPPORTED, 6 | NOT_SUPPORTED; 7 | 8 | } -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/OrderEvent.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/OrderEvent.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/PaymentEvent.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/PaymentEvent.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/OrderStatus.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/OrderStatus.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/ShippingEvent.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/ShippingEvent.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/KafkaSagaPatternApplication.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/KafkaSagaPatternApplication.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/dto/OrderRequestDTO.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/dto/OrderRequestDTO.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/dto/OrderResponseDTO.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/dto/OrderResponseDTO.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/PaymentStatus.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/PaymentStatus.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingStatus.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingStatus.class -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/enums/OrderStatus.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.enums; 2 | 3 | public enum OrderStatus { 4 | 5 | ORDER_CREATED, 6 | ORDER_CANCELLED, 7 | ORDER_COMPLETED 8 | 9 | } -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingOrderStatus.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingOrderStatus.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/ShppingAfterPaymentEvent.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/model/evt/ShppingAfterPaymentEvent.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/entity/PurchaseOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/entity/PurchaseOrder.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/service/OrderService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/service/OrderService.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/controller/OrderController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/controller/OrderController.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/configuration/OrderServiceConfig.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/configuration/OrderServiceConfig.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/repository/PurchaseOrderRepository.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/repository/PurchaseOrderRepository.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/paymentservice/configuration/PaymentServiceConfig.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/paymentservice/configuration/PaymentServiceConfig.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/shippingservice/configuration/ShippingServiceConfig.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/shippingservice/configuration/ShippingServiceConfig.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/OrderEventPublisherService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/OrderEventPublisherService.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/PaymentEventConsumerService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/PaymentEventConsumerService.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventConsumerService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventConsumerService.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventPublisherService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventPublisherService.class -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/paymentservice/eventhandlers/OrderEventProcessorService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/paymentservice/eventhandlers/OrderEventProcessorService.class -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/evt/OrderEvent.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.evt; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class OrderEvent { 7 | private Integer orderId; 8 | private Integer userId; 9 | private Integer price; 10 | } -------------------------------------------------------------------------------- /target/classes/com/learningwithsomesh/kafkasagapattern/shippingservice/eventhandlers/ShippingEventProcessorService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/HEAD/target/classes/com/learningwithsomesh/kafkasagapattern/shippingservice/eventhandlers/ShippingEventProcessorService.class -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/enums/ShippingOrderStatus.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.enums; 2 | 3 | public enum ShippingOrderStatus { 4 | 5 | SHIPPING_CREATE_ORDER_REQUESTED, 6 | ORDER_SHIPPABLE, 7 | ORDER_NOT_SHIPPABLE, 8 | ORDER_NOT_COMPLETE_THUS_NOT_SHIPPABLE 9 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/dto/OrderRequestDTO.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.dto; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class OrderRequestDTO { 7 | 8 | private Integer userId; 9 | private Integer productId; 10 | private Integer pincode; 11 | 12 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/evt/ShppingAfterPaymentEvent.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.evt; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class ShppingAfterPaymentEvent { 7 | private Integer orderId; 8 | private Integer userId; 9 | private Integer pincode; 10 | } -------------------------------------------------------------------------------- /target/classes/META-INF/maven/com.vinsguru/kafka-saga-pattern/pom.properties: -------------------------------------------------------------------------------- 1 | #Generated by Maven Integration for Eclipse 2 | #Wed Jun 03 01:36:13 IST 2020 3 | version=0.0.1-SNAPSHOT 4 | groupId=com.vinsguru 5 | m2e.projectName=spring-cloud-kafka-saga-pattern 6 | m2e.projectLocation=D\:\\workspace\\kafka-saga-pattern 7 | artifactId=kafka-saga-pattern 8 | -------------------------------------------------------------------------------- /target/classes/META-INF/maven/com.learningwithsomesh/kafka-saga-pattern/pom.properties: -------------------------------------------------------------------------------- 1 | #Generated by Maven Integration for Eclipse 2 | #Wed Jun 03 01:36:48 IST 2020 3 | version=0.0.1-SNAPSHOT 4 | groupId=com.learningwithsomesh 5 | m2e.projectName=spring-cloud-kafka-saga-pattern 6 | m2e.projectLocation=D\:\\workspace\\kafka-saga-pattern 7 | artifactId=kafka-saga-pattern 8 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/KafkaSagaPatternApplication.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class KafkaSagaPatternApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(KafkaSagaPatternApplication.class, args); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/repository/PurchaseOrderRepository.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 7 | 8 | @Repository 9 | public interface PurchaseOrderRepository extends JpaRepository { 10 | } -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.methodParameters=generate 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 4 | org.eclipse.jdt.core.compiler.compliance=11 5 | org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled 6 | org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning 7 | org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore 8 | org.eclipse.jdt.core.compiler.release=disabled 9 | org.eclipse.jdt.core.compiler.source=11 10 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/evt/PaymentEvent.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.evt; 2 | 3 | import com.learningwithsomesh.kafkasagapattern.model.enums.PaymentStatus; 4 | 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import lombok.ToString; 9 | 10 | @Data 11 | @ToString 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class PaymentEvent { 15 | 16 | private Integer orderId; 17 | private PaymentStatus status; 18 | 19 | public PaymentEvent(Integer orderId) { 20 | this.orderId = orderId; 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/dto/OrderResponseDTO.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.dto; 2 | 3 | import com.learningwithsomesh.kafkasagapattern.model.enums.OrderStatus; 4 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingOrderStatus; 5 | 6 | import lombok.Data; 7 | 8 | @Data 9 | public class OrderResponseDTO { 10 | 11 | private Integer id; 12 | private Integer userId; 13 | private Integer productId; 14 | private Integer price; 15 | private OrderStatus status; 16 | private Integer pincode; 17 | private ShippingOrderStatus shippingstatus; 18 | 19 | } -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | spring-cloud-kafka-saga-pattern 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.m2e.core.maven2Builder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.m2e.core.maven2Nature 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/model/evt/ShippingEvent.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.model.evt; 2 | 3 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingStatus; 4 | 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | import lombok.ToString; 9 | 10 | @Data 11 | @ToString 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class ShippingEvent { 15 | 16 | private Integer orderId; 17 | private Integer pincode; 18 | 19 | private ShippingStatus status; 20 | 21 | public ShippingEvent(Integer orderId) { 22 | this.orderId = orderId; 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/entity/PurchaseOrder.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.entity; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.Id; 9 | 10 | import com.learningwithsomesh.kafkasagapattern.model.enums.OrderStatus; 11 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingOrderStatus; 12 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingStatus; 13 | 14 | @Data 15 | @Entity 16 | @ToString 17 | public class PurchaseOrder { 18 | 19 | @Id 20 | @GeneratedValue 21 | private Integer id; 22 | private Integer userId; 23 | private Integer productId; 24 | private Integer price; 25 | private OrderStatus status; 26 | private Integer pincode; 27 | private ShippingOrderStatus shippingstatus; 28 | 29 | } -------------------------------------------------------------------------------- /target/classes/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8090 3 | spring.cloud.stream.kafka.streams.binder.configuration.commit.interval.ms: 10 4 | 5 | spring.cloud.stream: 6 | function: 7 | definition: orderEventPublisher;shippingEventPublisher;orderEventProcessor;shippingEventProcessor;paymentEventConsumer;shippingEventConsumer 8 | bindings: 9 | orderEventPublisher-out-0: 10 | destination: order-events 11 | orderEventProcessor-in-0: 12 | destination: order-events 13 | orderEventProcessor-out-0: 14 | destination: payment-events 15 | paymentEventConsumer-in-0: 16 | destination: payment-events 17 | shippingEventPublisher-out-0: 18 | destination: shppingafterpayment-events 19 | shippingEventProcessor-in-0: 20 | destination: shppingafterpayment-events 21 | shippingEventProcessor-out-0: 22 | destination: shipping-events 23 | shippingEventConsumer-in-0: 24 | destination: shipping-events -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8090 3 | spring.cloud.stream.kafka.streams.binder.configuration.commit.interval.ms: 10 4 | 5 | spring.cloud.stream: 6 | function: 7 | definition: orderEventPublisher;shippingEventPublisher;orderEventProcessor;shippingEventProcessor;paymentEventConsumer;shippingEventConsumer 8 | bindings: 9 | orderEventPublisher-out-0: 10 | destination: order-events 11 | orderEventProcessor-in-0: 12 | destination: order-events 13 | orderEventProcessor-out-0: 14 | destination: payment-events 15 | paymentEventConsumer-in-0: 16 | destination: payment-events 17 | shippingEventPublisher-out-0: 18 | destination: shppingafterpayment-events 19 | shippingEventProcessor-in-0: 20 | destination: shppingafterpayment-events 21 | shippingEventProcessor-out-0: 22 | destination: shipping-events 23 | shippingEventConsumer-in-0: 24 | destination: shipping-events -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/paymentservice/configuration/PaymentServiceConfig.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.paymentservice.configuration; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 8 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 9 | import com.learningwithsomesh.kafkasagapattern.paymentservice.eventhandlers.OrderEventProcessorService; 10 | 11 | import java.util.function.Function; 12 | 13 | @Configuration 14 | public class PaymentServiceConfig { 15 | 16 | @Autowired 17 | private OrderEventProcessorService orderEventProcessorService; 18 | 19 | @Bean 20 | public Function orderEventProcessor(){ 21 | return orderEventProcessorService::processOrderEvent; 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/OrderEventPublisherService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 7 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 8 | 9 | import reactor.core.publisher.FluxSink; 10 | 11 | @Service 12 | public class OrderEventPublisherService { 13 | 14 | @Autowired 15 | private FluxSink orderEventChannel; 16 | 17 | 18 | public void raiseOrderCreatedEvent(final PurchaseOrder purchaseOrder){ 19 | OrderEvent orderEvent = new OrderEvent(); 20 | orderEvent.setUserId(purchaseOrder.getUserId()); 21 | orderEvent.setPrice(purchaseOrder.getPrice()); 22 | orderEvent.setOrderId(purchaseOrder.getId()); 23 | //orderEvent.setPincode(purchaseOrder.getPincode()); 24 | this.orderEventChannel.next(orderEvent); 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/controller/OrderController.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.web.bind.annotation.*; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.dto.OrderRequestDTO; 7 | import com.learningwithsomesh.kafkasagapattern.model.dto.OrderResponseDTO; 8 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 9 | import com.learningwithsomesh.kafkasagapattern.orderservice.service.OrderService; 10 | 11 | import java.util.List; 12 | 13 | @RestController 14 | @RequestMapping("order") 15 | public class OrderController { 16 | 17 | @Autowired 18 | private OrderService orderService; 19 | 20 | @PostMapping("/create") 21 | public PurchaseOrder createOrder(@RequestBody OrderRequestDTO dto){ 22 | return this.orderService.createOrder(dto); 23 | } 24 | 25 | @GetMapping("/all") 26 | public List getOrders(){ 27 | return this.orderService.getAll(); 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventPublisherService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShppingAfterPaymentEvent; 8 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 9 | 10 | import reactor.core.publisher.FluxSink; 11 | 12 | @Service 13 | public class ShippingEventPublisherService { 14 | 15 | @Autowired FluxSink shippingEventChannel; 16 | 17 | public void raiseShippingCreatedEvent(final PurchaseOrder purchaseOrder) { 18 | ShppingAfterPaymentEvent sape = new ShppingAfterPaymentEvent(); 19 | sape.setOrderId(purchaseOrder.getId()); 20 | sape.setPincode(purchaseOrder.getPincode()); 21 | sape.setUserId(purchaseOrder.getUserId()); 22 | this.shippingEventChannel.next(sape); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/shippingservice/configuration/ShippingServiceConfig.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.shippingservice.configuration; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 8 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 9 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 10 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShppingAfterPaymentEvent; 11 | import com.learningwithsomesh.kafkasagapattern.paymentservice.eventhandlers.OrderEventProcessorService; 12 | import com.learningwithsomesh.kafkasagapattern.shippingservice.eventhandlers.ShippingEventProcessorService; 13 | 14 | import java.util.function.Function; 15 | 16 | @Configuration 17 | public class ShippingServiceConfig { 18 | 19 | @Autowired 20 | private ShippingEventProcessorService shippingEventProcessorService; 21 | 22 | @Bean 23 | public Function shippingEventProcessor(){ 24 | return shippingEventProcessorService::processShippedEvent; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/paymentservice/eventhandlers/OrderEventProcessorService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.paymentservice.eventhandlers; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import com.learningwithsomesh.kafkasagapattern.model.enums.PaymentStatus; 6 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 8 | 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | @Service 13 | public class OrderEventProcessorService { 14 | 15 | // user - credit limit 16 | public static final Map userMap = new HashMap<>(); 17 | 18 | static { 19 | userMap.put(1, 1000); 20 | userMap.put(2, 2000); 21 | userMap.put(3, 1000); 22 | userMap.put(4, 1000); 23 | userMap.put(5, 1000); 24 | } 25 | 26 | public PaymentEvent processOrderEvent(OrderEvent orderEvent){ 27 | var price = orderEvent.getPrice(); 28 | var creditLimit = userMap.get(orderEvent.getUserId()); 29 | PaymentEvent paymentEvent = new PaymentEvent(orderEvent.getOrderId()); 30 | if(creditLimit >= price){ 31 | paymentEvent.setStatus(PaymentStatus.APPROVED); 32 | userMap.computeIfPresent(orderEvent.getUserId(), (k, v) -> v - price); 33 | }else{ 34 | paymentEvent.setStatus(PaymentStatus.REJECTED); 35 | } 36 | System.out.println("XXXXXXXXX Code going out of processOrderEvent with paymentEvent"+ paymentEvent); 37 | System.out.println("XXXXXXXXX Code going out of processOrderEvent with orderEvent"+ orderEvent); 38 | 39 | return paymentEvent; 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spring-cloud-kafka-saga-pattern 2 | 3 | Pre-requisites: 4 | Install Kafka 5 | Install Spring 6 | Install Java 7 | 8 | Start Zookeper 9 | -------------- 10 | 11 | zookeeper-server-start.bat d:\Software\kafka_2.13-2.5.0\config\zookeeper.properties 12 | 13 | 14 | Start Kafka server 15 | ------------------ 16 | 17 | kafka-server-start.bat d:\Software\kafka_2.13-2.5.0\config\server.properties 18 | 19 | 20 | 21 | Create Order Request Image 22 | ![Image of Create An Order](https://github.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/blob/master/images/CreateOrder.png) 23 | 24 | Get All Order Request Image 25 | ![Image of Search](https://github.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/blob/master/images/GetAll_Orders.png) 26 | 27 | Project Code Flow Image 28 | ![Image of Project Code Flow](https://github.com/someshbhardwaj/spring-cloud-kafka-saga-pattern/blob/master/images/Code%20Flow.jpg) 29 | 30 | 31 | ```yml 32 | Snippets from Application.yml 33 | spring.cloud.stream: 34 | function: 35 | definition: orderEventPublisher;shippingEventPublisher;orderEventProcessor;shippingEventProcessor;paymentEventConsumer;shippingEventConsumer 36 | bindings: 37 | orderEventPublisher-out-0: 38 | destination: order-events 39 | orderEventProcessor-in-0: 40 | destination: order-events 41 | orderEventProcessor-out-0: 42 | destination: payment-events 43 | paymentEventConsumer-in-0: 44 | destination: payment-events 45 | shippingEventPublisher-out-0: 46 | destination: shppingafterpayment-events 47 | shippingEventProcessor-in-0: 48 | destination: shppingafterpayment-events 49 | shippingEventProcessor-out-0: 50 | destination: shipping-events 51 | shippingEventConsumer-in-0: 52 | destination: shipping-events 53 | ``` 54 | 55 | You can further take the code and make the changes to add the DB to it. 56 | You can also make the kafka cluster and use it and also add the concurrency to the same code. 57 | -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/PaymentEventConsumerService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.enums.OrderStatus; 7 | import com.learningwithsomesh.kafkasagapattern.model.enums.PaymentStatus; 8 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingOrderStatus; 9 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingStatus; 10 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 11 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 12 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 13 | import com.learningwithsomesh.kafkasagapattern.orderservice.repository.PurchaseOrderRepository; 14 | 15 | import javax.transaction.Transactional; 16 | 17 | @Service 18 | public class PaymentEventConsumerService { 19 | 20 | @Autowired 21 | private PurchaseOrderRepository purchaseOrderRepository; 22 | 23 | @Autowired 24 | private ShippingEventPublisherService seps; 25 | 26 | @Transactional 27 | public void consumePaymentEvent(PaymentEvent paymentEvent){ 28 | this.purchaseOrderRepository.findById(paymentEvent.getOrderId()) 29 | .ifPresent(purchaseOrder -> { 30 | purchaseOrder.setStatus(paymentEvent.getStatus().equals(PaymentStatus.APPROVED) ? OrderStatus.ORDER_COMPLETED : OrderStatus.ORDER_CANCELLED); 31 | this.purchaseOrderRepository.save(purchaseOrder); 32 | System.out.println("Order Event Completed !!!"); 33 | System.out.println("Raise Shipping Event !!!"); 34 | seps.raiseShippingCreatedEvent(purchaseOrder); 35 | }); 36 | 37 | } 38 | 39 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/eventhandlers/ShippingEventConsumerService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.enums.OrderStatus; 7 | import com.learningwithsomesh.kafkasagapattern.model.enums.PaymentStatus; 8 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingOrderStatus; 9 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingStatus; 10 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 11 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 12 | import com.learningwithsomesh.kafkasagapattern.orderservice.repository.PurchaseOrderRepository; 13 | 14 | import javax.transaction.Transactional; 15 | 16 | @Service 17 | public class ShippingEventConsumerService { 18 | 19 | @Autowired 20 | private PurchaseOrderRepository purchaseOrderRepository; 21 | 22 | @Transactional 23 | public void consumeShippingEvent(ShippingEvent shippingEvent){ 24 | System.out.println("********* Code inside consumeShippingEvent with ShippingEvent"+ shippingEvent); 25 | System.out.println("********* Code inside consumeShippingEvent with purchaseOrder"+ purchaseOrderRepository.findById(shippingEvent.getOrderId())); 26 | 27 | this.purchaseOrderRepository.findById(shippingEvent.getOrderId()) 28 | .ifPresent(purchaseOrder -> { 29 | if(purchaseOrder.getStatus().equals(OrderStatus.ORDER_COMPLETED)){ 30 | purchaseOrder.setShippingstatus(shippingEvent.getStatus().equals(ShippingStatus.NOT_SUPPORTED) ? ShippingOrderStatus.ORDER_NOT_SHIPPABLE: ShippingOrderStatus.ORDER_SHIPPABLE); 31 | System.out.println("Final Print "+purchaseOrder); 32 | this.purchaseOrderRepository.save(purchaseOrder); 33 | }else { 34 | purchaseOrder.setShippingstatus(ShippingOrderStatus.ORDER_NOT_COMPLETE_THUS_NOT_SHIPPABLE); 35 | 36 | } 37 | }); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/configuration/OrderServiceConfig.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.configuration; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 8 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 9 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 10 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShppingAfterPaymentEvent; 11 | import com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers.PaymentEventConsumerService; 12 | import com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers.ShippingEventConsumerService; 13 | 14 | import reactor.core.publisher.DirectProcessor; 15 | import reactor.core.publisher.Flux; 16 | import reactor.core.publisher.FluxSink; 17 | 18 | import java.util.function.Consumer; 19 | import java.util.function.Supplier; 20 | 21 | @Configuration 22 | public class OrderServiceConfig { 23 | 24 | @Autowired 25 | private PaymentEventConsumerService consumerService; 26 | 27 | @Autowired 28 | private ShippingEventConsumerService shippingConsumerService; 29 | 30 | @Bean 31 | public DirectProcessor getFlux(){ 32 | return DirectProcessor.create(); 33 | } 34 | 35 | @Bean 36 | public DirectProcessor getFlux1(){ 37 | return DirectProcessor.create(); 38 | } 39 | 40 | 41 | @Bean 42 | public FluxSink orderEventChannel(DirectProcessor processor){ 43 | return processor.sink(); 44 | } 45 | 46 | @Bean 47 | public FluxSink paymentToShipingEventChannel(DirectProcessor processor){ 48 | return processor.sink(); 49 | } 50 | 51 | @Bean 52 | public Supplier> orderEventPublisher(DirectProcessor processor){ 53 | return () -> processor; 54 | } 55 | 56 | @Bean 57 | public Supplier> shippingEventPublisher(DirectProcessor processor){ 58 | return () -> processor; 59 | } 60 | 61 | @Bean 62 | public Consumer paymentEventConsumer(){ 63 | return consumerService::consumePaymentEvent; 64 | } 65 | 66 | 67 | @Bean 68 | public Consumer shippingEventConsumer(){ 69 | return shippingConsumerService::consumeShippingEvent; 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/shippingservice/eventhandlers/ShippingEventProcessorService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.shippingservice.eventhandlers; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import com.learningwithsomesh.kafkasagapattern.model.enums.PaymentStatus; 6 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingStatus; 7 | import com.learningwithsomesh.kafkasagapattern.model.evt.OrderEvent; 8 | import com.learningwithsomesh.kafkasagapattern.model.evt.PaymentEvent; 9 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShippingEvent; 10 | import com.learningwithsomesh.kafkasagapattern.model.evt.ShppingAfterPaymentEvent; 11 | 12 | import java.util.ArrayList; 13 | import java.util.HashMap; 14 | import java.util.List; 15 | import java.util.Map; 16 | 17 | import javax.annotation.PostConstruct; 18 | 19 | @Service 20 | public class ShippingEventProcessorService { 21 | 22 | /* 23 | * The below code can be further updated to use actual DB and make it working with DB. 24 | */ 25 | // user - pin code check 26 | ArrayList zipcodes = new ArrayList(); 27 | 28 | @PostConstruct 29 | private void init() { 30 | zipcodes.add(202); 31 | zipcodes.add(20000); 32 | zipcodes.add(200); 33 | zipcodes.add(56006); 34 | zipcodes.add(5999); 35 | zipcodes.add(20772); 36 | zipcodes.add(9900); 37 | zipcodes.add(2660); 38 | zipcodes.add(96006); 39 | zipcodes.add(86004); 40 | zipcodes.add(34); 41 | } 42 | 43 | public ShippingEvent processShippedEvent(ShppingAfterPaymentEvent shippingafterpaymentevent){ 44 | Integer pincode = shippingafterpaymentevent.getPincode(); 45 | System.out.println("XXXXXXXXX Code came to this processShippedEvent: pincode= "+pincode); 46 | 47 | ShippingEvent shippingEvent = new ShippingEvent(shippingafterpaymentevent.getOrderId()); 48 | shippingEvent.setPincode(shippingafterpaymentevent.getPincode()); 49 | if(validatePinCodeDeliverySupported(pincode )) { 50 | shippingEvent.setStatus(ShippingStatus.SUPPORTED); 51 | }else{ 52 | shippingEvent.setStatus(ShippingStatus.NOT_SUPPORTED); 53 | } 54 | System.out.println("XXXXXXXXX Code going out of processShippedEvent with shippingEvent"+ shippingEvent); 55 | System.out.println("********* Code going out of processShippedEvent with shippingafterpaymentevent: "+ shippingafterpaymentevent); 56 | 57 | return shippingEvent; 58 | } 59 | 60 | private boolean validatePinCodeDeliverySupported(Integer shippingPin) { 61 | System.out.println("XXXXXXXXX Code came to this validatePinCodeDeliverySupported:" + shippingPin); 62 | if(zipcodes.contains(shippingPin)) { 63 | System.out.println("XXXXXXXXX Code came to this validatePinCodeDeliverySupported in true"); 64 | return true; 65 | } 66 | else 67 | return false; 68 | } 69 | } -------------------------------------------------------------------------------- /src/main/java/com/learningwithsomesh/kafkasagapattern/orderservice/service/OrderService.java: -------------------------------------------------------------------------------- 1 | package com.learningwithsomesh.kafkasagapattern.orderservice.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.learningwithsomesh.kafkasagapattern.model.dto.OrderRequestDTO; 7 | import com.learningwithsomesh.kafkasagapattern.model.dto.OrderResponseDTO; 8 | import com.learningwithsomesh.kafkasagapattern.model.enums.OrderStatus; 9 | import com.learningwithsomesh.kafkasagapattern.model.enums.ShippingOrderStatus; 10 | import com.learningwithsomesh.kafkasagapattern.orderservice.entity.PurchaseOrder; 11 | import com.learningwithsomesh.kafkasagapattern.orderservice.eventhandlers.OrderEventPublisherService; 12 | import com.learningwithsomesh.kafkasagapattern.orderservice.repository.PurchaseOrderRepository; 13 | 14 | import java.util.List; 15 | import java.util.Map; 16 | import java.util.stream.Collectors; 17 | 18 | @Service 19 | public class OrderService { 20 | /* 21 | * The below code can be further updated to use actual DB and make it working with DB. 22 | */ 23 | // product price map 24 | private static final Map PRODUCT_PRICE = Map.of( 25 | 1, 100, 26 | 2, 200, 27 | 3, 300 28 | ); 29 | 30 | @Autowired 31 | private PurchaseOrderRepository purchaseOrderRepository; 32 | 33 | @Autowired 34 | private OrderEventPublisherService eventPublisherService; 35 | 36 | public PurchaseOrder createOrder(OrderRequestDTO orderRequestDTO){ 37 | PurchaseOrder purchaseOrder = this.purchaseOrderRepository.save(this.dtoToEntity(orderRequestDTO)); 38 | this.eventPublisherService.raiseOrderCreatedEvent(purchaseOrder); 39 | return purchaseOrder; 40 | } 41 | 42 | public List getAll() { 43 | return this.purchaseOrderRepository.findAll() 44 | .stream() 45 | .map(this::entityToDto) 46 | .collect(Collectors.toList()); 47 | } 48 | 49 | private PurchaseOrder dtoToEntity(final OrderRequestDTO dto){ 50 | PurchaseOrder purchaseOrder = new PurchaseOrder(); 51 | purchaseOrder.setProductId(dto.getProductId()); 52 | purchaseOrder.setUserId(dto.getUserId()); 53 | purchaseOrder.setStatus(OrderStatus.ORDER_CREATED); 54 | purchaseOrder.setPrice(PRODUCT_PRICE.get(purchaseOrder.getProductId())); 55 | purchaseOrder.setPincode(dto.getPincode()); 56 | purchaseOrder.setShippingstatus(ShippingOrderStatus.SHIPPING_CREATE_ORDER_REQUESTED); 57 | return purchaseOrder; 58 | } 59 | 60 | private OrderResponseDTO entityToDto(final PurchaseOrder purchaseOrder){ 61 | OrderResponseDTO dto = new OrderResponseDTO(); 62 | dto.setId(purchaseOrder.getId()); 63 | dto.setProductId(purchaseOrder.getProductId()); 64 | dto.setUserId(purchaseOrder.getUserId()); 65 | dto.setStatus(purchaseOrder.getStatus()); 66 | dto.setPrice(purchaseOrder.getPrice()); 67 | dto.setPincode(purchaseOrder.getPincode()); 68 | dto.setShippingstatus(purchaseOrder.getShippingstatus()); 69 | return dto; 70 | } 71 | 72 | } -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.2.6.RELEASE 9 | 10 | 11 | com.learningwithsomesh 12 | kafka-saga-pattern 13 | 0.0.1-SNAPSHOT 14 | kafka-saga-pattern 15 | Demo project for Spring Boot 16 | 17 | 18 | 11 19 | Hoxton.SR3 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-data-jpa 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-webflux 30 | 31 | 32 | org.springframework.cloud 33 | spring-cloud-stream 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-stream-binder-kafka 38 | 39 | 40 | org.springframework.kafka 41 | spring-kafka 42 | 43 | 44 | com.h2database 45 | h2 46 | runtime 47 | 48 | 49 | org.projectlombok 50 | lombok 51 | true 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-starter-test 56 | test 57 | 58 | 59 | org.junit.vintage 60 | junit-vintage-engine 61 | 62 | 63 | 64 | 65 | io.projectreactor 66 | reactor-test 67 | test 68 | 69 | 70 | org.springframework.cloud 71 | spring-cloud-stream-test-support 72 | test 73 | 74 | 75 | org.springframework.kafka 76 | spring-kafka-test 77 | test 78 | 79 | 80 | 81 | 82 | 83 | 84 | org.springframework.cloud 85 | spring-cloud-dependencies 86 | ${spring-cloud.version} 87 | pom 88 | import 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | org.springframework.boot 97 | spring-boot-maven-plugin 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /target/classes/META-INF/maven/com.vinsguru/kafka-saga-pattern/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.2.6.RELEASE 9 | 10 | 11 | com.vinsguru 12 | kafka-saga-pattern 13 | 0.0.1-SNAPSHOT 14 | kafka-saga-pattern 15 | Demo project for Spring Boot 16 | 17 | 18 | 11 19 | Hoxton.SR3 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-data-jpa 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-webflux 30 | 31 | 32 | org.springframework.cloud 33 | spring-cloud-stream 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-stream-binder-kafka 38 | 39 | 40 | org.springframework.kafka 41 | spring-kafka 42 | 43 | 44 | com.h2database 45 | h2 46 | runtime 47 | 48 | 49 | org.projectlombok 50 | lombok 51 | true 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-starter-test 56 | test 57 | 58 | 59 | org.junit.vintage 60 | junit-vintage-engine 61 | 62 | 63 | 64 | 65 | io.projectreactor 66 | reactor-test 67 | test 68 | 69 | 70 | org.springframework.cloud 71 | spring-cloud-stream-test-support 72 | test 73 | 74 | 75 | org.springframework.kafka 76 | spring-kafka-test 77 | test 78 | 79 | 80 | 81 | 82 | 83 | 84 | org.springframework.cloud 85 | spring-cloud-dependencies 86 | ${spring-cloud.version} 87 | pom 88 | import 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | org.springframework.boot 97 | spring-boot-maven-plugin 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /target/classes/META-INF/maven/com.learningwithsomesh/kafka-saga-pattern/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.2.6.RELEASE 9 | 10 | 11 | com.learningwithsomesh 12 | kafka-saga-pattern 13 | 0.0.1-SNAPSHOT 14 | kafka-saga-pattern 15 | Demo project for Spring Boot 16 | 17 | 18 | 11 19 | Hoxton.SR3 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-data-jpa 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-webflux 30 | 31 | 32 | org.springframework.cloud 33 | spring-cloud-stream 34 | 35 | 36 | org.springframework.cloud 37 | spring-cloud-stream-binder-kafka 38 | 39 | 40 | org.springframework.kafka 41 | spring-kafka 42 | 43 | 44 | com.h2database 45 | h2 46 | runtime 47 | 48 | 49 | org.projectlombok 50 | lombok 51 | true 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-starter-test 56 | test 57 | 58 | 59 | org.junit.vintage 60 | junit-vintage-engine 61 | 62 | 63 | 64 | 65 | io.projectreactor 66 | reactor-test 67 | test 68 | 69 | 70 | org.springframework.cloud 71 | spring-cloud-stream-test-support 72 | test 73 | 74 | 75 | org.springframework.kafka 76 | spring-kafka-test 77 | test 78 | 79 | 80 | 81 | 82 | 83 | 84 | org.springframework.cloud 85 | spring-cloud-dependencies 86 | ${spring-cloud.version} 87 | pom 88 | import 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | org.springframework.boot 97 | spring-boot-maven-plugin 98 | 99 | 100 | 101 | 102 | --------------------------------------------------------------------------------