首先,这在我的本地机器上运行良好。
我有一个发布者应用程序(Rails 3),它正在向 heroku 中的cloudamq(插件)发布消息,我们在 cloudamq 中获取消息
和一个消费者应用程序(Rails 5),它也作为一个单独的应用程序在 heroku 上运行,我把这个消费者放在一个 rake 任务中,但这里的问题是只有当我们重新启动服务器时才从队列中获取消息,这意味着这个 rake 任务当我们重新启动时会运行,但在 rabbitMQ 中它显示总是在运行
那么一旦我们推送到heroku,我们如何才能让消费者持续收听呢?
此外,一旦我们从队列中获取消息,我必须调用 sidekiq 工作人员,这不会发生吗?使用“redis to go”插件
消费应用
我在这个消费者应用程序中使用过的 Gem
gem 'redis', '~> 3.0'
gem 'sidekiq'
gem 'bunny'
这是从队列中获取消息作为 rake 任务的消费者部分。
task :do_consumer => :environment do
connection = Bunny.new(ENV['CLOUDAMQP_URL'])
connection.start # start a communication session with the amqp server
channel = connection.channel()
queue = channel.queue('order-queue', durable: true)
puts ' [*] Waiting for messages. To exit press CTRL+C'
queue.subscribe(manual_ack: true, block: true) do |delivery_info,
properties, payload|
puts " [x] Received #{payload}"
puts " [x] Done"
channel.ack(delivery_info.delivery_tag, false)
# Call sidekiq worker to do task
callSidekiqWorker.perform_async(payload)
end
end
档案
web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq -e production
worker: bundle exec rake do_consumer