4

我正在尝试在 heroku 上运行消息队列。为此,我正在使用RabbitMQ Bigwig插件。

我正在使用 bunny gem 发布消息并尝试使用运动鞋 gem 接收消息。整个设置在本地机器上运行顺利。

我采取以下步骤来设置队列

我在服务器上运行这个 rake 来设置队列:

namespace :rabbitmq do
    desc 'Setup routing'
    task :setup_test_commands_queue do
      require 'bunny'

      conn = Bunny.new(ENV['SYNC_AMQP'], read_timeout: 10, heartbeat: 10)
      conn.start

      ch = conn.create_channel

      # get or create exchange
      x = ch.direct('testsync.pcc', :durable => true)

      # get or create queue (note the durable setting)
      queue = ch.queue('test.commands', :durable => true, :ack => true, :routing_key => 'test_cmd')

      # bind queue to exchange
      queue.bind(x, :routing_key => 'test_cmd')

      conn.close
    end
  end

我可以在 rabbitmq 管理插件中看到这个队列,并提到了绑定。

class TestPublisher
  def self.publish(test)
    x = channel.direct("testsync.pcc", :durable => true)
    puts "publishing this = #{Test}"
    x.publish(Test, :persistent => true, :routing_key => 'pcc_cmd')
  end

  def self.channel
    @channel ||= connection.create_channel
  end

  def self.connection
    @conn = Bunny.new(ENV['RABBITMQ_BIGWIG_TX_URL'], read_timeout: 10, heartbeat: 10) # getting configuration from rabbitmq.yml
    @conn.start
  end
end

我正在调用 TestPublisher.publish() 来发布消息。

我有这样的运动鞋工人:

require 'test_sync'
class TestsWorker
  include Sneakers::Worker
  from_queue "test.commands", env: nil

  def work(raw_event)
    puts "^"*100
    puts raw_event
    # o = CaseNote.create!(content: raw_event, creator_id: 1)
    # puts "#########{o}"
    test = Oj.load raw_event
    test.execute
    # event_params = JSON.parse(raw_event)
    # SomeWiseService.build.call(event_params)
    ack!
  end
end

我的档案

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker:  bundle exec rake jobs:work
sneaker: WORKERS=TestsWorker bundle exec rake sneakers:run

我的文件

require File.expand_path('../config/application', __FILE__)
require 'rake/dsl_definition'
require 'rake'
require 'sneakers/tasks'

Test::Application.load_tasks

我的运动鞋配置

require 'sneakers'
Sneakers.configure  amqp: ENV['RABBITMQ_BIGWIG_RX_URL'],
                    log: "log/sneakers.log",
                    threads: 1,
                    workers: 1

puts "configuring sneaker"

我确信该消息会被发布。我能够收到有关 rabbitmq 管理插件的消息。但是运动鞋不起作用。在sneakers.log 中没有任何帮助。

在heroku上的sneakers.log:

# Logfile created on 2016-04-05 14:40:59 +0530 by logger.rb/41212
4

1 回答 1

2

很抱歉这么晚的回复。我能够在heroku上完成这项工作。经过数小时的调试后,当我遇到此错误时,我无法修复它。所以我重写了上面所有的代码,我没有检查我之前的代码有什么问题。

此代码和正确代码的唯一问题是队列绑定。

我在同一个交易所有两个队列。pcc.commands带有路由键pcc_cmdtest.commands路由键test_cmd

我正在使用,test_cmd但按照以下行TestPublisher

x.publish(Test, :persistent => true, :routing_key => 'pcc_cmd')

我正在发布到不同的队列(pcc.commands)。因此我无法收到test.commands队列中的消息。

TestWorker

from_queue "test.commands", env: nil

这表明仅从test.commands队列中获取消息。

关于sneakers.log文件: 上面的设置无法让我登录sneakers.log文件。是的,此设置适用于您的本地开发机器,但不适用于 heroku。现在要调试此类问题,我会log从配置中省略属性。像这样:

require 'sneakers'
Sneakers.configure  amqp: ENV['RABBITMQ_BIGWIG_RX_URL'],
                  # log: "log/sneakers.log",
                  threads: 1,
                  workers: 1

这样,您将在 heroku 日志中获得运动鞋日志(甚至心跳日志),可以通过运行命令查看heroku logs -a app_name --tail

于 2017-01-25T09:11:40.773 回答