2014-04-06 4 views
0

내가 원하는 것은 매 시간마다 서버의 RMQ 교환에 메시지 묶음을 게시하는 반복 프로세스를 시작하는 것입니다.Ruby에서 스케줄러와 AMQP가 제대로 작동하도록하려면 어떻게해야합니까?

클래스가 있는데, RMQProcess으로 전화를 걸어 AMQP 이벤트 루프를 시작합니다. 내가이 일을 루퍼스 - 스케줄러를 사용할 수 있다고 생각 :

scheduler.every '10s', :times=>6 do 
    process = RMQProcess.new 
    process.start 
end 

scheduler.join 

이 작동을 ... 때마다 제외 루프를 통해, (2에서 4 ... 등 6까지) AMQP 채널 증가합니다. 이것은 채널이 제대로 닫히지 않아 문제가 발생할 수 있음을 의미합니다.

제 질문을 요약하면, 이런 종류의 일을하는 적절한 (또는 적어도 적절한) 방법은 무엇입니까? AMQP 프로세스가 스케줄러 프로세스에 들어가기 전에 해고 당해야합니까, 아니면 올바르게하고 있습니까? AMQP 이벤트 루프 내에서 자체 스케줄링 로직을 롤백해야합니까? 그것은 내 두려움입니다. 왜냐하면 더 좋은 방법이 있어야 할 것처럼 보입니다. 어떤 충고라도 받아 들였다.

def start 
    begin 
     puts @rmq_params 
     AMQP.start(@rmq_params) do 
     |connection| 

     connection.on_error do 
      |ch, connection_close| 
      puts "#{connection_close.reply_text}" 
     end 

     connection.on_tcp_connection_loss do 
      |conn, settings| 
      puts "[network failure] Trying to reconnect..." 
      conn.reconnect(false, 2) 
     end 

     channel = AMQP::Channel.new(connection, :auto_recovery => true) 
     puts "Channel ID = #{channel.id}" 
     exchange = channel.direct(@exchangeName,:durable => true) 
     exchange.publish(Lorem.words) 

     EM.add_timer(@duration) do 
      connection.close do 
       EM.stop_event_loop 
      end 
     end 


     Signal.trap("INT") do 
      connection.close do 
      EM.stop_event_loop 
      end 
     end 

     end 
    rescue Exception => e 
     puts "#{e.message} #{e.backtrace.join("\n")}" 
    end 
end 

답변

0

6.times do 
    process = RMQProcess.new 
    process.start 
    sleep(10) 
end 

행동하라 다르게 않습니다

참고로, 여기 (난 그냥 RandomText 보석을 사용하여 말도 안되는 문장을 게시하고있어이 경우) 시작 방법은?

내가 너라면 RMQProcess #를 벗어난 AMQP를 시작하고 결과 연결을 다시 사용합니다.