Plug.AMQP (PlugAMQP v0.6.0) View Source
Adapter interface to the AMQP RPC pattern.
Plug.AMQP
provides an AMQP interface to Plug
.
When using Plug.AMQP
you can write servers that answer requests sent through
an AMQP broker, like RabbitMQ. The request
response pattern is explained in detail here.
Usage
To use Plug.AMQP
, add it to your supervision tree. Assuming that your Plug
module is named MyPlug
:
children = [
{Plug.AMQP, connection_options: "amqp://my-rabbit:5672", plug: MyPlug}
]
Supervisor.start_link(children, strategy: :one_for_one)
Check option/0
and Plug.AMQP.ConsumerProducer.option/0
for more
options.
Examples
The following example is taken from the
RabbitMQ RPC Tutorial
but using Plug.AMQP
.
# The Server
defmodule MyPlug do
@behaviour Plug
@impl true
def init(_opts), do: nil
@impl true
def call(conn, _opts) do
{:ok, body, conn} = Plug.Conn.read_body(conn)
input = String.to_integer(body)
output = fib(input)
resp_body = to_string(output)
Plug.Conn.send_resp(conn, 200, resp_body)
end
defp fib(0), do: 0
defp fib(1), do: 1
defp fib(n) when n > 1, do: fib(n - 1) + fib(n - 2)
end
# Setting Up the RPC Request Queue
{:ok, conn} = AMQP.Connection.open()
{:ok, chan} = AMQP.Channel.open(conn)
{:ok, _info} = AMQP.Queue.declare(chan, "rpc_queue")
# Starting the Server
{:ok, _adapter} = Plug.AMQP.start_link(consumer_queue: "rpc_queue", plug: MyPlug)
# Setting the Client
{:ok, %{queue: callback_queue}} = AMQP.Queue.declare(chan, "", exclusive: true)
{:ok, _ctag} = AMQP.Basic.consume(chan, callback_queue, nil, no_ack: true)
# Sending a Request
IO.puts("Sending a 30 as a request")
AMQP.Basic.publish(chan, "", "rpc_queue", "30", reply_to: callback_queue)
# Waiting a Response
receive do
{:basic_deliver, response, _meta} ->
IO.puts("Got a #{response} response")
end
Link to this section Summary
Functions
Returns a specification to start this module under a supervisor.
Link to this section Types
Specs
option() :: {:plug, module() | {module() | keyword()}} | Plug.AMQP.ConsumerProducer.option()
A Plug.AMQP
configuration option.
Plug.AMQP
supports any of Plug.AMQP.ConsumerProducer.option/0
. Also, the plug
option must be used to set the main plug of a server.
Specs
A list of option/0
s.
Link to this section Functions
Returns a specification to start this module under a supervisor.
See Supervisor
.