README.md

# X3m.Rabbit

Wrapper around RabbitMQ. Rest of the documentation is TBD.

##  Configuration examples


    [
      {:publisher, MyApp.Rabbit.ExchangePublisher, [
         {:exchange, %{
                        name:    "exchange_name",
                        type:    :topic,
                        options: [durable: true]
                      }}
      ]},
      {:publisher, MyApp.Rabbit.QueuePublisher, [
         {:queue,    %{
                        name:    "queue_name_to_publish",
                        options: [
                                   durable:   true,
                                   arguments: [{"x-dead-letter-exchange",    :longstr, "dead"}, 
                                               {"x-dead-letter-routing-key", :longstr, "dead.my_app.queue_name_to_publish"}]
                                 ]
                      }}
      ]},
      {:listener, MyApp.Rabbit.SomeQueueListener, %{
         event_processor: MyApp.SomeQueueProcessor,
         exchange: %{
           name:    "exchange_name",
           type:    :topic,
           options: [durable: true]
         },
         queue: %{
           name:         "some_queue_listener",
           qos_opts:     [prefetch_count: 100],
           declare_opts: [
             exclusive: false, 
             durable: true, 
             arguments: [
               {"x-dead-letter-exchange", :longstr, "dead"}, 
               {"x-dead-letter-routing-key", :longstr, "dead.my_app.some_queue_listener"}
             ]
           ],
           bind_opts: [routing_key: "#"],
         }
      }}
    ]

Minimal required configuration (when exchanges and queues are declared somewhere else) is:

    [
      {:publisher, MyApp.RabbitPublisher, [
         {:exchange, %{ name: "exchange_name" }},
         {:queue,    %{ name: "queue_name_to_publish" }}
      ]},
      {:listener,  MyApp.Rabbit.SomeQueueListener, %{
         event_processor: MyApp.SomeQueueProcessor,
         exchange:        %{ name: "exchange_name" },
         queue:           %{ name: "some_queue_listener" }
      }}
    ]

When listener receives message it calls `event_processor.process(route, payload, [redelivered?: redelivered?]=options)`
function. If it returns `:ok`, messages is acked. On `{:error, :discard_message}` message is nacked. On anything else
message is returned for redelivery.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `x3m_rabbit` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:x3m_rabbit, "~> 0.1.0"}
  ]
end
```