JAL-3878 Move listeners list from the WebServiceDiscoverer interface.
[jalview.git] / src / jalview / ws2 / operations / AbstractWorker.java
1 package jalview.ws2.operations;
2
3 import static java.lang.String.format;
4
5 import java.io.IOException;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import jalview.bin.Cache;
10 import jalview.util.MathUtils;
11 import jalview.ws2.WSJob;
12 import jalview.ws2.WSJobStatus;
13
14 public abstract class AbstractWorker implements WebServiceWorkerI
15 {
16   protected long uid = MathUtils.getUID();
17   public long getUID()
18   {
19     return uid;
20   }
21   
22   protected WebServiceWorkerListenersList listeners = new WebServiceWorkerListenersList(this);
23
24   public void addListener(WebServiceWorkerListener listener)
25   {
26     listeners.addListener(listener);
27   }
28
29
30   private Map<Long, Integer> exceptionCount = new HashMap<>();
31
32   protected static final int MAX_RETRY = 5;
33
34   public boolean poll()
35   {
36     boolean done = true;
37     for (WSJob job : getJobs())
38     {
39       if (!job.getStatus().isDone() && !job.getStatus().isFailed())
40       {
41         Cache.log.debug(format("Polling job %s.", job));
42         try
43         {
44           getOperation().getWebService().updateProgress(job);
45           exceptionCount.remove(job.getUid());
46         } catch (IOException e)
47         {
48           Cache.log.error(format("Polling job %s failed.", job), e);
49           listeners.firePollException(job, e);
50           int count = exceptionCount.getOrDefault(job.getUid(),
51               MAX_RETRY);
52           if (--count <= 0)
53           {
54             job.setStatus(WSJobStatus.SERVER_ERROR);
55             Cache.log.warn(format(
56                 "Attempts limit exceeded. Droping job %s.", job));
57           }
58           exceptionCount.put(job.getUid(), count);
59         } catch (OutOfMemoryError e)
60         {
61           job.setStatus(WSJobStatus.BROKEN);
62           Cache.log.error(
63               format("Out of memory when retrieving job %s", job), e);
64         }
65         Cache.log.debug(
66             format("Job %s status is %s", job, job.getStatus()));
67       }
68       done &= job.getStatus().isDone() || job.getStatus().isFailed();
69     }
70     return done;
71   }
72 }