priorização entrada do canal em Retlang
-
20-08-2019 - |
Pergunta
Como pode canal de entrada ser tratado de forma prioritária? Existe algo equivalente
a construção "reactWithin(0) { ... case TIMEOUT }
" do Scala?
Solução
Eu escrevi uma classe de subscrição que entrega mensagens priorizadas em um intervalo definido. Não é uma maneira ideal caso geral para consumir mensagens priorizadas, mas eu vou postá-lo para a posteridade. Eu acho que um RequestReplyChannel costume seria a melhor opção para alguns outros casos. Implementação de PriorityQueue é deixado como um exercício para o leitor.
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);
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow