2016-04-03 14 views
2

Ich verwende Hase, um die rabbitmq-Warteschlange einzurichten.rabbitmq löscht die Warteschlangenbindung nach dem Neustart des Servers.

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', :persistent => true) 

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

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

    conn.close 
    end 
end 

Der obige Code erstellt eine Warteschlange und bindet einen Routingschlüssel "test_cmd". Wenn ich den rabbitmq-Server neu starte, bleibt die Warteschlange bestehen, aber die Warteschlangenbindung wird gelöscht.

Ich verwende sudo invoke-rc.d rabbitmq-server restart Befehl, um Rabbitmq neu zu starten.

Kaninchen mq Version: RabbitMQ 3.2.4, Erlang R16B03.

Ist das Standardverhalten von rabbitmq? Wie kann ich meine Warteschlangenbindung beibehalten?

+0

Sind Sie sicher, dass der Exchange, an den Sie die Warteschlange binden, persistent ist? Die Warteschlange auch? Mit Blick auf den Code scheint es so, aber könnten Sie überprüfen, zum Beispiel mit Web-Ui? – cantSleepNow

+0

@cantSleepNow Ich habe das überprüft. Warteschlange ist hartnäckig, aber Austausch ist nicht. Jedes Mal, wenn ich den Server neu starte, wird Exchange gelöscht. Ich denke, mit dieser Zeile stimmt etwas nicht: 'x = ch.direct ('testsync.pcc',: persistent => true)' – dnsh

+0

Das ist ... Es sollte 'x = ch.direct ('testsync.pcc ',: haltbar => wahr) '. Der Hase ignoriert den Parameter ** persistent **. Es sollte ** haltbar ** sein. – dnsh

Antwort

1

Die Warteschlange wurde beibehalten, aber der Austausch war nicht. Es gab ein Problem mit dieser Codezeile.

x = ch.direct('testsync.pcc', :persistent => true) 

Hase nicht versteht Parameter persistent. Ich hätte dauerhafte Parameter übergeben werden sollen. So:

x = ch.direct('testsync.pcc', :durable => true) 

Jetzt funktioniert alles einwandfrei. Auch nach dem Neustart von rabbitmq bleibt die Bindung bestehen.