package org.bigbluebutton.core.pubsub.receivers;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.bigbluebutton.core.api.IBigBlueButtonInGW;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RedisMessageReceiver {
private static final Logger log = LoggerFactory.getLogger(RedisMessageReceiver.class);
private BlockingQueue<ReceivedMessage> receivedMessages = new LinkedBlockingQueue<ReceivedMessage>();
private volatile boolean processMessage = false;
private final Executor msgProcessorExec = Executors.newSingleThreadExecutor();
private final Executor runExec = Executors.newSingleThreadExecutor();
private List<MessageHandler> receivers;
private IBigBlueButtonInGW bbbGW;
public RedisMessageReceiver(IBigBlueButtonInGW bbbGW) {
this.bbbGW = bbbGW;
receivers = new ArrayList<MessageHandler>();
setupReceivers();
start();
}
private void setupReceivers() {
ChatMessageReceiver chatRx = new ChatMessageReceiver(bbbGW);
receivers.add(chatRx);
LockMessageReceiver lockRx = new LockMessageReceiver(bbbGW);
receivers.add(lockRx);
PresentationMessageListener presRx = new PresentationMessageListener(bbbGW);
receivers.add(presRx);
UsersMessageReceiver usersRx = new UsersMessageReceiver(bbbGW);
receivers.add(usersRx);
WhiteboardMessageReceiver whiteboardRx = new WhiteboardMessageReceiver(bbbGW);
receivers.add(whiteboardRx);
DeskShareMessageReceiver deskShareRx = new DeskShareMessageReceiver(bbbGW);
receivers.add(deskShareRx);
PollingMessageReceiver pollRx = new PollingMessageReceiver(bbbGW);
receivers.add(pollRx);
MeetingMessageReceiver meetingRx = new MeetingMessageReceiver(bbbGW);
receivers.add(meetingRx);
CaptionMessageReceiver captionRx = new CaptionMessageReceiver(bbbGW);
receivers.add(captionRx);
}
public void handleMessage(String pattern, String channel, String message) {
ReceivedMessage rm = new ReceivedMessage(pattern, channel, message);
receivedMessages.add(rm);
}
public void stop() {
processMessage = false;
}
public void start() {
try {
processMessage = true;
Runnable messageProcessor = new Runnable() {
public void run() {
while (processMessage) {
try {
ReceivedMessage 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 subscribing to channels: " + e.getMessage());
}
}
private void processMessage(final ReceivedMessage msg) {
Runnable task = new Runnable() {
public void run() {
for (MessageHandler l : receivers) {
l.handleMessage(msg.getPattern(), msg.getChannel(), msg.getMessage());
}
}
};
runExec.execute(task);
}
}