2016-08-29 7 views
4

Я хочу подписаться на тему mqtt в приложении rails при запуске сервера и всегда поддерживать и запускать подписку.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 subscr iption начинается с метода after_initialize и, насколько я знаю, не останавливается автоматически?

Также, как вы можете видеть, я запускаю подписку в Thread, иначе мое приложение 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

Смежные вопросы