package eu.leads.processor.deploy;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import eu.leads.processor.Module;
import eu.leads.processor.execute.operators.OperatorCompletionEvent;
import eu.leads.processor.plan.InitializeExecutionPlanEvent;
import eu.leads.processor.utils.StringConstants;
import javax.jms.Message;
import javax.jms.TextMessage;
import java.util.LinkedList;
/**
* Created with IntelliJ IDEA.
* User: vagvaz
* Date: 10/29/13
* Time: 10:44 AM
* To change this template use File | Settings | File Templates.
*/
public class LeadsMonitorService extends Module {
private EventBus eventBus;
private LinkedList<Message> incoming;
private final Object mutex = new Object();
private LeadsDeployerService deployer =null;
public LeadsMonitorService(String url, String name) throws Exception {
super(url, name);
incoming = new LinkedList<Message>();
}
public LeadsMonitorService(String url, String name, EventBus eventBus,LeadsDeployerService deploy) throws Exception {
super(url, name);
this.eventBus = eventBus;
incoming = new LinkedList<Message>();
com.subscribeToQueue(StringConstants.DEPLOYERQUEUE + ".monitor");
com.setQueueMessageListener(this);
incoming = new LinkedList<Message>();
eventBus.register(this);
this.deployer = deploy;
}
@Subscribe
public void monitorExecution(InitializeExecutionPlanEvent e) {
return;
}
//At the moment Monitor service just listens for operator completion and informs deployer service
@Override
protected void run() throws Exception {
while (isRunning()) {
LinkedList<Message> unprocessed = null;
synchronized (mutex) {
if (incoming.size() > 0) {
unprocessed = incoming;
incoming = new LinkedList<Message>();
} else {
mutex.wait();
}
}
if (unprocessed != null) {
while (!unprocessed.isEmpty()) {
TextMessage message = (TextMessage) unprocessed.remove(0);
String type = message.getStringProperty("type");
if (type.equals("completion")) {
String queryId = message.getStringProperty("queryId");
String operator = message.getText();
OperatorCompletionEvent event = new OperatorCompletionEvent(operator, queryId);
deployer.operatorCompletion(event);
} else {
}
}
}
}
}
@Override
public void onMessage(Message message) {
// System.err.println(this.getClass().toString() + " received msg");
synchronized (mutex) {
incoming.add(message);
mutex.notify();
}
}
@Override
protected void triggerShutdown() {
synchronized (mutex) {
mutex.notify();
}
super.triggerShutdown();
}
}