package cz.cuni.mff.d3s.been.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.IMap;
import cz.cuni.mff.d3s.been.cluster.ServiceException;
import cz.cuni.mff.d3s.been.cluster.context.ClusterContext;
import cz.cuni.mff.d3s.been.cluster.context.TaskContexts;
import cz.cuni.mff.d3s.been.core.task.TaskContextEntry;
import cz.cuni.mff.d3s.been.manager.msg.Messages;
import cz.cuni.mff.d3s.been.manager.msg.TaskMessage;
import cz.cuni.mff.d3s.been.mq.IMessageSender;
import cz.cuni.mff.d3s.been.mq.MessagingException;
/**
*
* Listener for local context events.
*
* @author Martin Sixta
*/
final class LocalContextListener extends TaskManagerService implements EntryListener<String, TaskContextEntry> {
/** logging */
private static final Logger log = LoggerFactory.getLogger(LocalContextListener.class);
private final TaskContexts contexts;
private final IMap<String, TaskContextEntry> contextsMap;
private final ClusterContext clusterCtx;
private final PersistentContextStateRegistrar persistentStateRegistrar;
private IMessageSender<TaskMessage> sender;
/**
* Creates new LocalContextListener.
*
* @param clusterCtx
* connection to the cluster
*/
LocalContextListener(ClusterContext clusterCtx) {
this.clusterCtx = clusterCtx;
this.contexts = clusterCtx.getTaskContexts();
this.contextsMap = contexts.getTaskContextsMap();
this.persistentStateRegistrar = new PersistentContextStateRegistrar(clusterCtx);
}
@Override
public void start() throws ServiceException {
sender = createSender();
contextsMap.addLocalEntryListener(this);
}
@Override
public void stop() {
contextsMap.removeEntryListener(this);
sender.close();
}
@Override
public synchronized void entryAdded(EntryEvent<String, TaskContextEntry> event) {
final TaskContextEntry entry = event.getValue();
try {
TaskMessage msg = Messages.createRunContextMessage(entry.getId());
sender.send(msg);
} catch (MessagingException e) {
String msg = String.format("Cannot send message to '%s'", sender.getConnection());
log.error(msg, e);
}
}
@Override
public void entryRemoved(EntryEvent<String, TaskContextEntry> event) {}
@Override
public synchronized void entryUpdated(EntryEvent<String, TaskContextEntry> event) {
final TaskContextEntry entry = event.getValue();
persistentStateRegistrar.processContextStateChange(entry.getId(), entry.getBenchmarkId(), entry.getContextState());
}
@Override
public void entryEvicted(EntryEvent<String, TaskContextEntry> event) {}
}