@Override protected void beforeExecute(Thread t, Runnable r) { if (LOG.isTraceEnabled()) { } }
@Override protected void afterExecute(Runnable r, Throwable t) { if (LOG.isTraceEnabled()) { } if (t != null) { LOG.error("Worker exited due to exception", t); } }
@NotNull List<Runnable> doShutdownNow() { doShutdown(); // shutdown me first to avoid further delayQueue offers List<MyScheduledFutureTask> result = delayQueue.stream().filter(task -> { if (task.getBackendExecutorService() == backendExecutorService) { task.cancel(false); return true; } return false; }).collect(Collectors.toList()); delayQueue.removeAll(new HashSet<MyScheduledFutureTask>(result)); if (LOG.isTraceEnabled()) { LOG.trace("Shutdown. Drained tasks: "+result); } //noinspection unchecked return (List)result; }
@NotNull private <T> MyScheduledFutureTask<T> delayedExecute(@NotNull MyScheduledFutureTask<T> t) { if (LOG.isTraceEnabled()) { LOG.trace("Submit at delay " + t.getDelay(TimeUnit.MILLISECONDS) + "ms " + BoundedTaskExecutor.info(t)); } if (isShutdown()) { throw new RejectedExecutionException("Already shutdown"); } delayQueue.add(t); if (t.getDelay(TimeUnit.HOURS) > 24 && !t.isPeriodic()) { // guard against inadvertent queue overflow throw new IllegalArgumentException("Unsupported crazy delay " + t.getDelay(TimeUnit.MINUTES) + " minutes: " + BoundedTaskExecutor.info(t)); } return t; }
@Override public void run() { while (!shutdown.get()) { try { final SchedulingWrapper.MyScheduledFutureTask task = take(); if (LOG.isTraceEnabled()) { LOG.trace("Took " + task.toString()); } if (!task.isDone()) { // can be cancelled already task.getBackendExecutorService().execute(task); } } catch (InterruptedException e) { if (!shutdown.get()) { LOG.error(e); } } } LOG.debug("scheduledToPooledTransferer Stopped"); } }, "Periodic tasks thread");
/** * Overrides FutureTask version so as to reset/requeue if periodic. */ @Override public void run() { if (LOG.isTraceEnabled()) { LOG.trace("Executing " + BoundedTaskExecutor.info(this)); } boolean periodic = isPeriodic(); if (!periodic) { super.run(); } else if (runAndReset()) { setNextRunTime(); delayQueue.offer(this); } }