@Override public void afterCompletion(int status) { if (status == Status.STATUS_COMMITTED) { schedule(work, scheduling, false); } else if (status == Status.STATUS_ROLLEDBACK) { work.setWorkInstanceState(State.UNKNOWN); } else { throw new IllegalArgumentException("Unsupported transaction status " + status); } } }
@Override protected void beforeExecute(Thread t, Runnable r) { Work work = WorkHolder.getWork(r); if (isShutdown()) { work.setWorkInstanceState(State.SCHEDULED); queuing.workReschedule(queueId, work); throw new RejectedExecutionException(queueId + " was shutdown, rescheduled " + work); } work.setWorkInstanceState(State.RUNNING); queuing.workRunning(queueId, work); running.add(work); runningCount.inc(); }
@Override public synchronized void removeScheduled(String queueId, String workId) { final MemoryBlockingQueue queue = getQueue(queueId); Work work = queue.lookup(workId); if (work == null) { return; } work.setWorkInstanceState(State.UNKNOWN); listener.queueChanged(work, queue.workCanceled(work)); }
@Override protected void afterExecute(Runnable r, Throwable t) { Work work = WorkHolder.getWork(r); try { if (work.isSuspending()) { log.trace("{} is suspending, giving up", work); return; } if (isShutdown()) { log.trace("rescheduling {}", work.getId(), t); work.setWorkInstanceState(State.SCHEDULED); queuing.workReschedule(queueId, work); return; } work.setWorkInstanceState(State.UNKNOWN); queuing.workCompleted(queueId, work); } finally { running.remove(work); runningCount.dec(); completedCount.inc(); workTimer.update(work.getCompletionTime() - work.getStartTime(), TimeUnit.MILLISECONDS); completionSynchronizer.signalCompletedWork(); } }
/** * Initiates a shutdown of this executor and asks for work instances to suspend themselves. * * @throws InterruptedException */ public void shutdownAndSuspend() throws InterruptedException { try { // don't consume the queue anymore deactivateQueueMetrics(queueId); queuing.setActive(queueId, false); // suspend all running work boolean hasRunningWork = false; for (Work work : running) { work.setWorkInstanceSuspending(); log.trace("suspending and rescheduling {}", work.getId()); work.setWorkInstanceState(State.SCHEDULED); queuing.workReschedule(queueId, work); hasRunningWork = true; } if (hasRunningWork) { long shutdownDelay = Long.parseLong( Framework.getService(ConfigurationService.class).getProperty(SHUTDOWN_DELAY_MS_KEY, "0")); // sleep for a given amount of time for works to have time to persist their state and stop properly Thread.sleep(shutdownDelay); } shutdownNow(); } finally { executors.remove(queueId); } }
return; work.setWorkInstanceState(State.SCHEDULED); WorkSchedulePath.newInstance(work); switch (scheduling) {