2017-05-19 17 views
1

"Bunny"보석을 사용하여 때때로 RabbitMQ 대기열에 메시지를 게시하는 Rails 앱이 있습니다. 그때 호출 할 수 있습니다 어디서나 응용 프로그램에서지연된 작업에서 Bunny :: Exchange 게시를 호출 할 수 있습니까?

# config/initializers/bunny.rb 
$mq_connection = Bunny.new 
$mq_connection.start 
$mq_channel = $mq_connection.create_channel 

:

exchange = $mq_channel.default_exchange 
exchange.publish(msg.to_json, persistent: true, routing_key: '...') 

이 내가 응용 프로그램에서 호출하면 좋은 작품, 또는 콘솔에서, 하지만 일을 doesen't 여기에 설정입니다 DelayedJob 직장에서 전화하면입니다. 예외는 발생하지 않지만 메시지는 전송되지 않습니다. 싱글과 노력

:

그것은 $mq_channel 같은 전역 변수처럼 보였다는 DelayedJob에 의해 발견, 그래서 그것을 저장하는 싱글 모델을 만들 수 없습니다 :

class RabbitMq 
    include Singleton 

    attr_accessor :connection, :channel 

    def exchange 
    channel.default_exchange 
    end 

    def setup 
    self.connection = Bunny.new 
    self.connection.start 
    self.channel = connection.create_channel 
    end 

end 

을 내가 설정을 호출 내 이니셜 라이저 :

# config/initializers/bunny.rb 
RabbitMq.instance.setup 

하지만 제대로 작동하지 않습니다. 작업은 오류없이 종료되지만 아무것도 게시되지 않습니다.

어떻게 할 수 있습니까? DJ와 같은 배경 작업자로부터 RabbitMQ에 메시지를 게시하는 것은 아주 일반적입니다. 여기

답변

1

내가 그것을 할 방법은 다음과 같습니다

class Messaging::Publisher 

    class << self 

    def publish(message) 
     new(message).publish 
    end 

    end # Class Methods 

    #========================================================================= 
    # Instance Methods  
    #========================================================================= 

    def initialize(message) 
     @message = message 
    end 

    def publish 
     connection = Bunny.new(ENV['CLOUDAMQP_URL']) 
     connection.start 
     channel = connection.create_channel 
     queue_name = "#{ENV['app_name']}.#{message.keys.first.to_s.pluralize}_queue" 
     queue = channel.queue(queue_name, durable: true) 
     channel.default_exchange.publish(message.to_json, :routing_key => queue.name) 
     channel.close 
     connection.stop 
     true 
    end 

    private 

    def message() @message end 

end 
내 응용 프로그램 내에서 모두이 전화

(동기) 및 배경 작업에서 (비동기). 다음과 같은 메시지가 표시됩니다.

class ServiceRequests::CreateManager < ServiceRequests::ManagerBase 

    class << self 

    private 

    end # Class Methods 

    #========================================================================= 
    # Instance Methods 
    #========================================================================= 

    def manage 
     Messaging::Publisher.publish service_request_message 
    end 

    private 

    def service_request_message 
     { 
     service_request: { 
      provider: { 
      name: "Foo::Bar" 
      }, 
      params: { 
      baz: 'qux' 
      } 
     } 
     } 
    end 

end 
+1

메시지를 게시해야 할 때마다 새로운 연결을 만들면 실제로 작동합니다. 감사! – jibai31