diff --git a/tracky-consumer/build.gradle b/tracky-consumer/build.gradle index d077b8b4..398360f2 100644 --- a/tracky-consumer/build.gradle +++ b/tracky-consumer/build.gradle @@ -11,6 +11,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-amqp' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-registry-prometheus' + implementation 'org.springframework.retry:spring-retry' + implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" diff --git a/tracky-consumer/src/main/java/kernel360/trackyconsumer/TrackyConsumerApplication.java b/tracky-consumer/src/main/java/kernel360/trackyconsumer/TrackyConsumerApplication.java index c18214a6..6946b551 100644 --- a/tracky-consumer/src/main/java/kernel360/trackyconsumer/TrackyConsumerApplication.java +++ b/tracky-consumer/src/main/java/kernel360/trackyconsumer/TrackyConsumerApplication.java @@ -5,6 +5,7 @@ import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.retry.annotation.EnableRetry; @SpringBootApplication @EntityScan(basePackages = { @@ -15,6 +16,7 @@ "kernel360.trackyconsumer" }) @ComponentScan(basePackages = "kernel360") +@EnableRetry public class TrackyConsumerApplication { public static void main(String[] args) { diff --git a/tracky-consumer/src/main/java/kernel360/trackyconsumer/consumer/application/service/ConsumerService.java b/tracky-consumer/src/main/java/kernel360/trackyconsumer/consumer/application/service/ConsumerService.java index 8fd6b6e4..837d5348 100644 --- a/tracky-consumer/src/main/java/kernel360/trackyconsumer/consumer/application/service/ConsumerService.java +++ b/tracky-consumer/src/main/java/kernel360/trackyconsumer/consumer/application/service/ConsumerService.java @@ -2,8 +2,10 @@ import java.time.LocalDate; import java.util.List; -import kernel360.trackycore.core.domain.entity.enums.CarStatus; -import org.springframework.scheduling.annotation.Async; + +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import kernel360.trackyconsumer.consumer.application.dto.request.CarOnOffRequest; @@ -36,7 +38,7 @@ public class ConsumerService { private final RentDomainProvider rentDomainProvider; private final TimeDistanceDomainProvider timeDistanceDomainProvider; - @Async("taskExecutor") + // @Async("taskExecutor") @Transactional public void receiveCycleInfo(GpsHistoryMessage request) { @@ -138,6 +140,12 @@ private void processTimeDistance(List cycleGpsRequests, CarEnti saveTimeDistance(prevDate, prevHour, car, distance, seconds); } + @Retryable( + value = OptimisticLockingFailureException.class, + maxAttempts = 3, + backoff = @Backoff(delay = 100, multiplier = 2, maxDelay = 2000), + listeners = "retryListener" + ) private void saveTimeDistance(LocalDate date, int hour, CarEntity car, double totalDistance, int seconds) { timeDistanceDomainProvider.getTimeDistance(date, hour, car) diff --git a/tracky-core/src/main/java/kernel360/trackycore/core/domain/entity/TimeDistanceEntity.java b/tracky-core/src/main/java/kernel360/trackycore/core/domain/entity/TimeDistanceEntity.java index 15f228b4..20ab04fb 100644 --- a/tracky-core/src/main/java/kernel360/trackycore/core/domain/entity/TimeDistanceEntity.java +++ b/tracky-core/src/main/java/kernel360/trackycore/core/domain/entity/TimeDistanceEntity.java @@ -13,6 +13,7 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import jakarta.persistence.Version; import kernel360.trackycore.core.domain.entity.base.DateBaseEntity; import lombok.AccessLevel; import lombok.Getter; @@ -49,6 +50,9 @@ public class TimeDistanceEntity extends DateBaseEntity { @Column(name = "seconds", nullable = false) private int seconds; + @Version + private Long version; + private TimeDistanceEntity( CarEntity car, BizEntity biz,