1 package org
.asamk
.signal
.manager
.internal
;
3 import org
.asamk
.signal
.manager
.helper
.Context
;
4 import org
.asamk
.signal
.manager
.jobs
.Job
;
5 import org
.slf4j
.Logger
;
6 import org
.slf4j
.LoggerFactory
;
8 import java
.util
.ArrayDeque
;
9 import java
.util
.Queue
;
10 import java
.util
.concurrent
.ExecutorService
;
11 import java
.util
.concurrent
.Executors
;
13 public class JobExecutor
implements AutoCloseable
{
15 private static final Logger logger
= LoggerFactory
.getLogger(JobExecutor
.class);
16 private final Context context
;
17 private final ExecutorService executorService
;
19 private final Queue
<Job
> queue
= new ArrayDeque
<>();
21 public JobExecutor(final Context context
) {
22 this.context
= context
;
23 this.executorService
= Executors
.newCachedThreadPool();
26 public void enqueueJob(Job job
) {
27 if (executorService
.isShutdown()) {
28 logger
.debug("Not enqueuing {} job, shutting down", job
.getClass().getSimpleName());
32 synchronized (queue
) {
33 logger
.trace("Enqueuing {} job", job
.getClass().getSimpleName());
40 private void runNextJob() {
42 synchronized (queue
) {
43 if (running
!= null) {
56 logger
.debug("Running {} job", job
.getClass().getSimpleName());
57 executorService
.execute(() -> {
60 } catch (Throwable e
) {
61 logger
.warn("Job {} failed", job
.getClass().getSimpleName(), e
);
63 synchronized (queue
) {
73 synchronized (queue
) {
74 if (queue
.isEmpty()) {
75 executorService
.close();
82 } catch (InterruptedException ignored
) {
85 executorService
.close();