【问题标题】:Rails and MQTT: Subscribe to topic in background at server startup?Rails 和 MQTT:在服务器启动时在后台订阅主题?
【发布时间】:2016-08-29 11:41:28
【问题描述】:

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

我正在使用这个 mqtt gem 进行 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 订阅以after_initialize 方法开始,据我所知,不会自动停止?

此外,正如您所见,我正在线程中运行订阅,否则我的 rails 应用程序将停止执行任何其他操作,而不是监听 mqtt 订阅。

这似乎至少在前几分钟有效。

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

【问题讨论】:

  • 您在这方面有没有取得任何进展或成功?
  • 一个问题是,如果你有两个或更多的工人,你将被订阅两次

标签: ruby-on-rails ruby ruby-on-rails-3 backgroundworker mqtt


【解决方案1】:

两个有趣的注释可能会有所帮助。我看到 MQTT 库已经使用了 Threads,不需要您在本地使用。

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

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

最后,Rails 和 Rack 服务器会影响所有这些的执行方式。如果您试图确保您的线程工作正常,我会在 Rails 之外执行此操作,并确保您在将其放入应用程序之前获得正确的行为。如果您确定这与您的实现无关,那么我可能会运行一些测试来测试长寿命线程在 Rails 应用程序中的工作方式。尝试在没有连接的情况下将您的实现减少到仅puts,看看效果如何。

【讨论】:

  • 在没有本地线程的情况下尝试过 - webrick 无法加载,因此似乎需要它们。同样没有'#',get 不会循环,所以它似乎也是必要的。就像问题的作者一样,我不确定代码有多“正确”,但它对我有用!
  • @Mark 您是否在此实现中遇到过任何问题或偶然发现了“更好”的方法?
  • @Mathyou,不,我使用它的项目几年前停止了(它是为了原型/启动)。我不记得在实施时遇到过任何问题,而且由于它有效,我并没有花太多时间寻找“更好”的解决方案。
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2021-08-24
相关资源
最近更新 更多