2016-04-05 11 views
4

Ich versuche Message Queues auf Heroku auszuführen. Dazu verwende ich RabbitMQ Bigwig Plugin.Sneaker empfängt keine Nachrichten auf Heroku - RabbitMQ Bigwig

Ich veröffentliche Nachrichten mit Hase Edelstein und versuche, Nachrichten mit Turnschuhen Edelstein zu erhalten. Das ganze Setup funktioniert reibungslos auf dem lokalen Rechner.

Ich nehme folgende Schritte zum Einrichten Warteschlange

ich diesen Rake auf Server einrichten Warteschlange auszuführen:

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 

Ich bin in der Lage diese Warteschlange in rabbitmq Management-Plugin mit erwähnten Bindung zu sehen.

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 

Ich rufe TestPublisher.publish() Nachricht zu veröffentlichen.

Ich habe Sneaker Arbeiter wie folgt aus:

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 

Mein procfile

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

Mein Rakefile

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

Test::Application.load_tasks 

Meine sneaker Konfiguration

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

puts "configuring sneaker" 

Ich bin sicher, dass die Nachricht veröffentlicht wird. Ich bin in der Lage, eine Nachricht auf Rabbitmq-Management-Plugin zu bekommen. Aber Sneaker funktioniert nicht. Es gibt nichts in sneakers.log, das helfen kann.

sneakers.log auf Heroku:

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

Konnten Sie das beheben? Eine dumme Sache: hast du einen Dyno Turnschuh-Prozess zugewiesen? Anders als das, können Sie 'puts 'konfigurieren Sneaker" 'vor der eigentlichen Konfigurationszeile setzen und sehen, ob es in den Protokollen angezeigt wird? Auch sollte nicht Ihr Login auf Heroku Informationen über Dyno enthalten, aus denen es stammt? – draganstankovic

+0

Dies könnte einige arme Seele in der Zukunft helfen. Ich habe etwas Ähnliches getan, aber auf 'cloud66' musste ich mein Procfile ändern: von' sneaker: WORKERS = TestsWorker bundle exec rake sneakers: run' zu 'sneaker: bundle exec rake sneakers: run WORKERS = TestsWorker' NOTE - the WORKERS env muss am Ende kommen – house9

Antwort

1

Sorry für diese späte Antwort. Ich konnte das an Heroku arbeiten lassen. Als ich nach stundenlangem Debugging mit diesem Fehler konfrontiert wurde, konnte ich ihn nicht beheben. Also schrieb ich den obigen Code um und ich habe nicht überprüft, was mit meinem vorherigen Code falsch war.

Das einzige Problem mit diesem Code und dem richtigen Code ist die Warteschlangenbindung.

Ich hatte zwei Warteschlangen am gleichen Exchange. pcc.commands mit Routing-Schlüssel pcc_cmd und test.commands mit Routing-Schlüssel test_cmd.

I arbeitete mit test_cmd aber gemäss folgende Zeile in TestPublisher

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

I wurde an verschiedene Warteschlangen Publishing (pcc.commands). Daher konnte ich die Nachricht unter test.commands Warteschlange nicht empfangen.

In TestWorker

from_queue "test.commands", env: nil 

Diese besagt, dass Nachrichten nur aus test.commands Warteschlange holen.

In Bezug auf sneakers.log Datei: Above Setup nicht in der Lage war, in sneakers.log Datei gibt mir Protokolle. Ja, dieses Setup funktioniert auf Ihrem lokalen Entwicklungscomputer, aber es funktionierte nicht auf Heroku. Jetzt Tage um dieses Problem zu debuggen ich log Attribut aus der Konfiguration. wie folgt aus:

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

Auf diese Weise können sneaker Protokolle (auch Herzschlag-Protokolle) in Heroku Protokolle, die durch Ausführen gesehen werden kann Befehl heroku logs -a app_name --tail bekommen.