Packages

The library implements persistent queue for Elixir applications.

Current section

Files

Jump to
pers_queue lib pers_queue.ex
Raw

lib/pers_queue.ex

defmodule PersQueue do
use Application
@moduledoc """
`PersQueue` is persistent queue with `Mnesia` backend.
## Installation
1) Add `pers_queue` to your deps:
```elixir
def deps do
[
{:pers_queue, "~> 0.0.1"}
]
end
```
2) Add `pers_queue` to the list of application dependencies:
```elixir
def application do
[applications: [:pers_queue]]
end
```
## Persistent Setup
PersQueue runs out of the box, but by default all messages are stored in-memory.
To persist messages across application restarts, run the following mix task:
```bash
$ mix pers_queue.setup
```
This will create the Mnesia schema and message database for you.
## Usage
```elixir
# Add message:
PersQueue.add("consumer1", "a") # => :ok
PersQueue.add("consumer1", "b") # => :ok
# Get message:
PersQueue.get("consumer1") # => %PersQueue.Message{consumer: "consumer1", content: "a", id: 1}
PersQueue.get("consumer1") # => %PersQueue.Message{consumer: "consumer1", content: "b", id: 2}
# Ack message by message id:
PersQueue.ack("consumer1", 1) # => :ok
# Reject message by message id:
PersQueue.reject("consumer1", 2) # => :ok
```
"""
@doc """
Starts the PersQueue application
"""
def start(_type, _args) do
PersQueue.Supervisor.start_link()
end
@doc """
Enqueues a message to persistent queue.
Accepts the consumer name and message content.
## Example
```
PersQueue.add("consumer1", "a") # => :ok
PersQueue.add("consumer2", "b") # => :ok
```
"""
@spec add(consumer :: String.t(), message_content :: String.t()) :: :ok
defdelegate add(consumer, message_content), to: PersQueue.ServerSupervisor
@doc """
Gets a message from persistent queue.
Accepts the consumer name.
## Example
```
PersQueue.get("consumer1") # => %PersQueue.Message{consumer: "consumer1", content: "a", id: 1}
```
"""
@spec get(consumer :: String.t()) :: PersQueue.Message.t()
defdelegate get(consumer), to: PersQueue.ServerSupervisor
@doc """
Acks a message and deletes it from running list.
Accepts the consumer name and message id.
## Example
```
PersQueue.ack("consumer1", 1) # => :ok
```
"""
@spec ack(consumer :: String.t(), message_id :: pos_integer) :: :ok
defdelegate ack(consumer, message_id), to: PersQueue.ServerSupervisor
@doc """
Rejects a message and moves it to the end of persistent queue.
Accepts the consumer name and message id.
## Example
```
PersQueue.reject("consumer1", 1) # => :ok
```
"""
@spec reject(consumer :: String.t(), message_id :: pos_integer) :: :ok
defdelegate reject(consumer, message_id), to: PersQueue.ServerSupervisor
end