2016-08-29 20 views
4

我想在服务器启动时在我的rails应用程序中订阅mqtt主题,并保持订阅始终处于活动状态并正在运行。Rails和MQTT:在服务器启动时在后台订阅主题?

我使用MQTT通信这个MQTT宝石: https://github.com/njh/ruby-mqtt

这是我现在所拥有的:

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

BackgroundMQTT类:

在application.rb中

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 subscr iption从after_initialize方法开始,据我所知,不会自动停止?

另外正如你所看到的,我正在线程中运行订阅,否则我的rails应用程序将停止做其他任何事情比听mqtt订阅。

这似乎至少在前几分钟工作。

我不确定这是否是推荐的做我想做的事。这是否会导致我没有考虑过的任何问题?什么会是这样做的推荐方式?

+0

你有没有取得任何进展或成功呢? – RonLugge

+0

一个问题是,如果你有两个或两个以上的工人,你将被订阅两次 – GorillaApe

回答

0

两个有趣的笔记可能会有所帮助。我看到MQTT库已经使用线程并且不需要本地使用。

其次,当你通过一个块时,会有不同的行为。该行为的相关代码是https://github.com/njh/ruby-mqtt/blob/master/lib/mqtt/client.rb#L292-L308

我还看到您正在实例化一个BackgroundMQTT类,而不是您在问题中列出的MQTTSubscriber。我假设这只是一个错字。

最后,Rails和机架服务器影响所有这些如何执行。如果你想确保你的线程工作正常,我会在Rails之外执行这个操作,并确保你在将它放入你的应用程序之前得到正确的行为。如果您确定这与您的实现无关,那么我可能会运行一些测试,了解Rails应用程序内部多长时间的线程工作。尝试减少你的实施,只需puts没有连接,看看表现如何。

+1

没有本地线程尝试 - webrick没有加载,所以他们似乎是需要的。也没有'#',get不会循环,所以它似乎也是必须的。就像问题的作者一样,我不确定代码是如何“正确”的,但它对我有用! – Mark