diff --git a/pom.xml b/pom.xml
index 860799b..cdbe233 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,11 @@
17
+
+ io.github.resilience4j
+ resilience4j-spring-boot2
+ 1.7.1
+
org.springframework.cloud
spring-cloud-sleuth-zipkin
diff --git a/src/main/java/com/eventsourcing/bankAccount/commands/BankAccountCommandHandler.java b/src/main/java/com/eventsourcing/bankAccount/commands/BankAccountCommandHandler.java
index a9aa006..8c4739e 100644
--- a/src/main/java/com/eventsourcing/bankAccount/commands/BankAccountCommandHandler.java
+++ b/src/main/java/com/eventsourcing/bankAccount/commands/BankAccountCommandHandler.java
@@ -3,6 +3,8 @@ package com.eventsourcing.bankAccount.commands;
import com.eventsourcing.bankAccount.domain.BankAccountAggregate;
import com.eventsourcing.es.EventStoreDB;
+import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
+import io.github.resilience4j.retry.annotation.Retry;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.sleuth.annotation.NewSpan;
@@ -15,9 +17,12 @@ import org.springframework.stereotype.Service;
public class BankAccountCommandHandler implements BankAccountCommandService {
private final EventStoreDB eventStoreDB;
+ private static final String SERVICE_NAME = "microservice";
@Override
@NewSpan
+ @Retry(name = SERVICE_NAME)
+ @CircuitBreaker(name = SERVICE_NAME)
public String handle(@SpanTag("command") CreateBankAccountCommand command) {
final var aggregate = new BankAccountAggregate(command.aggregateID());
aggregate.createBankAccount(command.email(), command.address(), command.userName());
@@ -29,6 +34,8 @@ public class BankAccountCommandHandler implements BankAccountCommandService {
@Override
@NewSpan
+ @Retry(name = SERVICE_NAME)
+ @CircuitBreaker(name = SERVICE_NAME)
public void handle(@SpanTag("command") ChangeEmailCommand command) {
final var aggregate = eventStoreDB.load(command.aggregateID(), BankAccountAggregate.class);
aggregate.changeEmail(command.newEmail());
@@ -38,6 +45,8 @@ public class BankAccountCommandHandler implements BankAccountCommandService {
@Override
@NewSpan
+ @Retry(name = SERVICE_NAME)
+ @CircuitBreaker(name = SERVICE_NAME)
public void handle(@SpanTag("command") ChangeAddressCommand command) {
final var aggregate = eventStoreDB.load(command.aggregateID(), BankAccountAggregate.class);
aggregate.changeAddress(command.newAddress());
@@ -47,6 +56,8 @@ public class BankAccountCommandHandler implements BankAccountCommandService {
@Override
@NewSpan
+ @Retry(name = SERVICE_NAME)
+ @CircuitBreaker(name = SERVICE_NAME)
public void handle(@SpanTag("command") DepositAmountCommand command) {
final var aggregate = eventStoreDB.load(command.aggregateID(), BankAccountAggregate.class);
aggregate.depositBalance(command.amount());
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 78a530d..9d720c2 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -43,4 +43,28 @@ management.endpoints.web.exposure.include=health,prometheus,info
spring.sleuth.propagation.type=w3c,b3
spring.sleuth.opentracing.enabled=true
-spring.zipkin.base-url=http://localhost:9411
\ No newline at end of file
+spring.zipkin.base-url=http://localhost:9411
+
+
+resilience4j.retry.instances.microservice.max-attempts=3
+resilience4j.retry.instances.microservice.waitDuration=1s
+resilience4j.retry.instances.microservice.enableExponentialBackoff=true
+resilience4j.retry.instances.microservice.exponentialBackoffMultiplier=2
+
+
+resilience4j.circuitbreaker.instances.microservice.registerHealthIndicator=true
+resilience4j.circuitbreaker.instances.microservice.slidingWindowSize=5
+resilience4j.circuitbreaker.instances.microservice.permittedNumberOfCallsInHalfOpenState=3
+resilience4j.circuitbreaker.instances.microservice.slidingWindowType=TIME_BASED
+resilience4j.circuitbreaker.instances.microservice.minimumNumberOfCalls=20
+resilience4j.circuitbreaker.instances.microservice.waitDurationInOpenState=50s
+resilience4j.circuitbreaker.instances.microservice.failureRateThreshold=50
+resilience4j.circuitbreaker.instances.microservice.eventConsumerBufferSize=10
+
+
+resilience4j.thread-pool-bulkhead.instances.microservice.maxThreadPoolSize=1
+resilience4j.thread-pool-bulkhead.instances.microservice.coreThreadPoolSize=1
+resilience4j.thread-pool-bulkhead.instances.microservice.queueCapacity=1
+
+resilience4j.timelimiter.instances.microservice.timeoutDuration=3s
+resilience4j.timelimiter.instances.microservice.cancelRunningFuture=true
\ No newline at end of file