FlashSaleAdmissionRecoveryJob.java
package com.ecommerce.marketing.application.service;
import com.ecommerce.marketing.infrastructure.config.MarketingSchedulingConfig;
import com.ecommerce.marketing.infrastructure.flashsale.FlashSaleAdmissionProperties;
import com.ecommerce.marketing.infrastructure.persistence.mapper.FlashSaleAdmissionMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class FlashSaleAdmissionRecoveryJob {
private static final Logger log = LoggerFactory.getLogger(FlashSaleAdmissionRecoveryJob.class);
private final FlashSaleAdmissionMapper admissionMapper;
private final FlashSaleService flashSaleService;
private final FlashSaleAdmissionProperties properties;
public FlashSaleAdmissionRecoveryJob(
FlashSaleAdmissionMapper admissionMapper,
FlashSaleService flashSaleService,
FlashSaleAdmissionProperties properties) {
this.admissionMapper = admissionMapper;
this.flashSaleService = flashSaleService;
this.properties = properties;
}
@Scheduled(
fixedDelayString = "${ecommerce.marketing.flash-sale.pending-recovery-delay:1000}",
scheduler = MarketingSchedulingConfig.CONTROL_SCHEDULER)
public void recoverPendingAdmissions() {
for (String token : admissionMapper.selectPendingTokens(
properties.pendingRecoveryBatchSize())) {
try {
flashSaleService.recoverPendingAdmission(token);
} catch (RuntimeException exception) {
log.warn("Flash-sale pending admission recovery failed: requestToken={}",
token, exception);
}
}
}
}