FlashSaleAdmissionTimeoutJob.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.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.Instant;

@Component
public class FlashSaleAdmissionTimeoutJob {

    private final FlashSaleAdmissionMapper admissionMapper;
    private final FlashSaleAdmissionProperties properties;

    public FlashSaleAdmissionTimeoutJob(
            FlashSaleAdmissionMapper admissionMapper,
            FlashSaleAdmissionProperties properties) {
        this.admissionMapper = admissionMapper;
        this.properties = properties;
    }

    @Scheduled(
            fixedDelayString = "${ecommerce.marketing.flash-sale.timeout-scan-delay:5000}",
            scheduler = MarketingSchedulingConfig.CONTROL_SCHEDULER)
    public void markUnknownResults() {
        Instant now = admissionMapper.currentTime();
        Instant acceptedBefore = now.minus(properties.processingTimeout());
        for (String token : admissionMapper.selectTimedOutTokens(
                acceptedBefore, properties.timeoutScanBatchSize())) {
            admissionMapper.markResultUnknown(token, now);
        }
    }
}