package
org.eredlab.g4.rif.pushlet.core;
|
|
import
org.eredlab.g4.rif.pushlet.util.Log;
|
|
/** |
*
Abstract Event source from which Events are pulled. |
* |
*
@author |
*
@since 2011-05-12 |
*/
|
abstract public class EventPullSource implements EventSource, Runnable {
|
private volatile boolean alive = false;
|
private volatile boolean active = false;
|
private static int threadNum = 0;
|
private Thread thread;
|
|
public EventPullSource() {
|
}
|
|
abstract protected long getSleepTime();
|
|
abstract protected Event pullEvent();
|
|
public void start() {
|
thread = new Thread(this, "EventPullSource-" + (++threadNum));
|
thread.setDaemon(true);
|
thread.start();
|
}
|
|
public boolean isAlive() {
|
return alive;
|
}
|
|
/**
|
* Stop the event generator thread. |
*/
|
public void stop() {
|
alive = false;
|
|
if (thread != null) {
|
thread.interrupt();
|
thread = null;
|
}
|
|
}
|
|
/**
|
* Activate the event generator thread. |
*/
|
synchronized public void activate() {
|
if (active) {
|
return;
|
}
|
active = true;
|
if (!alive) {
|
start();
|
return;
|
}
|
Log.debug(getClass().getName() + ":
notifying...");
|
notifyAll();
|
}
|
|
/**
|
* Deactivate the event generator thread. |
*/
|
public void passivate() {
|
if (!active) {
|
return;
|
}
|
active = false;
|
}
|
|
/**
|
* Main loop: sleep, generate event and publish. |
*/
|
public void run() {
|
Log.debug(getClass().getName() + ":
starting...");
|
alive = true;
|
while (alive) {
|
try {
|
|
Thread.sleep(getSleepTime());
|
|
// Stopped during sleep: end loop.
|
if (!alive) {
|
break;
|
}
|
|
// If passivated wait until we get
|
// get notify()-ied. If there are no subscribers
|
// it wasts CPU to remain producing events...
|
synchronized (this) {
|
while (!active) {
|
Log.debug(getClass().getName() + ":
waiting...");
|
wait();
|
}
|
}
|
|
} catch (InterruptedException
e) {
|
break;
|
}
|
|
try {
|
// Derived class should produce an event.
|
Event event = pullEvent();
|
|
// Let the publisher push it to subscribers.
|
Dispatcher.getInstance().multicast(event);
|
} catch (Throwable
t) {
|
Log.warn("EventPullSource exception while multicasting ",
t);
|
t.printStackTrace();
|
}
|
}
|
Log.debug(getClass().getName() + ":
stopped");
|
}
|
}
|