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(); 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))); } } borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java
@@ -50,30 +50,29 @@ 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());