View Source Getting Started

Intro

Rambla provides the ability to publish messages to several different destinations. Destinations are supported via handlers. The respective handler must be explicitly included into the list of extra applications of target application.

For each of the configured destinations, the pool of workers based on Finitomata.Pool is maintained. Each destination should be configured separately; the preferred way would be to use config.exs because the handlers themselves are included in the release based on this config. Additional configuration might be passed to the Rambla.start_link/1 call.

Configuration

The configuration is the keyword list with keys specifying handlers and their initialization properties. All the configs are based on the pattern provided by :amqp application.

Starting Pools

Embed Rambla into your supervision tree. The configured handlers will be started supervised.

Configuration Example

Rambla.Handlers.Amqp requires :amqp application to be configured and started, ditto for Rambla.Handlers.S3. Everything else is to be configured as shown below.

config :rambla,
  redis: [
    connections: [
      local_conn: [
        host: System.get_env("REDIS_HOST", "127.0.0.1"),
        port: String.to_integer(System.get_env("REDIS_PORT", "6379")),
        password: System.get_env("REDIS_PASSWORD", ""),
        database: 0
      ]
    ],
    channels: [chan_1: [connection: :local_conn]]
  ],
  httpc: [
    connections: [
      httpbin_success: [scheme: "https", host: "httpbin.org", path: "/post"],
      httpbin_error: [scheme: "https", host: "httpbin.org", path: "/status/500"]
    ],
    channels: [
      chan_1: [connection: :httpbin_success, options: [headers: [{"accept", "application/json"}]]],
      chan_2: [connection: :httpbin_error, options: [headers: [{"accept", "text/plain"}]]]
    ]
  ],

Publishing

Publishing to the destination is as easy, as calling Rambla.html#publish/3 passing the destination channel, the message and optional configuration parameters. The message will be published to all the configured handlers for this channel.

The following would publish the message to previously configured :channel_1 channel.

Rambla.publish(:chan_1, %{message: %{foo: 42, bar: :baz}, exchange: "barfoo"})

Testing

In :test environment, use Rambla.Handlers.Mock and Rambla.Handlers.Stub handlers to substitute actual destinations for the channels and additionally use Mox expectations with Mock handler to test the publishing.

config :rambla,
  mock: [
    connections: [mocked: :conn_mocked],
    channels: [chan_1: [connection: :mocked]]
  ],
  stub: [
    connections: [stubbed: :conn_stubbed],
    channels: [chan_2: [connection: :stubbed]]
  ]