package org.opendaylight.openflowplugin.openflow.md.queue;
import java.util.Collection;
+import java.util.List;
import java.util.Map;
import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
import org.opendaylight.openflowplugin.openflow.md.core.TranslatorKey;
/**
- * @author mirehak
+ * This processing mechanism based on queue. Processing consists of 2 steps: translate and publish.
+ * Proposed workflow (might slightly deviate in implementations):
+ * <ol>
+ * <li>messages of input type are pushed in (via {@link QueueKeeper#push(Object, ConnectionConductor)} and similar)</li>
+ * <li>ticket (executable task) is build upon each pushed message and enqueued</li>
+ * <li>ticket is translated using appropriate translator</li>
+ * <li>ticket is dequeued and result is published by appropriate popListener</li>
+ * </ol>
+ * Message order might be not important, e.g. when speed is of the essence
* @param <IN> source type
* @param <OUT> result type
*/
public interface QueueKeeper<IN, OUT> {
+ /** type of message enqueue */
+ public enum QueueType {
+ /** ordered processing */
+ DEFAULT,
+ /** unordered processing - bypass fair processing */
+ UNORDERED}
+
/**
- * @param listener
+ * @param translatorMapping translators for message processing
*/
- void addPopListener(PopListener<OUT> listener);
-
+ void setTranslatorMapping(Map<TranslatorKey, Collection<IMDMessageTranslator<IN, List<OUT>>>> translatorMapping);
+
/**
- * @param listener
- * @return removed listener
+ * enqueue message for processing using {@link QueueType#DEFAULT}
+ * @param message
+ * @param conductor source of message
*/
- boolean removePopListener(PopListener<OUT> listener);
+ void push(IN message, ConnectionConductor conductor);
/**
- * @param translatorMapping
+ * enqueue message for processing
+ * @param message
+ * @param conductor source of message
+ * @param queueType - {@link QueueType#DEFAULT} if message order matters, {@link QueueType#UNORDERED} otherwise
*/
- void setTranslatorMapping(Map<TranslatorKey, Collection<IMDMessageTranslator<IN, OUT>>> translatorMapping);
+ void push(IN message, ConnectionConductor conductor, QueueType queueType);
/**
- * @param registeredMessageClazz registered message type
- * @param message
- * @param conductor
+ * @param popListenersMapping listeners invoked when processing done
*/
- void push(Class<? extends IN> registeredMessageClazz, IN message,
- ConnectionConductor conductor);
+ void setPopListenersMapping(Map<Class<? extends OUT>, Collection<PopListener<OUT>>> popListenersMapping);
}