package jalview.ws2; import java.io.IOException; import java.util.EventObject; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import jalview.bin.Cache; public class WebServiceExecutor { private ScheduledExecutorService executor = Executors .newSingleThreadScheduledExecutor(); public void submit(final WebServiceWorkerI worker) { executor.submit(() -> { try { worker.startJobs(); wsThreadSupport.submitted(worker); } catch (Exception e) { Cache.log.error("Failed to submit web service jobs.", e); wsThreadSupport.submissionFailed(worker, e); return; } executor.schedule(() -> pollJobs(worker), 1, TimeUnit.SECONDS); }); } private void pollJobs(WebServiceWorkerI worker) { boolean done; try { done = worker.pollJobs(); } catch (Exception e) { Cache.log.error("Failed to poll web service jobs.", e); for (WSJob job : worker.getJobs()) { job.setStatus(WSJobStatus.SERVER_ERROR); } wsThreadSupport.pollFailed(worker, e); return; } if (!done) { executor.schedule(() -> pollJobs(worker), 1, TimeUnit.SECONDS); } else { worker.done(); wsThreadSupport.done(worker); } } private WebServiceThreadSupport wsThreadSupport = new WebServiceThreadSupport(); public void addThreadListener(WebServiceThreadListenerI listener) { wsThreadSupport.addListener(listener); } public void removeThreadListener(WebServiceThreadListenerI listener) { wsThreadSupport.removeListener(listener); } public void shutdown() { executor.shutdownNow(); } } class WebServiceThreadSupport implements WebServiceThreadListenerI { List listeners = new CopyOnWriteArrayList<>(); @Override public void submitted(WebServiceWorkerI thread) { for (var listener : listeners) listener.submitted(thread); } @Override public void submissionFailed(WebServiceWorkerI thread, Exception e) { for (var listener : listeners) listener.submissionFailed(thread, e); } @Override public void pollFailed(WebServiceWorkerI thread, Exception e) { for (var listener : listeners) listener.pollFailed(thread, e); } @Override public void cancelled(WebServiceWorkerI thread) { for (var listener : listeners) listener.cancelled(thread); } @Override public void done(WebServiceWorkerI thread) { for (var listener : listeners) listener.done(thread); } public void addListener(WebServiceThreadListenerI listener) { if (!listeners.contains(listener)) { listeners.add(listener); } } public void removeListener(WebServiceThreadListenerI listener) { listeners.remove(listener); } }