5

トピックのツリーを作成する拡散ソリューションを構築しています。

RabbitMQ フィードから受け取った値を反映するために、オンデマンドでトピックを作成しています。各トピックにはメモリ コストがあるため、サブスクライバーがしばらくいないトピックを削除しようと考えています。

統合された Java API を使用してこれを行うにはどうすればよいですか?

4

1 に答える 1

9

TopicEventListener (TopicControl 機能の一部) は、この機能を提供します。トピックのサブスクライバーが 0 の場合と、トピックのサブスクライバーが 1 人以上の場合に個別のコールバックを提供します。

例:

    public TopicEventListenerClient() {
        session = Diffusion.sessions().principal("admin").password("password").open("ws://localhost:8080");
        topicControl = session.feature(TopicControl.class);
        topicControl.addTopicEventListener("rabbitMQ/foo", new TopicEventListener() {

            @Override
            public void onClose(String arg0) {
                LOG.info("Listener closed");
            }

            @Override
            public void onError(String arg0, ErrorReason arg1) {
                LOG.info("Error on listener: " + arg1);
            }

            @Override
            public void onRegistered(String arg0, Registration arg1) {
                LOG.info("Listener registered");
            }

            @Override
            public void onHasSubscribers(String arg0) {
                LOG.info("Topic: " + arg0  + " has at least 1 subscriber");
            }

            @Override
            public void onNoSubscribers(String arg0) {
                LOG.info("Topic: " + arg0  + " has no subscribers");
            }
        });
    }

お役に立てれば!

編集:2019年4月10日

TopicEventListenerは非推奨です (Diffusion バージョン 6.1 以降)。サブスクライバーのいないトピックを削除する推奨される方法は、トピックの自動削除です。これは、トピックの仕様の一部として削除ポリシーを指定することで実現できます。

例えば:

final Session session = Diffusion.sessions().principal("admin").password("password").open("ws://localhost:8080");

final TopicControl topicControl = session.feature(TopicControl.class);

final TopicSpecification specification =
            topicControl.newSpecification(TopicType.JSON)
                .withProperty(TopicSpecification.REMOVAL, "when subscriptions < 1 for 10s");

上記のコードは、10 秒間サブスクライバーがない場合に自動的に削除される JSON トピックのトピック仕様を作成します。

于 2016-03-18T16:51:34.450 に答える