From bf7101f797e8f2a6c3b966762afb1ec063c4428e Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 23:03:45 +0000
Subject: [PATCH] Job monitor: Cancellation of jobs modified.

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
index 819cb0e..8c9eb47 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
@@ -16,7 +16,7 @@
     private List<AbstractJob<T>> doneJobs = new LinkedList<>();
     private ExecutorService executorService = Executors.newSingleThreadExecutor();
 
-    private  static synchronized void setNextJobId(AbstractJob<?> job) {
+    private static synchronized void setNextJobId(AbstractJob<?> job) {
         job.setUniqueJobNumber(jobSequence++);
     }
 
@@ -30,6 +30,7 @@
 
     /**
      * Searches only for queued jobs (not done jobs).
+     *
      * @param uniqueJobNumber
      * @return The job if any job with the given unique job number is queued, otherwise null.
      */
@@ -76,7 +77,13 @@
         return null;
     }
 
-    private void organizeQueue() {
+    /**
+     * Removes all finished or cancelled jobs from the queued list and adds them to the list of done jobs.
+     * Will be called automatically after finishing a job.
+     * <br>
+     * You should call this method after cancelling a job.
+     */
+    public void refreshQueue() {
         synchronized (queue) {
             if (queue.isEmpty()) {
                 return;
@@ -120,7 +127,11 @@
                     // Don't overwrite status failed set by job.
                     job.setStatus(AbstractJob.Status.DONE);
                 }
-                organizeQueue();
+                if (job.isCancellationRequested() && job.getStatus() != AbstractJob.Status.CANCELLED) {
+                    log.info("Job #" + job.getUniqueJobNumber() + " cancelled: " + job.getId());
+                    job.setCancelled();
+                }
+                refreshQueue();
                 return result;
             } catch (Exception ex) {
                 log.error("Error while executing job '" + job.getId() + "': " + ex.getMessage(), ex);

--
Gitblit v1.10.0