RMQ - RabbitMQ tools.

Actions Status Hex version badge

A set of handy tools for working with RabbitMQ in Elixir projects. Based on amqp elixir client.

Installation

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

def deps do
  [
    {:rmq, "~> 0.1.0-beta.0"}
  ]
end

RMQ.Connection

A GenServer which opens and holds a connection to RabbitMQ broker.

Usage

defmodule MyApp.RabbitConnection do
  use RMQ.Connection,
    otp_app: :my_app,
    uri: "amqp://localhost",
    connection_name: to_string(__MODULE__)
end

Meant to be started under the application's supervision tree as follows:

defmodule MyApp.Application do
  use Application

  def start(_type, _args) do
    children = [
      MyApp.RabbitConnection
      # ...
    ]

    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

Options

  • :uri - AMQP URI (defaults to "amqp://localhost");
  • :connection_name - RabbitMQ connection name (defaults to :undefined);
  • :reconnect_interval - Reconnect interval (defaults to 5000);
  • options for AMQP.Connection.open/3.

Options passed to start_link/1 will be merged into options from the config.

RMQ.RPC

RPC via RabbitMQ.

Usage

defmodule MyApp.RemoteResource do
  use RMQ.RPC,
    connection: MyApp.RabbitConnection,
    publishing_options: [app_id: "MyApp"]

  def find_by_id(id) do
    call("remote-resource-finder", %{id: id}, [message_id: "msg-123"])
  end

  def list_all() do
    call("remote-resource-list-all", %{})
  end
end

Options

  • :connection - the connection module which implements RMQ.Connection behaviour;
  • :exchange - the name of the exchange to which RPC consuming queue is bound. Please make sure the exchange exist. Defaults to "".
  • :timeout - default timeout for call/4 Defaults to 5000.
  • :consumer_tag - consumer tag for the callback queue. Defaults to a current module name;
  • :restart_delay - restart delay. Defaults to 5000;
  • :publishing_options - options for AMQP.Basic.publish/5 except :reply_to, :correlation_id, :content_type - these will be set automatically and cannot be overridden. Defaults to [].

RMQ.Consumer

RabbitMQ Consumer.

Usage

defmodule MyApp.Consumer do
  use RMQ.Consumer,
    connection: MyApp.RabbitConnection,
    queue: "my-app-consumer-queue"

  @impl RMQ.Consumer
  def process(message, %{content_type: "application/json"}), do: Jason.decode!(message)
  def process(message, _meta), do: message
  
  @impl RMQ.Consumer
  def consume(chan, payload, meta) do
    # handle message here
    ack(chan, meta.delivery_tag)
  end
end

Options

  • :connection - the connection module which implements RMQ.Connection behaviour;
  • :queue - the name of the queue to consume. Will be created if does not exist;
  • :exchange - the name of the exchange to which queue should be bound. Also accepts two-element tuple {type, name}. Defaults to "";
  • :routing_key - queue binding key. Defaults to queue; Will be created if does not exist. Defaults to "";
  • :dead_letter - defines if the consumer should setup deadletter exchange and queue. Defaults to true;
  • :dead_letter_queue - the name of dead letter queue. Defaults to "#{queue}_error";
  • :dead_letter_exchange - the name of the exchange to which dead_letter_queue should be bound. Also accepts two-element tuple {type, name}. Defaults to "#{exchange}.dead-letter";
  • :dead_letter_routing_key - routing key for dead letter messages. Defaults to queue;
  • :concurrency - defines if consume/3 callback will be called in a separate process using Task.start/1. Defaults to true;
  • :prefetch_count - sets the message prefetch count. Defaults to 10;
  • :consumer_tag - consumer tag. Defaults to a current module name;
  • :restart_delay - restart delay. Defaults to 5000.