我有一个 Rails 应用程序,有时使用 gem“Bunny”将消息发布到 RabbitMQ 队列。这是设置:
# 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: '...')
如果我从应用程序或控制台调用它,这很好用,但如果从 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 发布消息应该很常见。