4 import java.util.concurrent.CopyOnWriteArrayList;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.ScheduledExecutorService;
7 import java.util.concurrent.TimeUnit;
9 import jalview.bin.Cache;
12 * An object that executes submitted {@link PollableTaskI} tasks using
13 * {@link SchedulekExecutorservice}. The task is first started using its
14 * {@link PollableTaskI#start} method and then repeatedly polled every second
15 * with {@link PollableTaskI#poll}.
17 * The {@link PollingTaskExecutor} automates the process of running tasks and
18 * provides convenient interface to listen to events associated with task
24 public class PollingTaskExecutor
26 private ScheduledExecutorService executor = Executors
27 .newSingleThreadScheduledExecutor();
30 * Submit the task for execution. Calls task's {@code start} method and, if
31 * started successfully, schedules next poll after one second.
36 public void submit(final PollableTaskI task)
38 executor.submit(() -> {
42 wsThreadSupport.submitted(task);
45 Cache.log.error("Failed to submit web service jobs.", e);
46 wsThreadSupport.submissionFailed(task, e);
49 executor.schedule(() -> poll(task), 1, TimeUnit.SECONDS);
54 * Poll the task by calling it's {@code poll} method. If not finished, the
55 * next poll is scheduled to happen after one second, otherwise task's
56 * {@code done} method is called immediately.
61 private void poll(PollableTaskI task)
69 Cache.log.error("Failed to poll task.", e);
70 wsThreadSupport.pollFailed(task, e);
75 executor.schedule(() -> poll(task), 1, TimeUnit.SECONDS);
80 wsThreadSupport.done(task);
84 private WebServiceThreadSupport wsThreadSupport = new WebServiceThreadSupport();
87 * Add listener of the task related events.
92 public void addThreadListener(PollableTaskListenerI listener)
94 wsThreadSupport.addListener(listener);
99 * listener to be removed
101 public void removeThreadListener(PollableTaskListenerI listener)
103 wsThreadSupport.removeListener(listener);
106 public void shutdown()
108 executor.shutdownNow();
113 class WebServiceThreadSupport implements PollableTaskListenerI
115 List<PollableTaskListenerI> listeners = new CopyOnWriteArrayList<>();
118 public void submitted(PollableTaskI task)
120 for (var listener : listeners)
121 listener.submitted(task);
125 public void submissionFailed(PollableTaskI task, Exception e)
127 for (var listener : listeners)
128 listener.submissionFailed(task, e);
132 public void pollFailed(PollableTaskI task, Exception e)
134 for (var listener : listeners)
135 listener.pollFailed(task, e);
139 public void cancelled(PollableTaskI task)
141 for (var listener : listeners)
142 listener.cancelled(task);
146 public void done(PollableTaskI task)
148 for (var listener : listeners)
152 public void addListener(PollableTaskListenerI listener)
154 if (!listeners.contains(listener))
156 listeners.add(listener);
160 public void removeListener(PollableTaskListenerI listener)
162 listeners.remove(listener);