Question

Comment l’entrée des canaux peut-elle être gérée de manière prioritaire? Y a-t-il quelque chose d'équivalent au " reactWithin(0) { ... case TIMEOUT } " de Scala construction?

Était-ce utile?

La solution

J'ai écrit une classe d'abonnement qui délivre des messages prioritaires sur un intervalle défini. Ce n'est pas un moyen idéal de consommer des messages prioritaires, mais je le posterai pour la postérité. Je pense qu'un RequestReplyChannel personnalisé serait une meilleure option pour certains autres cas. L’implémentation de PriorityQueue est un exercice à la disposition du lecteur.

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top