# ConduitAMQP
An AMQP adapter for [Conduit](https://github.com/conduitframework/conduit).
## Installation
This package can be installed as:
1. Add `conduit_amqp` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:conduit_amqp, "~> 0.3.0"}]
end
```
2. Ensure `conduit_amqp` is started before your application:
```elixir
def application do
[applications: [:conduit_amqp]]
end
```
## Configuring the Adapter
```elixir
# config/config.exs
config :my_app, MyApp.Broker,
adapter: ConduitAMQP,
url: "amqp://my_app:secret@my-rabbit-host.com"
# Stop lager redirecting :error_logger messages
config :lager, :error_logger_redirect, false
# Stop lager removing Logger's :error_logger handler
config :lager, :error_logger_whitelist, [Logger.ErrorHandler]
```
For the full set of options, see `ConduitAQMP`.
## Configuring Exchanges
You can define exchanges with the `exchange` macro in the
`configure` block of your Broker. The `exchange` macro accepts
the name of the exchange and options for the exchange.
### Options
* `:type`: Either `:topic`, `:fanout`, `:direct`, or `:headers`. Defaults to `:topic`.
* `:durable`: If set, keeps the Exchange between restarts of the broker. Defaults to `false`.
* `:auto_delete`: If set, deletes the Exchange once all queues unbind from it. Defaults to `false`.
* `:passive`: If set, returns an error if the Exchange does not already exist. Defaults to `false`.
* `:internal:` If set, the exchange may not be used directly by publishers. Defaults to `false`.
### Example
```elixir
defmodule MyApp.Broker do
use Conduit.Broker, otp_app: :my_app
configure do
exchange "my.topic", type: "topic", durable: true
end
end
```
## Configuring Queues
You can define queues with the `queue` macro in the
`configure` block of your Broker. The `queue` macro accepts
the name of the queue and options for the exchange.
### Options
* `:durable` - If set, keeps the Queue between restarts of the broker. Defaults to `false`.
* `:auto-delete` - If set, deletes the Queue once all subscribers disconnect. Defaults to `false`.
* `:exclusive` - If set, only one subscriber can consume from the Queue. Defaults to `false`.
* `:passive` - If set, raises an error unless the queue already exists. Defaults to `false`.
* `:from` - A list of routing keys to bind the queue to.
* `:exchange` - Name of the exchange used to bind the queue to the routing keys.
### Example
```elixir
defmodule MyApp.Broker do
use Conduit.Broker, otp_app: :my_app
configure do
queue "my.queue", from: ["#.created.user"], exchange: "amq.topic", durable: true
end
end
```
## Publishing Messages
TODO
## Special Headers
TODO
## Architecture

When ConduitAMQP is used as an adapter for Conduit, it starts ConduitAMQP as a child supervisor. ConduitAMQP starts:
1. ConduitAQMP.ConnPool - Creates and supervises a pool of AMQP connections.
2. ConduitAMQP.PubSub - Creates and supervises ConduitAMQP.PubPool and ConduitAMQP.SubPool.
3. ConduitAMQP.Subscribers - A supervisor for subscribers that process messages.