1 package io.getunleash.util;
2
3 import io.getunleash.lang.Nullable;
4 import java.util.concurrent.*;
5 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory;
7
8 public class UnleashScheduledExecutorImpl implements UnleashScheduledExecutor {
9
10     private static final Logger LOG = LoggerFactory.getLogger(UnleashScheduledExecutorImpl.class);
11
12     @Nullable private static UnleashScheduledExecutorImpl INSTANCE;
13
14     private final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
15     private final ExecutorService executorService;
16
17     public UnleashScheduledExecutorImpl() {
18         ThreadFactory threadFactory =
19                 runnable -> {
20                     Thread thread = Executors.defaultThreadFactory().newThread(runnable);
21                     thread.setName("unleash-api-executor");
22                     thread.setDaemon(true);
23                     return thread;
24                 };
25
26         this.scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1, threadFactory);
27         this.scheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true);
28
29         this.executorService = Executors.newSingleThreadExecutor(threadFactory);
30     }
31
32     public static synchronized UnleashScheduledExecutorImpl getInstance() {
33         if (INSTANCE == null) {
34             INSTANCE = new UnleashScheduledExecutorImpl();
35         }
36         return INSTANCE;
37     }
38
39     @Override
40     public @Nullable ScheduledFuture setInterval(
41             Runnable command, long initialDelaySec, long periodSec) {
42         try {
43             return scheduledThreadPoolExecutor.scheduleAtFixedRate(
44                     command, initialDelaySec, periodSec, TimeUnit.SECONDS);
45         } catch (RejectedExecutionException ex) {
46             LOG.error("Unleash background task crashed", ex);
47             return null;
48         }
49     }
50
51     @Override
52     public Future<Void> scheduleOnce(Runnable runnable) {
53         return (Future<Void>) executorService.submit(runnable);
54     }
55
56     @Override
57     public void shutdown() {
58         this.scheduledThreadPoolExecutor.shutdown();
59     }
60 }
61