Rabbit

Build Status StatBuffer Version

Rabbit is a set of tools for building applications with RabbitMQ.

Installation

The package can be installed by adding rabbit to your list of dependencies in mix.exs:

def deps do
  [
    {:rabbit, "~> 0.2"}
  ]
end

Documentation

Please see HexDocs for additional documentation.

Connections

Create a connection module:

defmodule MyConnection do
  use Rabbit.Connection

  # Callbacks

  # Perform runtime config
  def init(opts) do
    uri = System.get_env("RABBITMQ_URI") || "amqp://guest:guest@127.0.0.1:5672"
    opts = Keyword.put(opts, :uri, uri)

    {:ok, opts}
  end
end

MyConnection.start_link()

Consumers

Create a consumer module:

defmodule MyConsumer do
  use Rabbit.Consumer

  # Callbacks

  # Perform runtime config
  def init(opts) do
    {:ok, opts}
  end

  # Perform any exchange or queue setup
  def after_connect(channel, queue) do
    AMQP.Queue.declare(channel, queue)
    :ok
  end

  # Handle message consumption
  def handle_message(message) do
    IO.inspect(message.payload)
    {:ack, message}
  end

  # Handle message errors
  def handle_error(message) do
    {:nack, message}
  end
end

MyConsumer.start_link(MyConnection, queue: "my_queue", prefetch_count: 10)

Or, create a consumer supervisor:

defmodule MyConsumers do
  use Rabbit.ConsumerSupervisor

  # Callbacks

  # Specifiy a list of consumers under the supervisor
  def consumers do
    [
      [queue: "my_queue", prefetch_count: 10],
      [queue: "my_other_queue", prefetch_count: 10]
    ]
  end

  # Perform runtime config per consumer
  def init(opts) do
    {:ok, opts}
  end

  # Perform any exchange or queue setup per consumer
  def after_connect(channel, queue) do
    AMQP.Queue.declare(channel, queue)
    :ok
  end

  # Handle message consumption per consumer
  def handle_message(message) do
    IO.inspect(message.payload)
    {:ack, message}
  end

  # Handle message errors per consumer
  def handle_error(message) do
    {:nack, message}
  end
end

MyConsumers.start_link(MyConnection)

Producers

Create a producer module:

defmodule MyProducer do
  use Rabbit.Producer

  # Callbacks

  # Perform runtime config
  def init(opts) do
    {:ok, opts}
  end
end

MyProducer.start_link(MyConnection)
MyProducer.publish("", "my_queue", "hello")