mosquitto は mqtt ブローカーの参照実装と言われるだけあって、安定していて使いやすいのですが、やはりバグがいくつかあります。(現状 Github で報告されている issue だけでもこれだけあります)
今回、私のプロジェクトにおいて関係するバグを備忘録として残しておきます。
Windows 環境において、 mosquitto_loop_stop(mosq, false) が正常に動作しない
期待される動作
mosquitto_loop_stop
関数は、ブローカーとの通信スレッドを停止する API ですが、第2引数 (bool force
) の値によって以下のように動作が異なるという仕様です。
- false の場合:
ブローカーとの通信終了における正常な手順であるmosquitto_disconnect
関数をあらかじめコールしてからでないと、スレッドが終了しない。つまり、mosquitto_disconnect
関数をコールせずにmosquitto_loop_stop(mosq, false)
しても、制御が戻らない - true の場合:
mosquitto_disconnect
関数をコールしていないくても、強制的に通信スレッドを停止させる。ただし、この場合はブローカーはクライアントと異常切断したと判断する。(なので、 will が実行される)
バグの症状
ここで、 Windows 環境におけるバグですが、第2引数を true
としても、強制的に通信スレッドを停止しません。つまり、第2引数が常に false
として動作するということです。
一応対応策は上記 issue にて提案はされているのですが、既に2年ほど放置されています・・・
やはり OSS なので、困っている人が自分で解決してコントリビュートするべきですかねぇ
コメント