サーチ…


Javaでのパブリッシュ/サブスクライブ

パブリッシャー/サブスクライバーは、YouTube、Facebook、その他のソーシャルメディアサービスが登場したことを考えると、おなじみのコンセプトです。基本的な概念は、コンテンツを生成するPublisherとコンテンツを消費するSubscriberが存在することです。 Publisherがコンテンツを生成するたびに、各Subscriberに通知されます。 Subscribersは理論的には複数の出版社にSubscribersすることができます。

通常、メッセージングを仲介するためにパブリッシャとサブスクライバの間に置かれるContentServerがあります

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) {
            ...
        }
    }
}

通常、pub-subデザインパターンはマルチスレッドビューで実装されています。より一般的な実装の1つは、各Subscriberを個別のスレッドとして認識し、 ContentServerはスレッドプールを管理します

JavaScriptの単純なpub-subの例

出版社と購読者はお互いを知る必要はありません。それらは単にメッセージキューの助けを借りて通信します。

(function () {
        var data;

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

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

ここでは、 myCustomEventという名前のカスタムイベントを公開し、そのイベントに登録しました。だから彼らはお互いを知る必要はありません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow