Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
35db47e
feat/116 :: Order 도메인 Aggregate, VO, 이벤트, 예외, 글로벌 예외 계층
lian2945 May 18, 2026
f79c8da
feat/116 :: Order UseCase, Port, Service, DTO 구현
lian2945 May 18, 2026
fb32475
feat/116 :: Order 어댑터 (Web/Kafka/gRPC/Persistence/Security/Scheduler)
lian2945 May 18, 2026
c43e703
feat/116 :: Order application-*.yml, Dockerfile, build.gradle 설정
lian2945 May 18, 2026
503d3c3
feat/116 :: SonarCloud 경고 해결 (빈 테스트 메서드 주석, Dockerfile non-root 유저)
lian2945 May 18, 2026
59650b6
feat/116 :: order application-dev.yml trusted.ips 수정
lian2945 May 19, 2026
7452d15
feat/116 :: order Dockerfile 경로 및 줄바꿈 오류 수정
lian2945 May 19, 2026
e92585c
feat/116 :: order application-prod.yml 수정 (server.port/TRUSTED_IPS 제거…
lian2945 May 19, 2026
6f90fdb
feat/116 :: subscribe/creator application-dev/prod.yml server.port 제거
lian2945 May 20, 2026
613a3e6
fix(grpc): GrpcAdapter withDeadlineAfter(2s) 설정 추가
lian2945 May 20, 2026
613fefc
fix(inbox): @DltHandler 추가로 DLT 전환 시 Inbox DEAD_LETTERED 상태 추적
lian2945 May 20, 2026
fff6513
fix(user/kafka): 전체 리스너에 @RetryableTopic + @DltHandler 추가
lian2945 May 20, 2026
12d1716
refactor(inbox): InboxEvent에 occurredAt() 추가, IdempotentAspect 리플렉션 제거
lian2945 May 20, 2026
a35f211
refactor(inbox): InboxEvent occurredAt() 계약 추가, IdempotentAspect 리플렉션 제거
lian2945 May 20, 2026
7bfbddd
fix(inbox): InboxEntity에 occurredAt 필드 추가
lian2945 May 20, 2026
947d50a
ci: trigger build
lian2945 May 20, 2026
92bede8
fix(inbox): InboxProperties 누락 및 inbox 설정 추가
lian2945 May 20, 2026
08ae806
fix(inbox): SubscribeInboxStatus/Repository, GeneralGoodsInboxStatus/…
lian2945 May 20, 2026
4109f1f
fix(creator): CreatorDomainEvent → CreatorOutbox 리네이밍 및 테이블명 creator_…
lian2945 May 20, 2026
df2ab7a
fix(creator): 서비스 레이어 CreatorDomainEventRepositoryPort → CreatorOutbo…
lian2945 May 20, 2026
dada21f
fix(creator): 도메인 이벤트 occurredAt 필드 추가 및 Creator.createBuilder() 복구
lian2945 May 20, 2026
3e82824
fix(kafka): creator/subscribe retry 설정 spring.kafka.retry.topic 형식으로 수정
lian2945 May 20, 2026
dbafa83
fix(creator): refactor/115 기준으로 creator 서비스 전체 동기화
lian2945 May 20, 2026
be3e263
fix(creator): creator.proto에 GetCreatorIdByUserId rpc 추가
lian2945 May 20, 2026
19f1287
fix(docker): Dockerfile appuser 보안 패턴 및 JAR_FILE 경로 통일
lian2945 May 20, 2026
525a95a
fix(inbox): 만료 메시지 조용한 폐기 → DEAD_LETTERED 영속화로 변경
lian2945 May 20, 2026
95d0e35
fix(inbox): 만료 메시지 조용한 폐기 → DEAD_LETTERED 영속화로 변경
lian2945 May 20, 2026
ef6480a
fix(inbox): 만료 메시지 조용한 폐기 → DEAD_LETTERED 영속화로 변경
lian2945 May 20, 2026
36b339a
feat(order): Resilience4j CircuitBreaker/TimeLimiter 설정 추가 (releaseSe…
lian2945 May 20, 2026
26bc10a
refactor(order): @Transactional 범위 내 gRPC 호출 제거
lian2945 May 21, 2026
62aaa64
refactor(order): AutoConfirm 스케줄러 청크 처리 + 분산 락 + 설정 외부화
lian2945 May 21, 2026
7c6f82a
fix(kafka): IdempotentAspect catch(Throwable) 수정 및 @RetryableTopic ex…
lian2945 May 22, 2026
5bb879c
fix(order): ConfirmOrderLineService 이벤트 중복 발행 방지 가드 추가
lian2945 May 22, 2026
0d66382
fix(order): confirmOrderLine 도메인에서 PREPARING 상태만 허용하도록 수정
lian2945 May 22, 2026
a72677b
fix(kafka): @RetryableTopic에 dltStrategy, dltTopicSuffix 명시
lian2945 May 22, 2026
e7bf5c8
fix(kafka): IdempotentAspect catch(Exception) → catch(Throwable) 컴파일 …
lian2945 May 22, 2026
5c87ab7
Merge remote-tracking branch 'origin/main' into feat/116
lian2945 May 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.DltHandler;
import org.springframework.kafka.annotation.KafkaListener;
import kr.magicbox.auth.global.exception.BusinessException;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;

@Slf4j
Expand All @@ -25,15 +27,15 @@ public class UserEventKafkaListener {
private final AuthInboxRepository authInboxRepository;

@Idempotent
@RetryableTopic
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {BusinessException.class})
@KafkaListener(topics = "outbox.event.user-withdrawn", groupId = "auth-service")
public void handleUserWithdrawnEvent(ConsumerRecord<String, UserWithdrawnEvent> consumerRecord) {
UserWithdrawnEvent event = consumerRecord.value();
handleUserWithdrawnUseCase.handleUserWithdrawn(UserId.of(event.userId()));
}

@Idempotent
@RetryableTopic
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {BusinessException.class})
@KafkaListener(topics = "outbox.event.user-banned", groupId = "auth-service")
public void handleUserBannedEvent(ConsumerRecord<String, UserBannedEvent> consumerRecord) {
UserBannedEvent event = consumerRecord.value();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,14 @@ public Object around(ProceedingJoinPoint pjp) {
.build());
try {
pjp.proceed();
} catch (Error e) {
throw e;
} catch (RuntimeException e) {
status.setRollbackOnly();
throw e;
} catch (Throwable e) {
status.setRollbackOnly();
throw new RuntimeException(e);
throw new IllegalStateException(e);
}
inbox.markProcessed();
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.grpc.client.GrpcChannelFactory;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeUnit;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.grpc.client.GrpcChannelFactory;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeUnit;

Expand Down
4 changes: 4 additions & 0 deletions services/auth/src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,5 +131,9 @@ security:
ips:
- ${TRUSTED_IP_GATEWAY}

logging:
level:
org.springframework.web: INFO
org.springframework.data.redis: INFO
inbox:
max-event-age-minutes: 5
2 changes: 1 addition & 1 deletion services/auth/src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ security:
- ${TRUSTED_IP_GATEWAY}

inbox:
max-event-age-minutes: 60
max-event-age-minutes: 5

logging:
level:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import org.springframework.kafka.annotation.DltHandler;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;
import kr.magicbox.creator.global.exception.BusinessException;

@Slf4j
@Component
Expand All @@ -24,15 +26,15 @@ public class UserEventKafkaListener {
private final CreatorInboxRepository creatorInboxRepository;

@Idempotent
@RetryableTopic
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.creator.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.user-withdrawn", groupId = "creator-service")
public void handleUserWithdrawnEvent(ConsumerRecord<String, UserWithdrawnEvent> consumerRecord) {
log.info("[Inbox] user-withdrawn 이벤트 수신. eventId={}", consumerRecord.key());
handleUserWithdrawnUseCase.handleUserWithdrawn(consumerRecord.value().userId());
}

@Idempotent
@RetryableTopic
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.creator.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.user-banned", groupId = "creator-service")
public void handleUserBannedEvent(ConsumerRecord<String, UserBannedEvent> consumerRecord) {
log.info("[Inbox] user-banned 이벤트 수신. eventId={}", consumerRecord.key());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,14 @@ public Object around(ProceedingJoinPoint pjp) {
.build());
try {
pjp.proceed();
} catch (Error e) {
throw e;
} catch (RuntimeException e) {
status.setRollbackOnly();
throw e;
} catch (Throwable e) {
status.setRollbackOnly();
throw new RuntimeException(e);
throw new IllegalStateException(e);
}
inbox.markProcessed();
return null;
Expand Down
2 changes: 1 addition & 1 deletion services/creator/src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,4 @@ security:
- ${TRUSTED_IP_GATEWAY}

inbox:
max-event-age-minutes: 60
max-event-age-minutes: 5
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import kr.magicbox.generalgoods.application.dto.command.HandleCreatorRevokedCommand;
import kr.magicbox.generalgoods.adapter.out.persistence.repository.GeneralGoodsInboxRepository;
import kr.magicbox.generalgoods.application.port.in.HandleCreatorRevokedUseCase;
import kr.magicbox.generalgoods.global.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.DltHandler;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;

@Slf4j
Expand All @@ -20,8 +22,7 @@ public class CreatorEventKafkaListener {
private final HandleCreatorRevokedUseCase handleCreatorRevokedUseCase;
private final GeneralGoodsInboxRepository generalGoodsInboxRepository;

@Idempotent
@RetryableTopic
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {BusinessException.class})
@KafkaListener(topics = "outbox.event.creator-revoked", groupId = "general-goods-service")
public void handleCreatorRevokedEvent(ConsumerRecord<String, CreatorRevokedEvent> consumerRecord) {
CreatorRevokedEvent event = consumerRecord.value();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,14 @@ public Object around(ProceedingJoinPoint pjp) {
.build());
try {
pjp.proceed();
} catch (Error e) {
throw e;
} catch (RuntimeException e) {
status.setRollbackOnly();
throw e;
} catch (Throwable e) {
status.setRollbackOnly();
throw new RuntimeException(e);
throw new IllegalStateException(e);
}
inbox.markProcessed();
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

import java.util.concurrent.TimeUnit;

Expand All @@ -31,7 +32,8 @@ public CreatorId getCreatorId(UserId userId) {
.setUserId(userId.value())
.build();

CreatorServiceGrpc.CreatorServiceBlockingStub stub = CreatorServiceGrpc.newBlockingStub(creatorManagedChannel)
ManagedChannel channel = grpcChannelFactory.createChannel(ServiceHost.CREATOR.getHostName());
GeneralGoodsServiceGrpc.GeneralGoodsServiceBlockingStub stub = GeneralGoodsServiceGrpc.newBlockingStub(channel)
.withDeadlineAfter(2, TimeUnit.SECONDS);
GetCreatorIdByUserIdResponse response = stub.getCreatorIdByUserId(request);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ security:
- ${TRUSTED_IP_GATEWAY}

inbox:
max-event-age-minutes: 60
max-event-age-minutes: 5

resilience4j:
circuitbreaker:
Expand Down
3 changes: 3 additions & 0 deletions services/order/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.grpc:spring-grpc-client-spring-boot-starter'
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
implementation 'net.javacrumbs.shedlock:shedlock-spring:6.9.2'
implementation 'net.javacrumbs.shedlock:shedlock-provider-redisson:6.9.2'
implementation 'org.redisson:redisson-spring-boot-starter:3.45.1'
runtimeOnly 'com.mysql:mysql-connector-j'

testImplementation 'org.springframework.kafka:spring-kafka-test'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package kr.magicbox.order.adapter.in.kafka;

import kr.magicbox.order.adapter.in.kafka.annotation.Idempotent;
import kr.magicbox.order.adapter.in.kafka.event.DeliveryCompletedEvent;
import kr.magicbox.order.adapter.in.kafka.event.DeliveryStartedEvent;
import kr.magicbox.order.application.port.in.HandleDeliveryCompletedUseCase;
import kr.magicbox.order.application.port.in.HandleDeliveryStartedUseCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;
import kr.magicbox.order.global.exception.BusinessException;

@Slf4j
@Component
@RequiredArgsConstructor
public class DeliveryEventKafkaListener {

private final HandleDeliveryStartedUseCase handleDeliveryStartedUseCase;
private final HandleDeliveryCompletedUseCase handleDeliveryCompletedUseCase;

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.delivery-started", groupId = "order-service")
public void handleDeliveryStarted(ConsumerRecord<String, DeliveryStartedEvent> consumerRecord) {
log.info("[Inbox] delivery.started 이벤트 수신. eventId={}", consumerRecord.key());
DeliveryStartedEvent event = consumerRecord.value();
handleDeliveryStartedUseCase.handleDeliveryStarted(event.orderId(), event.orderLineId());
}

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.delivery-completed", groupId = "order-service")
public void handleDeliveryCompleted(ConsumerRecord<String, DeliveryCompletedEvent> consumerRecord) {
log.info("[Inbox] delivery.completed 이벤트 수신. eventId={}", consumerRecord.key());
DeliveryCompletedEvent event = consumerRecord.value();
handleDeliveryCompletedUseCase.handleDeliveryCompleted(event.orderId(), event.orderLineId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kr.magicbox.order.adapter.in.kafka;

import kr.magicbox.order.adapter.in.kafka.properties.InboxProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafkaRetryTopic;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@EnableKafkaRetryTopic
@Configuration
@EnableConfigurationProperties(InboxProperties.class)
public class KafkaConfiguration {

@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(1);
scheduler.setThreadNamePrefix("kafka-retry-");
return scheduler;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kr.magicbox.order.adapter.in.kafka;

import kr.magicbox.order.adapter.in.kafka.annotation.Idempotent;
import kr.magicbox.order.adapter.in.kafka.event.OrderPrepareEventDto;
import kr.magicbox.order.application.port.in.HandleOrderPrepareUseCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;
import kr.magicbox.order.global.exception.BusinessException;

@Slf4j
@Component
@RequiredArgsConstructor
public class OrderStateKafkaListener {

private final HandleOrderPrepareUseCase handleOrderPrepareUseCase;

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.order-prepare", groupId = "order-service")
public void handleOrderPrepare(ConsumerRecord<String, OrderPrepareEventDto> consumerRecord) {
log.info("[Inbox] order.prepare 이벤트 수신. eventId={}", consumerRecord.key());
handleOrderPrepareUseCase.handleOrderPrepare(consumerRecord.value().orderId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package kr.magicbox.order.adapter.in.kafka;

import kr.magicbox.order.adapter.in.kafka.annotation.Idempotent;
import kr.magicbox.order.adapter.in.kafka.event.PaymentCancelFailedEvent;
import kr.magicbox.order.adapter.in.kafka.event.PaymentCancelSucceededEvent;
import kr.magicbox.order.adapter.in.kafka.event.PaymentFailedEvent;
import kr.magicbox.order.adapter.in.kafka.event.PaymentSucceededEvent;
import kr.magicbox.order.application.port.in.HandlePaymentCancelFailedUseCase;
import kr.magicbox.order.application.port.in.HandlePaymentCancelSucceededUseCase;
import kr.magicbox.order.application.port.in.HandlePaymentFailedUseCase;
import kr.magicbox.order.application.port.in.HandlePaymentSucceededUseCase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.annotation.RetryableTopic;
import org.springframework.kafka.retrytopic.DltStrategy;
import org.springframework.stereotype.Component;
import kr.magicbox.order.global.exception.BusinessException;

@Slf4j
@Component
@RequiredArgsConstructor
public class PaymentEventKafkaListener {

private final HandlePaymentSucceededUseCase handlePaymentSucceededUseCase;
private final HandlePaymentFailedUseCase handlePaymentFailedUseCase;
private final HandlePaymentCancelSucceededUseCase handlePaymentCancelSucceededUseCase;
private final HandlePaymentCancelFailedUseCase handlePaymentCancelFailedUseCase;

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.payment-succeeded", groupId = "order-service")
public void handlePaymentSucceeded(ConsumerRecord<String, PaymentSucceededEvent> consumerRecord) {
log.info("[Inbox] payment.succeeded 이벤트 수신. eventId={}", consumerRecord.key());
handlePaymentSucceededUseCase.handlePaymentSucceeded(consumerRecord.value().orderId());
}

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.payment-failed", groupId = "order-service")
public void handlePaymentFailed(ConsumerRecord<String, PaymentFailedEvent> consumerRecord) {
log.info("[Inbox] payment.failed 이벤트 수신. eventId={}", consumerRecord.key());
handlePaymentFailedUseCase.handlePaymentFailed(consumerRecord.value().orderId());
}

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.payment-cancel-succeeded", groupId = "order-service")
public void handlePaymentCancelSucceeded(ConsumerRecord<String, PaymentCancelSucceededEvent> consumerRecord) {
log.info("[Inbox] payment.cancel.succeeded 이벤트 수신. eventId={}", consumerRecord.key());
handlePaymentCancelSucceededUseCase.handlePaymentCancelSucceeded(consumerRecord.value().orderId());
}

@Idempotent
@RetryableTopic(dltStrategy = DltStrategy.FAIL_ON_ERROR, dltTopicSuffix = "-dlt", exclude = {kr.magicbox.order.global.exception.BusinessException.class})
@KafkaListener(topics = "outbox.event.payment-cancel-failed", groupId = "order-service")
public void handlePaymentCancelFailed(ConsumerRecord<String, PaymentCancelFailedEvent> consumerRecord) {
log.info("[Inbox] payment.cancel.failed 이벤트 수신. eventId={}", consumerRecord.key());
handlePaymentCancelFailedUseCase.handlePaymentCancelFailed(consumerRecord.value().orderId());
}
}
Loading
Loading