use*_*179 6 ruby ruby-on-rails backgroundworker ruby-on-rails-3 mqtt
我希望在服务器启动时在我的rails应用程序中订阅mqtt主题,并保持订阅始终处于活动状态并正在运行.
我正在使用这个mqtt gem进行mqtt通信:https: //github.com/njh/ruby-mqtt
这就是我现在所拥有的:
在application.rb中:
config.after_initialize do
mqttSub = BackgroundMQTT.new
mqttSub.run
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
所以基本上mqtt订阅从after_initialize方法开始,据我所知,不会自动停止?
另外如您所见,我正在线程中运行订阅,否则我的rails应用程序将停止执行除听取mqtt订阅之外的任何其他操作.
这似乎至少在前几分钟有效.
我不确定这是否是我想做的事情的推荐方式.这会导致我没有考虑过的任何问题吗?这样做的推荐方法是什么?
两个有趣的注释可能会有所帮助。我看到 MQTT 库已经使用了线程,不需要您本地使用。
其次,当你通过一个街区时,会有与不通过时不同的行为。该行为的相关代码位于https://github.com/njh/ruby-mqtt/blob/master/lib/mqtt/client.rb#L292-L308。
我还看到您正在实例化一个BackgroundMQTT类,而不是MQTTSubscriber您在问题中列出的类。我假设这只是一个错字。
最后,Rails 和 Rack 服务器影响所有这些的执行方式。如果您想确保线程正常工作,我会在 Rails 之外执行此操作,并确保在将其放入应用程序之前获得正确的行为。如果您确定这与您的实现无关,那么我可能会运行一些测试来了解长期线程在 Rails 应用程序内的工作方式。尝试将您的实现减少到puts没有连接,然后看看其表现如何。
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |