From 9104da0af58d2711255bec27e7071d0ef3de053a Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Fri, 28 Dec 2018 11:41:47 +0000
Subject: [PATCH] Job queueing...

---
 borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java |   31 +++++++++++++++----------------
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java  |   18 ++++++++++++++++--
 borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java     |    2 +-
 3 files changed, 32 insertions(+), 19 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java
index 9941110..5827495 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java
@@ -6,11 +6,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 public abstract class AbstractJob<T> {
     private Logger logger = LoggerFactory.getLogger(AbstractJob.class);
+
     public enum Status {DONE, RUNNING, QUEUED, STOPPED, FAILED}
+
     @Getter
     @Setter
     private boolean stopRequested;
@@ -24,17 +27,27 @@
     @Getter
     @Setter
     private String statusText;
-
+    @Getter(AccessLevel.PACKAGE)
+    @Setter(AccessLevel.PACKAGE)
     private Future<T> future;
 
+    public T waitForResult() {
+        try {
+            return future.get();
+        } catch (InterruptedException | ExecutionException ex) {
+            logger.error(ex.getMessage(), ex);
+        }
+        return null;
+    }
+
     protected void failed() {
         if (this.status != Status.RUNNING) {
             logger.error("Internal error, illegal state! You shouldn't set the job status to FAILED if not in status RUNNING: " + this.status);
         }
         this.status = Status.FAILED;
     }
+
     /**
-     *
      * @return true, if the job is done, stopped or failed. Otherwise false (if job is running or queued).
      */
     public boolean isFinished() {
@@ -49,6 +62,7 @@
     /**
      * A job is identified by this id. If a job with the same id is already queued (not yet finished), this job will
      * not be added twice.
+     *
      * @return
      */
     public abstract Object getId();
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 72d301f..94c8106 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
@@ -38,7 +38,7 @@
                 }
             }
             queue.add(job.setStatus(AbstractJob.Status.QUEUED));
-            executorService.submit(new CallableTask(job));
+            job.setFuture(executorService.submit(new CallableTask(job)));
         }
     }
 
diff --git a/borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java b/borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java
index 91ce40b..74bcf76 100644
--- a/borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java
+++ b/borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java
@@ -50,36 +50,35 @@
         assertEquals(2, queue.getQueueSize());
         queue.append(new TestJob(10, file));
         assertEquals(2, queue.getQueueSize());
-        TestJob job = (TestJob) queue.getQueuedJob(10);
+        TestJob job1 = (TestJob) queue.getQueuedJob(10);
         int counter = 100;
-        while (job.getStatus() != AbstractJob.Status.RUNNING && counter-- > 0) {
+        while (job1.getStatus() != AbstractJob.Status.RUNNING && counter-- > 0) {
             try {
                 Thread.sleep(10);
             } catch (InterruptedException ex) {
                 log.error(ex.getMessage(), ex);
             }
         }
-        assertEquals(AbstractJob.Status.RUNNING, job.getStatus());
-        job = (TestJob) queue.getQueuedJob(5);
+        assertEquals(AbstractJob.Status.RUNNING, job1.getStatus());
+
+        TestJob job = (TestJob) queue.getQueuedJob(5);
         assertEquals(AbstractJob.Status.QUEUED, job.getStatus());
-        counter = 100;
-        while (job.getStatus() != AbstractJob.Status.RUNNING && counter-- > 0) {
-            try {
-                Thread.sleep(10);
-            } catch (InterruptedException ex) {
-                log.error(ex.getMessage(), ex);
-            }
-        }
+        String result = job1.waitForResult();
+        assertEquals("10\n", result);
+        assertEquals(AbstractJob.Status.DONE, job1.getStatus());
+
         queue.append(new TestJob(10, file));
         job = (TestJob) queue.getQueuedJob(10);
         assertEquals(AbstractJob.Status.QUEUED, job.getStatus());
-        queue.waitForQueue(10);
+        result = job.waitForResult();
+        assertEquals("10\n", result);
+
         assertEquals(0, queue.getQueueSize());
         List<AbstractJob> doneJobs = queue.getDoneJobs();
         assertEquals(3, doneJobs.size());
-        check(((TestJob)doneJobs.get(0)), AbstractJob.Status.DONE, "10");
-        check(((TestJob)doneJobs.get(1)), AbstractJob.Status.FAILED, "10");
-        check(((TestJob)doneJobs.get(2)), AbstractJob.Status.DONE, "10");
+        check(((TestJob) doneJobs.get(0)), AbstractJob.Status.DONE, "10");
+        check(((TestJob) doneJobs.get(1)), AbstractJob.Status.FAILED, "10");
+        check(((TestJob) doneJobs.get(2)), AbstractJob.Status.DONE, "10");
     }
 
     private void check(TestJob job, AbstractJob.Status status, String result) {

--
Gitblit v1.10.0