У меня есть приложение Rails, которое иногда публикует сообщения в очередь RabbitMQ, используя гем "Bunny". Вот настройка:
# 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
Но это тоже не работает. Задание завершается без ошибок, но ничего не публикуется.
Любая идея, как это сделать? Публикация сообщений в RabbitMQ из фонового рабочего процесса, такого как DJ, должна быть довольно распространенным явлением.