mirror of https://github.com/micromata/borgbackup-butler.git

Kai Reinhard
28.41.2018 9104da0af58d2711255bec27e7071d0ef3de053a
Job queueing...
3 files modified
51 ■■■■■ changed files
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractJob.java 18 ●●●● patch | view | raw | blame | history
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java 2 ●●● patch | view | raw | blame | history
borgbutler-core/src/test/java/de/micromata/borgbutler/jobs/JobQueueTest.java 31 ●●●● patch | view | raw | blame | history
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,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) {