Search code examples
rubyrabbitmqamqpbunny

rabbitmq deletes queue binding after server restart


I am using bunny to setup rabbitmq queue.

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

Above code creates queue and binds a routing key 'test_cmd'. When I restart the rabbitmq server, the queue persists, but queue binding gets deleted.

I am using sudo invoke-rc.d rabbitmq-server restart command to restart rabbitmq.

Rabbit mq version : RabbitMQ 3.2.4, Erlang R16B03.

Is this default behaviour of rabbitmq? How can I persist my queue binding?


Solution

  • The queue was persisted but exchange was not. There was problem with this line of code.

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

    Bunny does not understand parameter persistent. I should have passed durable parameter. Like this :

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

    Now everything works fine. Even after rabbitmq restart binding is persisted.