Прежде всего, это нормально работает на моей локальной машине.
У меня есть одно приложение для издателей (Rails 3), которое публикует сообщение для cloudamq (аддон) в heroku, мы получаем сообщения в cloudamq
![enter image description here](https://i.stack.imgur.com/RuMBa.png)
и одно потребительское приложение (Rails 5), которое также работает на heroku как отдельное приложение, я поставил этого потребителя в задачу rake, но здесь проблема в том, что он принимает сообщения только из очередикогда мы перезапускаем сервер, это означает, что эта задача rake будет запускаться при перезапуске, но в rabbitMQ он всегда показывает:
![enter image description here](https://i.stack.imgur.com/4gBwj.png)
Итак, как мы можем сделатьпотребитель постоянно слушает, как только мы нажимаем на heroku?
Кроме того, как только мы получаем сообщение из очереди, я должен вызвать работника sidekiq, чего не происходит?использование 'redis to go' addon
APP
Gem, который я использовал в этом клиентском приложении
gem 'redis', '~> 3.0'
gem 'sidekiq'
gem 'bunny'
Это потребительская часть, чтобы получить сообщение из очередикак грабли.
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
Procfile
web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq -e production
worker: bundle exec rake do_consumer