0

私は、機密性の高い支払い処理を実行するスプリングブートサービスに取り組んでおり、これらのトランザクションを中断することなくアプリケーションのシャットダウンを確実にしたいと考えています。春のブートでこれに最も近づく方法を知りたいスプリングブートグレイシャットシャットダウン中トランザクション

私は春ブートにシャットダウンフックを追加し、私はスレッドが処理を完了したかどうかを確認するために、クラスに 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)); 
    } 
} 

建設的なフィードバック大変感謝します - ありがとう。

答えて

0

私は、シャットダウン方法に@PreDestroyannotationを使用して終了:

@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(); 
    } 
} 
関連する問題