11package org .cloudfoundry .multiapps .controller .core .application .health ;
22
3- import java .text .MessageFormat ;
4- import java .time .Duration ;
5- import java .util .List ;
6- import java .util .concurrent .Callable ;
7- import java .util .concurrent .ExecutionException ;
8- import java .util .concurrent .ExecutorService ;
9- import java .util .concurrent .Executors ;
10- import java .util .concurrent .Future ;
11- import java .util .concurrent .ScheduledExecutorService ;
12- import java .util .concurrent .SynchronousQueue ;
13- import java .util .concurrent .ThreadPoolExecutor ;
14- import java .util .concurrent .TimeUnit ;
15- import java .util .concurrent .TimeoutException ;
16- import java .util .function .Consumer ;
173import jakarta .inject .Inject ;
184import jakarta .inject .Named ;
195import org .cloudfoundry .multiapps .common .SLException ;
2915import org .cloudfoundry .multiapps .controller .persistence .services .FileStorage ;
3016import org .slf4j .Logger ;
3117import org .slf4j .LoggerFactory ;
18+ import org .springframework .beans .factory .DisposableBean ;
3219import org .springframework .beans .factory .annotation .Autowired ;
3320import org .springframework .http .HttpStatus ;
3421import org .springframework .http .ResponseEntity ;
3522
23+ import java .text .MessageFormat ;
24+ import java .time .Duration ;
25+ import java .util .List ;
26+ import java .util .concurrent .Callable ;
27+ import java .util .concurrent .ExecutionException ;
28+ import java .util .concurrent .ExecutorService ;
29+ import java .util .concurrent .Executors ;
30+ import java .util .concurrent .Future ;
31+ import java .util .concurrent .ScheduledExecutorService ;
32+ import java .util .concurrent .SynchronousQueue ;
33+ import java .util .concurrent .ThreadPoolExecutor ;
34+ import java .util .concurrent .TimeUnit ;
35+ import java .util .concurrent .TimeoutException ;
36+ import java .util .function .Consumer ;
37+
3638@ Named
37- public class ApplicationHealthCalculator {
39+ public class ApplicationHealthCalculator implements DisposableBean {
3840
3941 private static final Logger LOGGER = LoggerFactory .getLogger (ApplicationHealthCalculator .class );
4042
@@ -69,6 +71,8 @@ public class ApplicationHealthCalculator {
6971
7072 private final ResilientOperationExecutor resilientOperationExecutor = getResilienceExecutor ();
7173
74+ private volatile boolean isShuttingDown = false ;
75+
7276 @ Inject
7377 public ApplicationHealthCalculator (@ Autowired (required = false ) FileStorage objectStoreFileStorage ,
7478 ApplicationConfiguration applicationConfiguration , DatabaseHealthService databaseHealthService ,
@@ -85,6 +89,10 @@ protected void scheduleRegularHealthUpdate() {
8589 }
8690
8791 protected void updateHealthStatus () {
92+ if (isShuttingDown ) {
93+ LOGGER .debug (Messages .SKIPPING_HEALTH_STATUS_UPDATE_APPLICATION_IS_SHUTTING_DOWN );
94+ return ;
95+ }
8896 List <Callable <Boolean >> tasks = List .of (this ::isObjectStoreFileStorageHealthy , this ::isDatabaseHealthy ,
8997 this ::checkForIncreasedLocksWithTimeout );
9098 try {
@@ -232,4 +240,13 @@ protected ResilientOperationExecutor getResilienceExecutor() {
232240 return new ResilientOperationExecutor ();
233241 }
234242
243+ @ Override
244+ public void destroy () {
245+ LOGGER .info (Messages .SHUTTING_DOWN_APPLICATION_HEALTH_CALCULATOR );
246+ isShuttingDown = true ;
247+ scheduler .shutdownNow ();
248+ taskExecutor .shutdownNow ();
249+ timeoutExecutor .shutdownNow ();
250+ }
251+
235252}
0 commit comments