borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java
@@ -12,11 +12,11 @@ public abstract class AbstractJob<T> { private Logger logger = LoggerFactory.getLogger(AbstractJob.class); public enum Status {DONE, RUNNING, QUEUED, STOPPED, FAILED} public enum Status {DONE, RUNNING, QUEUED, CANCELLED, FAILED} @Getter @Setter private boolean stopRequested; private boolean cancelledRequested; @Getter @Setter(AccessLevel.PACKAGE) @@ -31,7 +31,18 @@ @Setter(AccessLevel.PACKAGE) private Future<T> future; public T waitForResult() { public void cancel() { if (this.getStatus() == Status.QUEUED) { this.status = Status.CANCELLED; } this.cancelledRequested = true; } /** * Waits for and gets the result. * @return */ public T getResult() { try { return future.get(); } catch (InterruptedException | ExecutionException ex) { @@ -51,7 +62,7 @@ * @return true, if the job is done, stopped or failed. Otherwise false (if job is running or queued). */ public boolean isFinished() { if (status == Status.DONE || status == Status.STOPPED || status == Status.FAILED) { if (status == Status.DONE || status == Status.CANCELLED || status == Status.FAILED) { return true; } return false; borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
@@ -90,8 +90,8 @@ @Override public T call() throws Exception { if (job.isStopRequested()) { job.setStatus(AbstractJob.Status.STOPPED); if (job.isCancelledRequested()) { job.setStatus(AbstractJob.Status.CANCELLED); return null; } try { borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java
@@ -63,25 +63,35 @@ TestJob job = (TestJob) queue.getQueuedJob(5); assertEquals(AbstractJob.Status.QUEUED, job.getStatus()); String result = job1.waitForResult(); String result = job1.getResult(); 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()); result = job.waitForResult(); queue.append(new TestJob(100, file)); job1 = (TestJob) queue.getQueuedJob(10); assertEquals(AbstractJob.Status.QUEUED, job1.getStatus()); job = (TestJob)queue.getQueuedJob(100); job.cancel(); assertEquals(AbstractJob.Status.CANCELLED, job.getStatus()); result = job1.getResult(); assertEquals("10\n", result); assertEquals(0, queue.getQueueSize()); List<AbstractJob> doneJobs = queue.getDoneJobs(); assertEquals(3, doneJobs.size()); assertEquals(4, 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(1)), AbstractJob.Status.CANCELLED, null); check(((TestJob) doneJobs.get(2)), AbstractJob.Status.FAILED, null); check(((TestJob) doneJobs.get(3)), AbstractJob.Status.DONE, "10"); } private void check(TestJob job, AbstractJob.Status status, String result) { assertEquals(status, job.getStatus()); if (result != null) { assertEquals(result + "\n", job.getResult()); } } }