extreme_system v0.2.0 Extreme.System.RabbitMQ.Supervisor
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.Rabbit.ExchangePublisher, [
{:exchange, %{ name: "exchange_name" }}
]},
{:publisher, MyApp.Rabbit.QueuePublisher, [
{: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.