トピックのツリーを作成する拡散ソリューションを構築しています。
RabbitMQ フィードから受け取った値を反映するために、オンデマンドでトピックを作成しています。各トピックにはメモリ コストがあるため、サブスクライバーがしばらくいないトピックを削除しようと考えています。
統合された Java API を使用してこれを行うにはどうすればよいですか?
トピックのツリーを作成する拡散ソリューションを構築しています。
RabbitMQ フィードから受け取った値を反映するために、オンデマンドでトピックを作成しています。各トピックにはメモリ コストがあるため、サブスクライバーがしばらくいないトピックを削除しようと考えています。
統合された Java API を使用してこれを行うにはどうすればよいですか?
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 トピックのトピック仕様を作成します。