2016-08-29 5 views
4

Ich möchte ein mqtt-Thema in meiner Rails-App abonnieren, wenn der Server startet und das Abonnement immer aktiv und aktiv hält.Rails und MQTT: Thema im Hintergrund beim Serverstart abonnieren?

Ich verwende dieses MQTT Juwel für MQTT Kommunikation: https://github.com/njh/ruby-mqtt

Hier ist, was ich jetzt haben:

in application.rb:

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

BackgroundMQTT Klasse:

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 

Also im Grunde die mqtt subscr перед составший на к after_initialize Methode und so weit ich weiß, stoppt nicht automatisch?

Auch Wie Sie sehen können, führe ich das Abonnement in einem Thread, sonst würde meine Rails-Anwendung aufhören, etwas anderes als das mqtt Abonnement zu hören.

Dies scheint zumindest für die ersten paar Minuten zu funktionieren.

Ich bin mir nicht sicher, ob dies eine empfohlene Art zu tun ist, was ich tun möchte. Könnte dies zu Problemen führen, die ich nicht berücksichtigt habe? Was wäre ein empfehlender Weg dies zu tun?

+0

Haben Sie jemals Fortschritte gemacht oder sind dabei erfolgreich? – RonLugge

+0

Ein Problem ist, dass wenn Sie zwei oder mehr Arbeiter haben, werden Sie zweimal abonniert – GorillaApe

Antwort

0

Zwei interessante Hinweise, die helfen können. Ich sehe, dass die MQTT-Bibliothek bereits Threads verwendet und keine lokale Verwendung benötigt.

Zweitens, wenn Sie einen Block übergeben, gibt es ein anderes Verhalten als wenn Sie dies nicht tun. Der entsprechende Code für dieses Verhalten ist https://github.com/njh/ruby-mqtt/blob/master/lib/mqtt/client.rb#L292-L308.

Ich sehe auch, dass Sie eine BackgroundMQTT Klasse instanziieren und nicht die MQTTSubscriber, die Sie in der Frage auflisten. Ich nehme an, das ist nur ein Tippfehler.

Zuletzt beeinflussen Rails und der Rack-Server, wie all dies ausgeführt wird. Wenn Sie sicherstellen möchten, dass Ihr Threading ordnungsgemäß funktioniert, würde ich dies außerhalb von Rails ausführen und sicherstellen, dass Sie das richtige Verhalten erhalten, bevor Sie es in Ihre Anwendung einfügen. Wenn Sie sicher sind, dass dies nicht mit Ihrer Implementierung zusammenhängt, kann ich einige Tests durchführen, wie langlebige Threads in einer Rails-App funktionieren. Versuchen Sie, Ihre Implementierung bis auf puts ohne die Verbindung zu reduzieren und sehen Sie, wie gut sich das verhält.

+1

Versucht es ohne die lokalen Threads - Webrick lädt nicht, so dass sie anscheinend benötigt werden. Auch ohne die '#', get nicht zyklisch, so scheint es auch notwendig zu sein. Genau wie der Autor der Frage bin ich mir nicht sicher, wie "richtig" der Code ist, aber es hat für mich funktioniert! – Mark

Verwandte Themen