defmodule Que do
use Application
@moduledoc """
`Que` is a simple background job processing library backed by `Mnesia`.
Que doesn't depend on any external services like Redis for persisting job
state, instead uses the built-in erlang application
[`mnesia`](http://erlang.org/doc/man/mnesia.html). This makes it extremely
easy to use as you don't need to install anything other than Que itself.
## Installation
First add it as a dependency in your `mix.exs` and run `mix deps.get`:
```
defp deps do
[{:que, "~> #{Que.Mixfile.project[:version]}"}]
end
```
Then run `$ mix deps.get` and add it to your list of applications:
```
def application do
[applications: [:que]]
end
```
## Usage
Define a [`Worker`](Que.Worker.html) to process your jobs:
```
defmodule App.Workers.ImageConverter do
use Que.Worker
def perform(image) do
ImageTool.save_resized_copy!(image, :thumbnail)
ImageTool.save_resized_copy!(image, :medium)
ImageTool.save_resized_copy!(image, :large)
end
end
```
You can now add jobs to be processed by the worker:
```
Que.add(App.Workers.ImageConverter, some_image)
#=> :ok
```
Read the `Que.Worker` documentation for other callbacks and
concurrency options.
## Persist to Disk
By default, `Que` uses an in-memory `Mnesia` database so jobs are NOT
persisted across application restarts. To do that, you first need to
specify a path for your mnesia database in you `config.exs`.
```
config :mnesia, dir: 'mnesia/\#{Mix.env}/\#{node()}'
# Notice the single quotes
```
You can now call the `que.setup` mix task to create the job database:
```bash
$ mix que.setup
```
For compiled releases, see the `Que.Persistence.Mnesia` documentation.
"""
@doc """
Starts the Que Application (and its Supervision Tree)
"""
def start(_type, _args) do
Que.Helpers.log("Booting Que", :low)
Que.Supervisor.start_link
end
@doc """
Enqueues a Job to be processed by Que.
Accepts the worker module name and a term to be passed to
the worker as arguments.
## Example
```
Que.add(App.Workers.FileDownloader, {"http://example.com/file/path.zip", "/some/local/path.zip"})
#=> :ok
Que.add(App.Workers.SignupMailer, to: "some@email.com", message: "Thank you for Signing up!")
#=> :ok
```
"""
@spec add(worker :: module, arguments :: term) :: {:ok, %Que.Job{}}
defdelegate add(worker, arguments), to: Que.ServerSupervisor
end