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