Zoeken…


Publiceren - Abonneren op Java

De uitgever-abonnee is een bekend concept gezien de opkomst van YouTube, Facebook en andere sociale mediadiensten. Het basisconcept is dat er een Publisher die inhoud genereert en een Subscriber die inhoud gebruikt. Telkens wanneer de Publisher inhoud genereert, wordt elke Subscriber op de hoogte gebracht. Subscribers kunnen in theorie worden geabonneerd op meer dan één uitgever.

Meestal is er een ContentServer die tussen de uitgever en de abonnee zit om de berichten te bemiddelen

public class Publisher {
    ...
    public Publisher(Topic t) {
        this.topic = t;
    }

    public void publish(Message m) {
        ContentServer.getInstance().sendMessage(this.topic, m);
    }
}

public class ContentServer {
    private Hashtable<Topic, List<Subscriber>> subscriberLists;

    private static ContentServer serverInstance;

    public static ContentServer getInstance() {
        if (serverInstance == null) {
            serverInstance = new ContentServer();
        }
        return serverInstance;
    }

    private ContentServer() {
        this.subscriberLists = new Hashtable<>();
    }
    
    public sendMessage(Topic t, Message m) {
        List<Subscriber> subs = subscriberLists.get(t);
        for (Subscriber s : subs) {
            s.receivedMessage(t, m);
        }
    }

    public void registerSubscriber(Subscriber s, Topic t) {
        subscriberLists.get(t).add(s);
    }

public class Subscriber {
    public Subscriber(Topic...topics) {
        for (Topic t : topics) {
            ContentServer.getInstance().registerSubscriber(this, t);
        }
    }
    
    public void receivedMessage(Topic t, Message m) {
        switch(t) {
            ...
        }
    }
}

Gewoonlijk wordt het pub-sub ontwerppatroon geïmplementeerd met een multithreaded weergave in gedachten. Een van de meest voorkomende implementaties ziet elke Subscriber als een afzonderlijke thread, waarbij de ContentServer een ContentServer beheert

Eenvoudig pub-sub-voorbeeld in JavaScript

Uitgevers en abonnees hoeven elkaar niet te kennen. Ze communiceren eenvoudig met behulp van berichtenwachtrijen.

(function () {
        var data;

        setTimeout(function () {
            data = 10;
            $(document).trigger("myCustomEvent");
        }, 2000);

        $(document).on("myCustomEvent", function () {
            console.log(data);
        });
})();

Hier hebben we een aangepast evenement met de naam myCustomEvent gepubliceerd en ons geabonneerd op dat evenement. Ze hoeven elkaar dus niet te kennen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow