Justin Xu
Justin Xu

Reputation: 43

How to implement graceful shutdown and break loop when SIGTERM signal is sent?

I want to implement graceful shutdown for the following java service. when a SIGTERM signal is sent, I want the program to keep processing the current task, but exit the loop. How can I achieve this?

@Service
@RequiredArgsConstructor
public class AsyncService {
    
    @Async
    public void run() {
        while (no SIGTERM) {
            // Some process
        }
        // More process
    }
}

Version: Java 17, Spring Boot v3.3.1, Spring v6.1.10

Upvotes: 0

Views: 123

Answers (1)

Justin Xu
Justin Xu

Reputation: 43

I have found the answer.

  1. First create a shutdown hook.
@Slf4j
@Configuration
public class ShutdownHook {

    @Getter
    private static boolean shutdown;

    @PostConstruct
    private void addShutdownHook() {
        shutdown = false;
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            log.info("Shutdown hook triggered!");
            shutdown = true;
        }));
        log.info("Added shutdown hook.");
    }
}
  1. Then, we can check if shutdown is triggered or not.
@Service
@RequiredArgsConstructor
public class AsyncService {
    
    @Async
    public void run() {
        while (!ShutdownHook.isShutdown()) {
            // Some process. This will not be executed after shutdown is triggered.
        }
        // More process. This will be executed even after shutdown is triggered.
        // Notes:
        // Spring by default have grace period of 30 seconds.
        // You need to finish all process within that period or shutdown will be forced.
    }
}

Upvotes: 0

Related Questions