デフォルトでは、ApsaraMQ for MQTT は、クライアントが切断された後もそのサブスクリプションをアクティブに保ち、クライアントが再接続したときにキューに入れられたオフラインメッセージを配信します。メッセージに鮮度の要件がある場合や、非アクティブなサブスクライバーを削除する必要がある場合は、サブスクリプションクリーンアップを有効にすることで、クライアントが指定した期間オフラインであった後にサブスクリプションを自動的に削除できます。
サブスクリプションクリーンアップの仕組み
ApsaraMQ for MQTT は、各クライアントの最終ハートビートを追跡します。トピックで自動サブスクリプションクリーンアップが有効になっている場合、ApsaraMQ for MQTT は現在の時刻とクライアントの最終ハートビートを比較します。オフライン期間が設定された [クリーンアップサイクル] 以上になると、システムはそのクライアントとトピック間のサブスクリプションを削除します。
サブスクリプションがクリアされた後:
クライアントはそのトピックからの新しいオフラインメッセージの受信を停止します。
クライアントは、クリーンアップ前に生成され、有効期間内にあるオフラインメッセージは引き続き受信できます。
オフラインメッセージの配信は、QoS および cleanSession パラメーターにも依存します。詳細については、「用語」をご参照ください。
サブスクリプションの変更はインスタンスの課金に影響します。詳細については、「課金の概要」をご参照ください。
サブスクリプションクリーンアップの設定
操作手順
サブスクリプションクリーンアップを有効にすると、クライアントはオフラインメッセージを受信できなくなります。ご注意ください。
ApsaraMQ for MQTT コンソール にログインし、左側のナビゲーションウィンドウで [Instances] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。インスタンスページで、インスタンス ID をクリックすると、[インスタンス詳細] ページが開きます。
左側のナビゲーションウィンドウで トピックの管理 をクリックします。対象のトピックを見つけ、操作 列でを選択します。
[Configure Automatic Cleanup Cycle] パネルで、次の設定を行い、[OK] をクリックします。
設定 説明 自動サブスクリプション関係のクリーンアップを有効化する 自動クリーンアップを有効にするには [Yes] に設定し、サブスクリプションを永続的に保つには [No] に設定します。 [クリーンアップ周期] サブスクリプションが削除されるオフライン期間のしきい値です。クライアントの最終ハートビートからの経過時間がこの値以上になると、サブスクリプションがクリアされます。
結果
保存後、トピックリストの サブスクリプション関係のクリーンアップ周期 列でクリーンアップサイクルを確認します。
クライアント側でのトピックのアンサブスクライブ
MQTT は、クライアントがオンラインの間、既存のサブスクリプションを自動的にクリアしません。トピックを切り替えるには、新しいトピックをサブスクライブする前に、SDK のアンサブスクライブメソッドを呼び出して古いサブスクリプションを削除する必要があります。
コンソールでのサブスクリプションクリーンアップは、オフラインのクライアントにのみ適用されます。サブスクリプションは、クライアントが設定されたクリーンアップサイクルを超えてオフラインのままでいると削除されます。これは、オンラインのクライアントでのトピックの切り替えには適用されません。
Java SDK のサンプル:
MqttClient mqttClient = new MqttClient("tcp://" + endPoint + ":1883", clientId, new MemoryPersistence());
mqttClient.connect(options);
// topicA をサブスクライブ
mqttClient.subscribe("topicA", 1);
// topicB に切り替える前に、topicA のサブスクリプションをアンサブスクライブ
mqttClient.unsubscribe("topicA");
// 次に topicB をサブスクライブ
mqttClient.subscribe("topicB", 1);最初に古いトピックでアンサブスクライブを呼び出し、次に新しいトピックをサブスクライブすることで、2 つのサブスクリプションが同時にアクティブになることはありません。