From 54db79a1cc3813f163124aa32fce931a6e6da162 Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:27:41 +0900 Subject: [PATCH 1/6] =?UTF-8?q?fix(Bid)=20:=20Outbox=20updatedAt=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/outbox/OutboxJpaRepositoryCustomImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java index d25e39a5..3ef6c62a 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java @@ -7,6 +7,7 @@ import com.smore.bidcompetition.domain.status.EventStatus; import com.smore.bidcompetition.infrastructure.persistence.entity.QOutboxEntity; import jakarta.persistence.EntityManager; +import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import lombok.RequiredArgsConstructor; @@ -50,6 +51,7 @@ public int claim(Long outboxId, EventStatus eventStatus) { long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PENDING) @@ -67,6 +69,7 @@ public int markSent(Long outboxId, EventStatus eventStatus) { long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING) @@ -85,6 +88,7 @@ public int markRetry(Long outboxId, EventStatus eventStatus) { .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) .set(outboxEntity.retryCount, outboxEntity.retryCount.add(1)) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING) @@ -102,6 +106,7 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING), From 7890a0cd2b5442e51bfbbc8be1969703e9d67d30 Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:33:26 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix(Order)=20:=20Outbox=20updatedAt=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/outbox/OutboxJpaRepositoryCustomImpl.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java index 9b78699c..ce22e9ce 100644 --- a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java +++ b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java @@ -7,6 +7,7 @@ import com.smore.order.domain.status.EventStatus; import jakarta.persistence.EntityManager; +import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import lombok.RequiredArgsConstructor; @@ -50,6 +51,7 @@ public int claim(Long outboxId, EventStatus eventStatus) { long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PENDING) @@ -67,6 +69,7 @@ public int markSent(Long outboxId, EventStatus eventStatus) { long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING) @@ -85,6 +88,7 @@ public int markRetry(Long outboxId, EventStatus eventStatus) { .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) .set(outboxEntity.retryCount, outboxEntity.retryCount.add(1)) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING) @@ -102,6 +106,7 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun long updated = queryFactory .update(outboxEntity) .set(outboxEntity.eventStatus, eventStatus) + .set(outboxEntity.updatedAt, LocalDateTime.now()) .where( outboxEntity.id.eq(outboxId), outboxEntity.eventStatus.eq(EventStatus.PROCESSING), From cb6822eb84dae9b529a52e5501ac364a7107ae68 Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:36:12 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix(Bid)=20:=20processing=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=98=81=EA=B5=AC=20=EA=B3=A0=EC=B0=A9=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(=EB=A7=8C=EB=A3=8C=20?= =?UTF-8?q?=ED=9A=8C=EC=88=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/OutboxRepository.java | 6 ++++++ .../presentation/scheduler/OutboxScheduler.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/application/repository/OutboxRepository.java b/bidcompetition/src/main/java/com/smore/bidcompetition/application/repository/OutboxRepository.java index 7a0db99b..78b2320d 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/application/repository/OutboxRepository.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/application/repository/OutboxRepository.java @@ -2,7 +2,9 @@ import com.smore.bidcompetition.domain.status.EventStatus; import com.smore.bidcompetition.domain.model.Outbox; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -12,6 +14,8 @@ public interface OutboxRepository { Page findPendingIds(Collection states, Pageable pageable); + List findExpiredProcessingIds(LocalDateTime expiredAt); + Outbox save(Outbox outbox); int claim(Long outboxId, EventStatus eventStatus); @@ -22,4 +26,6 @@ public interface OutboxRepository { int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCount); + int bulkResetExpiredProcessingToReady(List ids); + } diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/presentation/scheduler/OutboxScheduler.java b/bidcompetition/src/main/java/com/smore/bidcompetition/presentation/scheduler/OutboxScheduler.java index 5a704645..05d86e64 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/presentation/scheduler/OutboxScheduler.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/presentation/scheduler/OutboxScheduler.java @@ -4,6 +4,8 @@ import com.smore.bidcompetition.application.repository.OutboxRepository; import com.smore.bidcompetition.application.service.OutboxProcessor; import com.smore.bidcompetition.domain.status.EventStatus; +import java.time.LocalDateTime; +import java.util.List; import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,4 +51,17 @@ public void outboxTasks() { page++; } } + + @Scheduled(fixedDelay = 60000) + public void recoverExpiredProcessing() { + LocalDateTime expiredAt = LocalDateTime.now().minusMinutes(2); + + List expiredProcessingIds = outboxRepository.findExpiredProcessingIds(expiredAt); + + if (expiredProcessingIds.isEmpty()) { + return; + } + + int updated = outboxRepository.bulkResetExpiredProcessingToReady(expiredProcessingIds); + } } From 969cb7976d07c089e4138c1e58669eb91c4089f2 Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:37:26 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat(Bid)=20:=20Outbox=20PROCESSING=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=A7=8C=EB=A3=8C=20=ED=9A=8C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20find,=20bulkUpdate=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outbox/OutboxJpaRepositoryCustom.java | 6 ++++ .../outbox/OutboxJpaRepositoryCustomImpl.java | 32 +++++++++++++++++++ .../outbox/OutboxRepositoryImpl.java | 12 +++++++ 3 files changed, 50 insertions(+) diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java index 209d571c..8f78abd7 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java @@ -1,7 +1,9 @@ package com.smore.bidcompetition.infrastructure.persistence.repository.outbox; import com.smore.bidcompetition.domain.status.EventStatus; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -9,6 +11,8 @@ public interface OutboxJpaRepositoryCustom { Page findPendingIds(Collection states, Pageable pageable); + List findExpiredProcessingIds(LocalDateTime expiredAt); + int claim(Long outboxId, EventStatus eventStatus); int markSent(Long outboxId, EventStatus eventStatus); @@ -17,4 +21,6 @@ public interface OutboxJpaRepositoryCustom { int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCount); + int bulkResetExpiredProcessingToReady(List ids); + } diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java index 3ef6c62a..eb1a8239 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java @@ -45,6 +45,19 @@ public Page findPendingIds(Collection states, Pageable pageab return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); } + @Override + public List findExpiredProcessingIds(LocalDateTime expiredAt) { + + return queryFactory + .select(outboxEntity.id) + .from(outboxEntity) + .where( + outboxEntity.eventStatus.eq(EventStatus.PROCESSING), + outboxEntity.updatedAt.loe(expiredAt) + ) + .fetch(); + } + @Override public int claim(Long outboxId, EventStatus eventStatus) { @@ -120,4 +133,23 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun return (int) updated; } + @Override + public int bulkResetExpiredProcessingToReady(List ids) { + long updated = queryFactory + .update(outboxEntity) + .set(outboxEntity.eventStatus, EventStatus.PENDING) + .set(outboxEntity.retryCount, outboxEntity.retryCount.add(1)) + .set(outboxEntity.updatedAt, LocalDateTime.now()) + .where( + outboxEntity.id.in(ids), + outboxEntity.eventStatus.eq(EventStatus.PROCESSING) + ) + .execute(); + + em.flush(); + em.clear(); + + return (int) updated; + } + } diff --git a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java index b687a478..03bd5ce6 100644 --- a/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java +++ b/bidcompetition/src/main/java/com/smore/bidcompetition/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java @@ -9,7 +9,9 @@ import com.smore.bidcompetition.infrastructure.persistence.exception.CreateOutboxFailException; import com.smore.bidcompetition.infrastructure.persistence.exception.NotFoundOutboxException; import com.smore.bidcompetition.infrastructure.persistence.mapper.OutboxMapper; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -55,6 +57,11 @@ public Page findPendingIds(Collection states, Pageable pageab return outboxJpaRepository.findPendingIds(states, pageable); } + @Override + public List findExpiredProcessingIds(LocalDateTime expiredAt) { + return outboxJpaRepository.findExpiredProcessingIds(expiredAt); + } + @Override public Outbox save(Outbox outbox) { @@ -125,4 +132,9 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun return outboxJpaRepository.markFail(outboxId, eventStatus, maxRetryCount); } + + @Override + public int bulkResetExpiredProcessingToReady(List ids) { + return outboxJpaRepository.bulkResetExpiredProcessingToReady(ids); + } } From 9a2a5074327372e2df3a19a996bf6fe45d1bceed Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:42:29 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix(Order)=20:=20processing=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=98=81=EA=B5=AC=20=EA=B3=A0=EC=B0=A9=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(=EB=A7=8C=EB=A3=8C=20?= =?UTF-8?q?=ED=9A=8C=EC=88=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/repository/OutboxRepository.java | 6 ++++++ .../presentation/scheduler/OutboxScheduler.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/order/src/main/java/com/smore/order/application/repository/OutboxRepository.java b/order/src/main/java/com/smore/order/application/repository/OutboxRepository.java index c7e9c24c..d55065c3 100644 --- a/order/src/main/java/com/smore/order/application/repository/OutboxRepository.java +++ b/order/src/main/java/com/smore/order/application/repository/OutboxRepository.java @@ -2,7 +2,9 @@ import com.smore.order.domain.model.Outbox; import com.smore.order.domain.status.EventStatus; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -12,6 +14,8 @@ public interface OutboxRepository { Page findPendingIds(Collection states, Pageable pageable); + List findExpiredProcessingIds(LocalDateTime expiredAt); + Outbox save(Outbox outbox); int claim(Long outboxId, EventStatus eventStatus); @@ -22,4 +26,6 @@ public interface OutboxRepository { int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCount); + int bulkResetExpiredProcessingToReady(List ids); + } diff --git a/order/src/main/java/com/smore/order/presentation/scheduler/OutboxScheduler.java b/order/src/main/java/com/smore/order/presentation/scheduler/OutboxScheduler.java index 2c76db72..27bb0460 100644 --- a/order/src/main/java/com/smore/order/presentation/scheduler/OutboxScheduler.java +++ b/order/src/main/java/com/smore/order/presentation/scheduler/OutboxScheduler.java @@ -4,6 +4,8 @@ import com.smore.order.application.service.OutboxProcessor; import com.smore.order.domain.status.EventStatus; +import java.time.LocalDateTime; +import java.util.List; import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,4 +52,17 @@ public void outboxTasks() { page++; } } + + @Scheduled(fixedDelay = 60000) + public void recoverExpiredProcessing() { + LocalDateTime expiredAt = LocalDateTime.now().minusMinutes(2); + + List expiredProcessingIds = outboxRepository.findExpiredProcessingIds(expiredAt); + + if (expiredProcessingIds.isEmpty()) { + return; + } + + int updated = outboxRepository.bulkResetExpiredProcessingToReady(expiredProcessingIds); + } } From b719a93bf996771a4d88927763b28cc6a9df1fb1 Mon Sep 17 00:00:00 2001 From: yoo20370 Date: Mon, 29 Dec 2025 23:43:12 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat(Order)=20:=20Outbox=20PROCESSING=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=A7=8C=EB=A3=8C=20=ED=9A=8C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20find,=20bulkUpade=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outbox/OutboxJpaRepositoryCustom.java | 6 ++++ .../outbox/OutboxJpaRepositoryCustomImpl.java | 32 +++++++++++++++++++ .../outbox/OutboxRepositoryImpl.java | 12 +++++++ 3 files changed, 50 insertions(+) diff --git a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java index 356a3bf5..0eaae4b3 100644 --- a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java +++ b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustom.java @@ -1,7 +1,9 @@ package com.smore.order.infrastructure.persistence.repository.outbox; import com.smore.order.domain.status.EventStatus; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -9,6 +11,8 @@ public interface OutboxJpaRepositoryCustom { Page findPendingIds(Collection states, Pageable pageable); + List findExpiredProcessingIds(LocalDateTime expiredAt); + int claim(Long outboxId, EventStatus eventStatus); int markSent(Long outboxId, EventStatus eventStatus); @@ -17,4 +21,6 @@ public interface OutboxJpaRepositoryCustom { int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCount); + int bulkResetExpiredProcessingToReady(List ids); + } diff --git a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java index ce22e9ce..d837b07a 100644 --- a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java +++ b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxJpaRepositoryCustomImpl.java @@ -45,6 +45,19 @@ public Page findPendingIds(Collection states, Pageable pageab return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne); } + @Override + public List findExpiredProcessingIds(LocalDateTime expiredAt) { + + return queryFactory + .select(outboxEntity.id) + .from(outboxEntity) + .where( + outboxEntity.eventStatus.eq(EventStatus.PROCESSING), + outboxEntity.updatedAt.loe(expiredAt) + ) + .fetch(); + } + @Override public int claim(Long outboxId, EventStatus eventStatus) { @@ -120,4 +133,23 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun return (int) updated; } + @Override + public int bulkResetExpiredProcessingToReady(List ids) { + long updated = queryFactory + .update(outboxEntity) + .set(outboxEntity.eventStatus, EventStatus.PENDING) + .set(outboxEntity.retryCount, outboxEntity.retryCount.add(1)) + .set(outboxEntity.updatedAt, LocalDateTime.now()) + .where( + outboxEntity.id.in(ids), + outboxEntity.eventStatus.eq(EventStatus.PROCESSING) + ) + .execute(); + + em.flush(); + em.clear(); + + return (int) updated; + } + } diff --git a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java index 0c8c07b7..e38d3040 100644 --- a/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java +++ b/order/src/main/java/com/smore/order/infrastructure/persistence/repository/outbox/OutboxRepositoryImpl.java @@ -8,7 +8,9 @@ import com.smore.order.infrastructure.persistence.exception.CreateOutboxFailException; import com.smore.order.infrastructure.persistence.exception.NotFoundOutboxException; import com.smore.order.infrastructure.persistence.mapper.OutboxMapper; +import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -54,6 +56,11 @@ public Page findPendingIds(Collection states, Pageable pageab return outboxJpaRepository.findPendingIds(states, pageable); } + @Override + public List findExpiredProcessingIds(LocalDateTime expiredAt) { + return outboxJpaRepository.findExpiredProcessingIds(expiredAt); + } + @Override public Outbox save(Outbox outbox) { @@ -124,4 +131,9 @@ public int markFail(Long outboxId, EventStatus eventStatus, Integer maxRetryCoun return outboxJpaRepository.markFail(outboxId, eventStatus, maxRetryCount); } + + @Override + public int bulkResetExpiredProcessingToReady(List ids) { + return outboxJpaRepository.bulkResetExpiredProcessingToReady(ids); + } }