1 package fr.in2p3.jsaga.engine.job.monitor.poll;
2
3 import fr.in2p3.jsaga.engine.job.monitor.JobMonitorCallback;
4 import fr.in2p3.jsaga.engine.job.monitor.JobRegistry;
5
6 import java.util.HashMap;
7 import java.util.Map;
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public abstract class AbstractJobStatusPoller implements JobRegistry, Runnable {
22 protected final Map<String,JobMonitorCallback> m_subscribedJobs;
23 private JobStatusPollerTask m_pollerTask;
24
25 public AbstractJobStatusPoller() {
26 m_subscribedJobs = new HashMap<String,JobMonitorCallback>();
27 }
28
29 public void subscribeJob(String nativeJobId, JobMonitorCallback callback) {
30 synchronized(m_subscribedJobs) {
31 boolean toBeStarted = m_subscribedJobs.isEmpty();
32
33
34 m_subscribedJobs.put(nativeJobId, callback);
35
36
37 if (toBeStarted) {
38 m_pollerTask = new JobStatusPollerTask(this);
39 m_pollerTask.start();
40 }
41 }
42 }
43
44 public void unsubscribeJob(String nativeJobId) {
45 synchronized(m_subscribedJobs) {
46
47 m_subscribedJobs.remove(nativeJobId);
48
49
50 if (m_subscribedJobs.isEmpty() && m_pollerTask!=null) {
51 m_pollerTask.stop();
52 m_pollerTask = null;
53 }
54 }
55 }
56 }
57