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