概要
クライアントが切断されると、関連する加入者に意志メッセージが送信されます。意志メッセージは次の場合に送信されます。
- サーバー上で I/O エラーまたはネットワーク障害が発生しました。
- クライアントは、定義されたハートビート期間中に接続を失います。
- クライアントは、オフライン パケットを送信する前にネットワーク接続を閉じます。
- サーバーは、オフライン パケットを受信する前にネットワーク接続を閉じます。
通常、Will メッセージはクライアントの接続時に指定されます。以下のように、接続時にインスタンスsetWillのメソッドを呼び出すことで設定されますMqttConnectOptions。以下のTopicを購読しているクライアントは、Will メッセージを受け取ります。
//method1
MqttConnectOptions.setWill(MqttTopic topic, byte[] payload, int qos, boolean retained)
//method2
MqttConnectOptions.setWill(java.lang.String topic, byte[] payload, int qos, boolean retained)
使用シナリオ
クライアント A が接続すると、Will メッセージは「オフライン」に設定され、クライアント B はこのウィル Topicにサブスクライブします。A が異常に切断すると、クライアント B はこの「オフライン」メッセージを受け取り、クライアント A がオフラインであることを知ります。
接続フラグパケットフィールド
Bit | 7 | 6 | 5 | 4 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
User Name Flag | Password Flag | Will Retain | Will QoS | Will Flag | Clean Start | Reserved | |
byte 8 | X | X | X | X | X | X | X |
クライアントが通常どおり切断メソッドを呼び出した後は、Will メッセージは送信されません。
フラグ機能を発揮します
つまり、依頼者があらかじめ定め、異常切断時に残した最後のLast Will書(Last Will書とも呼ばれます)です。これは、クライアントによって事前に定義されたTopicおよび対応するメッセージであり、CONNECT の可変パケット ヘッダーに添付されます。クライアントの接続が異常な場合、サーバーはこのメッセージを積極的に発行します。
Will Flag のビットが 1 の場合、Will QoS と Will Retain が読み出されます。このとき、Will Topic と Will Message の具体的な内容がメッセージ本文に表示されます。それ以外の場合、Will QoS と Will Retain は無視されます。
Will Flag ビットが 0 の場合、Will Qos および Will Retain は無効になります。
コマンドラインの例
Will メッセージの例は次のとおりです。
-
Sub 側 ClientID = sub が事前に定義されたメッセージが表示されます:
mosquitto_sub --will-topic test --will-payload die --will-qos 2 -t topic -i sub -h 192.168.1.1
-
clientid = alive は 192.168.1.1 (EMQ サーバー) で will Topicにサブスクライブします
mosquitto_sub -t test -i alive -q 2 -h 192.168.1.1
-
サブエンドがサーバー エンド (EMQ サーバー) から異常に切断され、パブ エンドが will メッセージを受信します。
高度な使用シナリオ
ここでは、Will メッセージで Retained メッセージを使用する方法を説明します。
- クライアントAのLast Will メッセージは「オフライン」に設定され、Last WillのTopicは A/status通常の送信状態のTopicと同じに設定されます。
- クライアント A が接続されたら、「オンライン」Retained メッセージをTopicA/statusに送信します。他のクライアントがTopicA/statusにサブスクライブすると、保持されたメッセージを「オンライン」として取得します。
- クライアント A が異常に切断すると、システムはTopicA/statusに「オフライン」メッセージを自動的に送信します。このTopicにサブスクライブする他のクライアントは、すぐに「オフライン」メッセージを受信します。Will メッセージが「Retained」に設定されており、Topicにサブスクライブしている新しいクライアントがA/statusオンラインになると、取得されるメッセージは「オフライン」になります。