- else if (exception != null){
- Cache.log.warn(format("Worker %s failed%n", getWorker().getClass().getName()));
- exception.printStackTrace();
- notifyExceptional(worker, exception);
+ Console.debug( format("Worker %s queued", getWorker()));
+ final var runnable = new Runnable()
+ {
+ private boolean started = false;
+
+ private boolean completed = false;
+
+ Future<?> future = null;
+
+ @Override
+ public void run()
+ {
+ try
+ {
+ if (!started)
+ {
+ Console.debug(format("Worker %s started", getWorker()));
+ getWorker().startUp();
+ started = true;
+ }
+ else if (!completed)
+ {
+ Console.debug(format("Polling worker %s", getWorker()));
+ if (getWorker().poll())
+ {
+ Console.debug(format("Worker %s finished", getWorker()));
+ completed = true;
+ }
+ }
+ } catch (Throwable th)
+ {
+ Console.debug(format("Worker %s failed", getWorker()), th);
+ completed = true;
+ }
+ if (completed)
+ {
+ final var worker = getWorker();
+ if (!isRegistered())
+ PollableWorkerManager.super.worker = null;
+ Console.debug(format("Finalizing completed worker %s", worker));
+ worker.done();
+ // almost impossible, but the future may be null at this point
+ // let it throw NPE to cancel forcefully
+ future.cancel(false);
+ }
+ }
+ };
+ runnable.future = task = executor.scheduleWithFixedDelay(runnable, 10,
+ 1000, TimeUnit.MILLISECONDS);
+ }
+
+ synchronized protected void cancel()
+ {
+ if (!isWorking())
+ {
+ return;