package cz.cuni.mff.d3s.been.socketworks.oneway;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cz.cuni.mff.d3s.been.mq.IMessageReceiver;
import cz.cuni.mff.d3s.been.mq.MessagingException;
import cz.cuni.mff.d3s.been.socketworks.SocketHandlerException;
/**
* Message queue listener for one-way (read-only) message queues.
*
* @author darklight
*/
final class ReadOnlyListener extends Thread {
private static final Logger log = LoggerFactory.getLogger(ReadOnlyListener.class);
private final ReadOnlyHandler handler;
private final IMessageReceiver<String> receiver;
private ReadOnlyListener(IMessageReceiver<String> receiver, ReadOnlyHandler handler) {
this.receiver = receiver;
this.handler = handler;
}
public static final ReadOnlyListener create(IMessageReceiver<String> receiver, ReadOnlyHandler handler) {
return new ReadOnlyListener(receiver, handler);
}
@Override
public void run() {
setName(String.format("%s(%s)", getClass().getSimpleName(), handler.getClass().getSimpleName()));
while (true) {
try {
final String message = receiver.receive();
if (ReadOnlyGuard.STOP_MESSAGE.equals(message)) {
log.info("Received stop message");
break;
}
log.debug(message);
handler.handle(message);
} catch (SocketHandlerException e) {
log.warn("Could not handle incoming message.:", e);
} catch (MessagingException e) {
log.warn("Receiver thread terminating with transport error", e);
break;
} catch (Throwable t) {
log.error("Unknown exception on listener, terminating with error.", t);
break;
}
}
log.info("Listener terminating");
}
}