Skip to content

排他サブスクライブ

排他サブスクライブは、EMQXがサポートする拡張されたMQTT機能です。これはトピックに対して相互排他的なサブスクライブを可能にします。つまり、同時に1つのサブスクライバーのみがトピックをサブスクライブでき、現在のサブスクライバーがサブスクライブを解除するまで、他のサブスクライバーは該当トピックをサブスクライブできません。

サブスクライブを排他にするには、トピックの先頭にプレフィックスを追加する必要があります。以下の表は例を示しています。

プレフィックス実際のトピック名
$exclusive/t/1$exclusive/t/1

クライアントA$exclusive/t/1をサブスクライブすると、A$exclusive/t/1のサブスクライブを解除するまで、他のクライアントは$exclusive/t/1をサブスクライブできません。

TIP

排他サブスクライブは必ず$exclusive/で始まる必要があります。上記の例では、他のクライアントはt/1を使って正常にサブスクライブすることは可能です。

設定ファイルで排他サブスクライブを有効化する

排他サブスクライブはデフォルトで無効化されています。設定ファイルで以下のように設定することで、この機能を有効化できます。

bash
mqtt.exclusive_subscription.enable = true

MQTTX Desktopで排他サブスクライブを試す

前提条件

  • MQTTX Desktopを使った基本的なパブリッシュおよびサブスクライブ操作ができること
  • 排他サブスクライブが有効化されていること
  1. EMQXとMQTTX Desktopを起動します。New Connectionをクリックして、パブリッシャーとしてクライアント接続を作成します。

    • Name欄にDemoと入力します。
    • Host欄にローカルホスト127.0.0.1を入力します(このデモの例として)。
    • 他の設定はデフォルトのままにして、Connectをクリックします。

    TIP

    MQTT接続の作成方法の詳細はMQTTX Desktopをご参照ください。

    新しい接続の一般設定
  2. さらに2つのMQTT接続を作成し、それぞれSubscriber1Subscriber2と設定します。

  3. ConnectionsペインでSubscriber1の接続を選択し、New Subscriptionボタンをクリックしてサブスクライブを作成します。Topicのテキストボックスに$exclusive/t/1と入力し、このトピックをサブスクライブします。Confirmをクリックします。

    排他トピックのサブスクライブ
  4. ConnectionsペインでSubscriber2の接続を選択し、同様にNew Subscriptionボタンをクリックしてサブスクライブを作成します。Topic$exclusive/t/1と入力しサブスクライブを試みます。Confirmをクリックします。

    • エラーメッセージが表示されます。
    排他サブスクライブ失敗

MQTTX CLIで排他サブスクライブを試す

前提条件

  • MQTTX CLIを使った基本的なパブリッシュおよびサブスクライブ操作ができること
  • 排他サブスクライブが有効化されていること
  1. 以下のコマンドで排他サブスクライブを行います。

    bash
    mqttx sub -t "$exclusive/t/1"
  2. ステップ1のコマンドを再度実行して、トピック$exclusive/t/1への別のサブスクライブを試みます。以下のように返されます。

    bash
    subscription negated to t/2 with code 135

    排他サブスクライブのエラーコード一覧:

    コード理由
    0x8F排他サブスクライブが有効化されていない状態で$exclusive/を使用した。
    0x97すでに他のクライアントがこのトピックをサブスクライブしている。