/[xulu]/trunk/src/appl/parallel/services/RemoteEventProxy.java
ViewVC logotype

Contents of /trunk/src/appl/parallel/services/RemoteEventProxy.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 78 - (show annotations)
Wed Feb 10 16:43:46 2010 UTC (14 years, 10 months ago) by alfonx
File size: 4464 byte(s)
Merged branch 1.8-gt2-2.6 to trunk. Now the trunk is based on GeoTools 2.6.1 and schmitzm-2.0.x
1 package appl.parallel.services;
2
3 import java.rmi.RemoteException;
4 import java.util.Vector;
5 import java.util.concurrent.ConcurrentLinkedQueue;
6
7 import org.apache.log4j.LogManager;
8 import org.apache.log4j.Logger;
9
10 import appl.parallel.event.CommEventSink;
11 import appl.parallel.event.RemoteEvent;
12
13 /**
14 * Delays events and fires them after the delay all <b>at once</b> in one
15 * object (this will save communication time)
16 *
17 * @author Dominik Appl
18 */
19 public class RemoteEventProxy implements CommEventSink, Service {
20
21 /**
22 * This Thread submits the events after the delay
23 *
24 * @author Dominik Appl
25 */
26 private class SubmitThread extends Thread {
27
28 private boolean exit = false;
29
30 private final ConcurrentLinkedQueue<RemoteEvent> queue2;
31
32 private final CommEventSink sink;
33
34 private final long delay;
35
36 SubmitThread(ConcurrentLinkedQueue<RemoteEvent> queue,
37 CommEventSink sink, long delay) {
38 queue2 = queue;
39 this.sink = sink;
40 this.delay = Math.max(100, delay);
41 }
42
43 /*
44 * (non-Javadoc)
45 *
46 * @see java.lang.Thread#run()
47 */
48 public void run() {
49 while (!exit) {
50 try {
51 this.sleep(delay);
52 } catch (InterruptedException e) {
53 // TODO Auto-generated catch block
54 e.printStackTrace();
55 }
56 // add all new events to a vector submit them at once
57 Vector<RemoteEvent> events = new Vector<RemoteEvent>();
58 while (queue.peek() != null)
59 events.add(queue.poll());
60 try {
61 if (events.size() > 0)
62 sink.fireRemoteEvents((RemoteEvent[]) events
63 .toArray(new RemoteEvent[events.size()]));
64 } catch (RemoteException e) {
65 // TODO Auto-generated catch block
66 LOG.warn("Could not transmit events." + e.getMessage(), e);
67 events.clear();
68 }
69 }
70 }
71
72 public void startThread() {
73 exit = false;
74 this.start();
75 }
76
77 public void stopThread() {
78 exit = true;
79 }
80 }
81
82 private final Logger LOG = LogManager.getLogger(this.getClass().getName());
83
84 private boolean timeMonitoring = false;
85
86 private boolean transferMonitoring = false;
87
88 private boolean isRunning;
89
90 SubmitThread submitThread;
91
92 ConcurrentLinkedQueue<RemoteEvent> queue;
93
94 private final CommEventSink eventSink;
95
96 private final long delay;
97
98 /**
99 * Creates a new proxy
100 *
101 * @param targetSink
102 * the sink where the events should be submitted to
103 * @param delay
104 * the delay (in milliseconds)
105 */
106 public RemoteEventProxy(CommEventSink targetSink, long delay) {
107 this.eventSink = targetSink;
108 this.delay = delay;
109 queue = new ConcurrentLinkedQueue<RemoteEvent>();
110
111 }
112
113 /*
114 * (non-Javadoc)
115 *
116 * @see appl.parallel.event.RemoteEventSink#fireRemoteEvent(appl.parallel.event.RemoteEvent)
117 */
118 public void fireRemoteEvent(RemoteEvent e) throws RemoteException {
119 queue.add(e);
120 }
121
122 /*
123 * (non-Javadoc)
124 *
125 * @see appl.parallel.event.RemoteEventSink#fireRemoteEvents(appl.parallel.event.RemoteEvent[])
126 */
127 public void fireRemoteEvents(RemoteEvent[] e) throws RemoteException {
128 for (RemoteEvent event : e) {
129 fireRemoteEvent(event);
130 }
131 }
132
133 /*
134 * (non-Javadoc)
135 *
136 * @see appl.parallel.services.Service#isRunning()
137 */
138 public boolean isRunning() {
139 return isRunning;
140 }
141
142 /**
143 * @return true if the service is running and time monitoring is enabled
144 */
145 public boolean isTimeMonitoringEnabled() throws RemoteException {
146 return timeMonitoring;
147 }
148
149 /**
150 * @return true if the service is running and tansfer monitoring is enabled
151 */
152 public boolean isTransferMonitoringEnabled() throws RemoteException {
153 return transferMonitoring;
154
155 }
156
157 /*
158 * (non-Javadoc)
159 *
160 * @see appl.parallel.services.Service#startService()
161 */
162 public void startService() {
163 isRunning = true;
164 if (submitThread != null)
165 submitThread.stopThread();
166 submitThread = new SubmitThread(queue, eventSink, delay);
167 submitThread.startThread();
168 try {
169 this.timeMonitoring = eventSink.isTimeMonitoringEnabled();
170 this.transferMonitoring = eventSink.isTransferMonitoringEnabled();
171 } catch (RemoteException e) {
172 LOG.error("Could not connect to CommEventSink!!!");
173 }
174
175 }
176
177 /*
178 * (non-Javadoc)
179 *
180 * @see appl.parallel.services.Service#stopService()
181 */
182 public void stopService() {
183 isRunning = false;
184 if (submitThread != null)
185 submitThread.stopThread();
186 }
187 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26