Alex
Alex

Reputation: 1171

Spring Boot (Tomcat) based application as daemon - howto stop?

I wrote a Spring Boot webservice that uses an embedded tomcat as container.

In case the system reboots I want to backup some information to a mysql database.

In my webservice I use @Scheduled() and @PreDestroy to run the backup.

This goes well when I stop the server with ^C.

But when I kill the process with an sysV skript (/etc/init.d) and the kill command - even though the daemon has a dependency on mysql, the mysql server is shut down before the backup is finished (resulting in SQL Exceptions in my log).

The reason for this is of course, that kill only sends a signal to stop the process.

How can I (from my sysv skript) synchroneously stop the running spring boot tomcat server?

Upvotes: 3

Views: 1626

Answers (2)

Dave Syer
Dave Syer

Reputation: 58124

As an alternative to the "/shutdown" endpoint the Actuator also has an ApplicationPidListener (not enabled by default) that you can use to create a pidfile (which is commonly used in "init.d" style scripts to kill a process when you want to stop it). The JVM should respond to a kill (sigint) and Spring will shutdown gracefully.

Upvotes: 1

Steve
Steve

Reputation: 9480

If you include spring-boot-starter-actuator then that provides a REST endpoint for management. One of the endpoints provided is /shutdown. By hitting that endpoint, you will get a controlled shutdown of all resources, which ensures that @PreDestroy will be called. As this could be dangerous to have enabled by default, to use it you will need to add the following to your application.properties file:

endpoints.shutdown.enabled=true

Of course, once you have exposed that endpoint you need to ensure that there's a teeny bit of security applied to prevent just anybody shutting down your server.

On a related note, you may find my answer to Spring Boot application as a Service useful, where I provided the code for a full init.d script which makes use of this.

Upvotes: 1

Related Questions