From bf7101f797e8f2a6c3b966762afb1ec063c4428e Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Sat, 05 Jan 2019 23:03:45 +0000
Subject: [PATCH] Job monitor: Cancellation of jobs modified.
---
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java | 1 -
borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/JobQueue.java | 17 ++++++++++++++---
borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java | 25 ++++++++++++-------------
3 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
index 5e440fe..5678da2 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/BorgQueueExecutor.java
@@ -36,25 +36,24 @@
}
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();
+ queue.refreshQueue();
}
-
- 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;
- }
-
+
/**
* For displaying purposes.
*
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
index 591980d..7564241 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/jobs/AbstractCommandLineJob.java
+++ b/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();
}
}
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 819cb0e..8c9eb47 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
@@ -16,7 +16,7 @@
private List<AbstractJob<T>> doneJobs = new LinkedList<>();
private ExecutorService executorService = Executors.newSingleThreadExecutor();
- private static synchronized void setNextJobId(AbstractJob<?> job) {
+ private static synchronized void setNextJobId(AbstractJob<?> job) {
job.setUniqueJobNumber(jobSequence++);
}
@@ -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);
--
Gitblit v1.10.0