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; import jalview.ws2.WebServiceWorkerI.WSJob; public class WebServiceExecutor { private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); public void submit(final WebServiceWorkerI worker) { for (var job : worker.getJobs()) { executor.submit(() -> submitJob(worker, job)); executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS); } } private void submitJob(WebServiceWorkerI worker, WSJob job) { try { job.setJobID(worker.startJob(job).getJobID()); job.resetAllowedExceptions(); executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS); } catch (IOException e) { Cache.log.error("Exception occurred during job submission", e); if (!job.deductAllowedExceptions()) { job.setState(WSJobState.SERVER_ERROR); } } if (!job.getState().isSubmitted()) { executor.schedule(() -> submitJob(worker, job), 5, TimeUnit.SECONDS); } } private void pollJob(WebServiceWorkerI worker, WSJob job) { try { worker.pollJob(job); job.resetAllowedExceptions(); } catch (IOException e) { Cache.log.error("Exception occurred duringn job pollign", e); if (!job.deductAllowedExceptions()) { job.setState(WSJobState.SERVER_ERROR); } } if (!job.getState().isDone()) { executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS); } } public static interface WebServiceThreadListenerI { public void threadSubmitted(WebServiceWorkerI thread); public void threadStarted(WebServiceWorkerI thread); public void stateChanged(WebServiceWorkerI thread, WSJobState oldState, WSJobState newState); public void logAppended(WebServiceWorkerI thread, String text); public void errorLogAppended(WebServiceWorkerI thread, String text); public void cancelled(WebServiceWorkerI thread); } List listeners = new CopyOnWriteArrayList<>(); public void addServiceListener(WebServiceThreadListenerI listener) { if (!listeners.contains(listener)) listeners.add(listener); } public void removeServiceListener(WebServiceThreadListenerI listener) { listeners.remove(listener); } }