package eu.europeana.cloud.service.dls.kafka;
import eu.europeana.cloud.common.exceptions.NoAppropriateMessageProcessorException;
import eu.europeana.cloud.service.dls.kafka.Dispatcher;
import eu.europeana.cloud.service.dls.listeners.MessageProcessor;
import eu.europeana.cloud.service.mcs.messages.AbstractMessage;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* MessageDispatcher routes message to an appropriate {@link MessageProcessor} based on message class.
* Initializes listenersMap - a routing table containg message class - {@link MessageProcessor} class associations.
*/
@Component
public class MessageDispatcher implements Dispatcher {
private static final Logger LOGGER = LoggerFactory
.getLogger(MessageDispatcher.class);
private Map<Class<? extends AbstractMessage>, MessageProcessor<? extends AbstractMessage>> listenersMap = new HashMap<>();
public void setListenersMap(
Map<Class<? extends AbstractMessage>, MessageProcessor<? extends AbstractMessage>> listenersMap) {
this.listenersMap = listenersMap;
}
/**
* {@inheritDoc}
*/
@Override
public <T extends AbstractMessage> void routeMessage(T message) {
final MessageProcessor<AbstractMessage> listener = (MessageProcessor<AbstractMessage>) listenersMap
.get(message.getClass());
if (listener == null) {
throw new NoAppropriateMessageProcessorException(
"No route set to specified message type:"
+ message.getClass());
}
listener.processMessage(message);
}
}