繁体   English   中英

Spring boot 在事务中正常关机

[英]Spring boot graceful shutdown mid-transaction

我正在开发一个执行敏感支付处理的 spring-boot 服务,并希望确保在不中断这些交易的情况下关闭应用程序。 好奇如何在 spring-boot 中最好地解决这个问题。

我读到了向 spring-boot 添加关闭钩子,我想也许在类上使用CountDownLatch来检查线程是否已完成处理 - 像这样:

@Service
public class PaymentService {

    private CountDownLatch countDownLatch;

    private void resetLatch() {
        this.countDownLatch = new CountDownLatch(1);
    }

    public void processPayment() {
        this.resetLatch();

        // do multi-step processing

        this.CountDownLatch.countDown();
    }

    public void shutdown() {
        // blocks until latch is available 
        this.countDownLatch.await();
    }
}

// ---

@SpringBootApplication
public class Application {
    public static void main(String[] args) {

        // init app and get context
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

        // retrieve bean needing special shutdown care
        PaymentService paymentService = context.getBean(PaymentService.class);

        Runtime.getRuntime().addShutdownHook(new Thread(paymentService::shutdown));
    }
}

非常感谢建设性的反馈 - 谢谢。

我最终在关闭方法上使用了@PreDestroy 注释

@Service
public class PaymentService {

    private CountDownLatch countDownLatch;

    private synchronized void beginTransaction() {
        this.countDownLatch = new CountDownLatch(1);
    }

    private synchronized void endTransaction() {
        this.countDownLatch.countDown();
    }

    public void processPayment() {
        try {
            this.beginTransaction();

            // - - - - 
            // do multi-step processing
            // - - - -

        } finally {
            this.endTransaction();
        }
    }

    @PreDestroy
    public void shutdown() {
        // blocks until latch is available 
        this.countDownLatch.await();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM