2016-08-29 6 views
4

서버가 시작될 때 레일즈 앱에서 mqtt 주제를 구독하고 구독을 항상 활성화되어 실행하고 싶습니다.레일 및 MQTT : 서버 시작시 백그라운드에서 주제를 등록 하시겠습니까?

내가 MQTT 통신이 MQTT 보석 사용하고 있습니다 :

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

BackgroundMQTT 클래스 : application.rb에

: 여기 https://github.com/njh/ruby-mqtt

것은 내가 지금 무엇을 가지고

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 방법으로 시작되며 내가 아는 한 자동으로 중지되지 않습니까?

또한 알겠지만 스레드에서 구독을 실행하고 있습니다. 그렇지 않으면 내 레일 응용 프로그램이 mqtt 구독을 청취하는 것 외에 다른 작업을 중단하게됩니다.

이것은 처음 몇 분 동안은 효과가있는 것으로 보입니다.

이것이 내가하고 싶은 일을하는 데 권장되는 방법인지 확실하지 않습니다. 이로 인해 내가 고려하지 않은 문제가 발생할 수 있습니까? 이 작업을 수행하는 데 권장되는 방법은 무엇입니까?

+0

진전이 있습니까? – RonLugge

+0

하나의 문제는 두 명 이상의 직원이있는 경우 두 번 가입하게됩니다 – GorillaApe

답변

0

두 가지 흥미로운 메모가 도움이 될 수 있습니다. MQTT 라이브러리가 이미 쓰레드를 사용하고 있으며 로컬 사용법은 필요하지 않다는 것을 알았습니다.

둘째, 블록을 통과하면 그렇지 않은 경우와 다른 동작이 나타납니다. 해당 동작에 대한 관련 코드는 https://github.com/njh/ruby-mqtt/blob/master/lib/mqtt/client.rb#L292-L308입니다.

BackgroundMQTT 클래스를 인스턴스화했지만 질문에 나열된 MQTTSubscriber이 아니라는 것을 알았습니다. 나는 그저 오타라고 추측하고있다.

마지막으로 레일즈와 랙 서버는이 모든 것들의 실행 방식에 영향을 미친다. 스레딩이 제대로 작동하는지 확인하려면 Rails 외부에서 실행하고 응용 프로그램에 넣기 전에 적절한 동작을 얻도록하십시오. 이것이 당신의 구현과 관련이 없다고 확신 할 수 있다면 레일즈 애플리케이션 내부에서 오래 지속되는 쓰레드가 작동하는 방법에 대한 몇 가지 테스트를 해보도록하겠습니다. 연결을하지 않고 구현을 단지 puts으로 줄이고 동작이 얼마나 잘되는지보십시오.

+1

로컬 스레드없이 시도했는지 - webrick이로드되지 않아 필요한 것 같습니다. 또한 '#'이 없으면 get은 순환하지 않으므로 필요합니다. 질문의 저자와 마찬가지로 코드가 "정확하다"는 것이 확실하지 않지만 나를 위해 잘 작동합니다! – Mark