borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
@@ -36,23 +36,22 @@ } public void cancelJob(long uniqueJobNumber) { AbstractJob<?> job = getQueuedJobByUniqueJobNumber(uniqueJobNumber); AbstractJob<?> job = null; JobQueue<?> queue = null; Iterator<JobQueue<String>> it = queueMap.values().iterator(); while (it.hasNext()) { queue = it.next(); job = queue.getQueuedJobByUniqueJobNumber(uniqueJobNumber); if (job != null) { break; } } if (job == null) { log.info("Can't cancel job #" + uniqueJobNumber + ". Not found as queued job (may-be already cancelled or finished). Nothing to do."); return; } job.cancel(); } private AbstractJob<?> getQueuedJobByUniqueJobNumber(long uniqueJobNumber) { Iterator<JobQueue<String>> it = queueMap.values().iterator(); while (it.hasNext()) { AbstractJob<?> job = it.next().getQueuedJobByUniqueJobNumber(uniqueJobNumber); if (job != null) { return job; } } return null; queue.refreshQueue(); } /** borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
@@ -127,7 +127,6 @@ log.info("Cancelling job #" + getUniqueJobNumber() + ": " + getId()); watchdog.destroyProcess(); watchdog = null; setCancelled(); } } borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java
@@ -30,6 +30,7 @@ /** * Searches only for queued jobs (not done jobs). * * @param uniqueJobNumber * @return The job if any job with the given unique job number is queued, otherwise null. */ @@ -76,7 +77,13 @@ return null; } private void organizeQueue() { /** * Removes all finished or cancelled jobs from the queued list and adds them to the list of done jobs. * Will be called automatically after finishing a job. * <br> * You should call this method after cancelling a job. */ public void refreshQueue() { synchronized (queue) { if (queue.isEmpty()) { return; @@ -120,7 +127,11 @@ // Don't overwrite status failed set by job. job.setStatus(AbstractJob.Status.DONE); } organizeQueue(); if (job.isCancellationRequested() && job.getStatus() != AbstractJob.Status.CANCELLED) { log.info("Job #" + job.getUniqueJobNumber() + " cancelled: " + job.getId()); job.setCancelled(); } refreshQueue(); return result; } catch (Exception ex) { log.error("Error while executing job '" + job.getId() + "': " + ex.getMessage(), ex);