Kanal-Eingang Priorisierung in Retlang
-
20-08-2019 - |
Frage
Wie kann Kanaleingang in einer priorisierten Weise behandelt werden? Gibt es etwas gleichwertig
zu Scala „reactWithin(0) { ... case TIMEOUT }
“ konstruieren?
Lösung
Ich schrieb eine Abonnement-Klasse, die priorisierte Nachrichten auf einem festgelegten Intervall liefert. Es ist kein idealer allgemeiner Fall Weg priorisierte Nachrichten zu konsumieren, aber ich werde es Post für die Nachwelt. Ich denke, eine benutzerdefinierte RequestReplyChannel eine bessere Option für bestimmte andere Fälle wäre. Implementierung von Priorityqueue bleibt als Übung für den Leser.
class PrioritySubscriber<T> : BaseSubscription<T>
{
private readonly PriorityQueue<T> queue;
private readonly IScheduler scheduler;
private readonly Action<T> receive;
private readonly int interval;
private readonly object sync = new object();
private ITimerControl next = null;
public PrioritySubscriber(IComparer<T> comparer, IScheduler scheduler,
Action<T> receive, int interval)
{
this.queue = new PriorityQueue<T>(comparer);
this.scheduler = scheduler;
this.receive = receive;
this.interval = interval;
}
protected override void OnMessageOnProducerThread(T msg)
{
lock (this.sync)
{
this.queue.Enqueue(msg);
if (this.next == null)
{
this.next =
this.scheduler.Schedule(this.Receive, this.interval);
}
}
}
private void Receive()
{
T msg;
lock (this.sync)
{
msg = this.queue.Dequeue();
if (this.queue.Count > 0)
{
this.next =
this.scheduler.Schedule(this.Receive, this.interval);
}
}
this.receive(msg);
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow