2016-08-29 7 views
4

サーバが起動したときに、自分のレールアプリでmqttトピックを購読して、定期購読を常に有効にして実行しておきたい。RailsとMQTT:サーバー始動時にバックグラウンドでトピックを登録しますか?

私はMQTTの通信のためにこのMQTTの宝石を使用しています:ここで https://github.com/njh/ruby-mqtt

は、私が今持っているものです:application.rbで

config.after_initialize do 
mqttSub = BackgroundMQTT.new 
mqttSub.run 
end 

BackgroundMQTTクラス:

class MQTTSubscriber 
    def run 
    Thread.new do 
     MQTT::Client.connect(:host => 'localhost', :port => 1883,) do |c| 
     c.get('#') do |topic,message| 
      puts "#{topic}: #{message}" 
      #Do things, access activerecord etc. 
     end 
     end 
    end 
    end 
end 

したがって、基本的にmqttサブスクライバiptionはafter_initializeメソッドで開始され、わかっている限り、自動的に停止しませんか?

また、私はスレッドでサブスクリプションを実行しています。そうでないと、私のレールアプリケーションはmqttサブスクリプションを聞く以外のことをやめることになります。

これは少なくとも最初の数分間はうまくいくようです。

これが私がやりたいことをするのが推奨される方法であるかどうかはわかりません。これは、私が考慮していない問題を引き起こす可能性がありますか?これを行うための推奨方法は何でしょうか?

+0

これで進歩を遂げたのか成功したのですか? – RonLugge

+0

2つ以上のワーカーがいる場合は、2回購読されます – GorillaApe

答えて

0

2つの面白いメモが参考になる場合があります。私はMQTTライブラリーがすでにスレッドを使用していて、ローカルでの使用は必要ないと考えています。

第2に、ブロックを渡すと、そうでない場合とは異なる動作が発生します。その動作の関連コードはhttps://github.com/njh/ruby-mqtt/blob/master/lib/mqtt/client.rb#L292-L308です。

BackgroundMQTTクラスをインスタンス化していますが、質問に記載されているMQTTSubscriberではありません。私はそれがちょうどタイプミスであると仮定しています。

最後に、RailsとRackサーバーは、これらのすべてがどのように実行されるかに影響します。スレッディングが正しく動作していることを確認しようとしている場合は、これをRailsの外で実行し、アプリケーションに組み込む前に適切な動作を得ていることを確認してください。これがあなたの実装に関係していないと確信しているなら、長寿命のスレッドがRailsアプリケーションの中でどのように動作するかに関するいくつかのテストを実行するかもしれません。接続を行わずに実装をputsに減らし、その動作がどれほど良好であるかを確認してください。

+1

ローカルスレッドなしで試してみましょう - webrickはロードされないので、必要なようです。また、 '#'がなければ、getは循環しないので、必要でもあるようです。質問の著者と同じように、私はコードが "正しい"かどうか確信していますが、それは私のために働いています! – Mark

関連する問題