package org.bigbluebutton.app.screenshare.events;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Set;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
public class EventMessageBusImp implements IEventsMessageBus {
private static Logger log = Red5LoggerFactory.getLogger(EventMessageBusImp.class, "screenshare");
private BlockingQueue<IEvent> receivedMessages = new LinkedBlockingQueue<IEvent>();
private volatile boolean processMessage = false;
private final Executor msgProcessorExec = Executors.newSingleThreadExecutor();
private int maxThreshold = 1024;
private Set<IEventListener> listeners;
public void send(IEvent msg) {
if (receivedMessages.size() > maxThreshold) {
log.warn("Queued number of events [{}] is greater than threshold [{}]", receivedMessages.size(), maxThreshold);
}
receivedMessages.add(msg);
}
public void stop() {
processMessage = false;
}
public void start() {
try {
processMessage = true;
Runnable messageProcessor = new Runnable() {
public void run() {
while (processMessage) {
try {
IEvent msg = receivedMessages.take();
processMessage(msg);
} catch (InterruptedException e) {
log.warn("Error while taking received message from queue.");
}
}
}
};
msgProcessorExec.execute(messageProcessor);
} catch (Exception e) {
log.error("Error processing event: " + e.getMessage());
}
}
private void processMessage(final IEvent msg) {
for (IEventListener listener : listeners) {
listener.handleMessage(msg);
}
}
public void setListeners(Set<IEventListener> listeners) {
this.listeners = listeners;
}
public void setMaxThreshold(int threshold) {
maxThreshold = threshold;
}
}