Giter VIP home page Giter VIP logo

rak's Introduction

Rak

TODO: Add description

Installation

If available in Hex, the package can be installed by adding rak to your list of dependencies in mix.exs:

def deps do
  [
    {:rak, "~> 0.1.0"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/rak.

Mnesia Setup

config :mnesia,
  dir: 'mnesia/#{Mix.env()}/#{node()}'

Run the following mix task to create the Mnesia schema and required databases:

$ mix rak.setup

Usage

defmodule MyApp.Worker do
  use Rak.Worker

  def perform(arg) do
    # do something
  end
end

Enqueue a job to be processed by the worker:

iex> Rak.enqueue(MyApp.Worker, :hello)
%Rak.Job{...}

Concurrency

defmodule MyApp.Worker do
  use Rak.Worker, concurrency: 5

  def perform(data) do
    MyApp.Service.perform(data)
  end
end

Max Retries

defmodule MyApp.Worker do
  use Rak.Worker, max_retries: 3

  def perform do
    raise "failed"
  end
end

Failing job retries 3 times:

iex> job = Rak.enqueue(MyApp.Worker)
iex> ... delay determined by retry strategy
iex> job in Rak.jobs(:failed)
true

Callbacks

defmodule MyApp.Worker do
  use Rak.Worker

  def perform do
    # do something
  end

  def on_completed(%Rak.Job{} = job) do
    # do something when job is completed
    :ok
  end

  def on_failed(%Rak.Job{} = job, reason, stacktrace) do
    # do something when job failed
    :ok
  end
end

Global Events

defmodule MyApp.EventHandler do
  use GenServer

  def start_link(opts \\ []) do
    GenServer.start_link(__MODULE__, opts)
  end

  def init(state) do
    :ok = Rak.subscribe()
    {:ok, state}
  end

  def handle_info({:completed, %Rak.Job{} = job}, state) do
    IO.inspect(job, label: "received `completed` event")
    {:noreply, state}
  end

  def handle_info({:failed, %Rak.Job{} = job}, state) do
    IO.inspect(job, label: "received `failed` event")
    {:noreply, state}
  end
end

Listen for events:

iex> {:ok, pid} = MyApp.EventHandler.start_link()

iex> Rak.enqueue(MyApp.Worker, :ok)
%Rak.Job{...}
... job processed
received `completed` event: %Rak.Job{...}

iex> Rak.enqueue(MyApp.Worker, :error)
%Rak.Job{...}
... job processed
received `failed` event: %Rak.Job{...}

rak's People

Contributors

l1h3r avatar

Stargazers

 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.