Created
May 16, 2022 06:51
-
-
Save avinayak/de48c2195e1c7971fdca230a254c6fec to your computer and use it in GitHub Desktop.
A interval cron thing in genserver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Cron do | |
use GenServer | |
@name __MODULE__ | |
def start_link(initial_map) do | |
GenServer.start_link(__MODULE__, initial_map, name: @name) | |
end | |
def add_job(key, job, interval) do | |
GenServer.cast(@name, {:add_job, {key, job, interval}}) | |
end | |
def remove_job(key) do | |
GenServer.cast(@name, {:remove_job, {key}}) | |
end | |
def init(initial_map) do | |
{:ok, initial_map} | |
end | |
def handle_cast({:add_job, {key, job, interval}}, queue) do | |
Process.send_after(@name, {:execute, key}, interval) | |
{:noreply, Map.put(queue, key, {job, interval})} | |
end | |
def handle_cast({:remove_job, {job_key}}, queue) do | |
{:noreply, Map.delete(queue, job_key)} | |
end | |
def handle_info({:execute, key}, queue) do | |
case Map.get(queue, key) do | |
{job, interval} -> | |
job.() | |
Process.send_after(@name, {:execute, key}, interval) | |
_ -> | |
:noop | |
end | |
{:noreply, queue} | |
end | |
end | |
Cron.start_link(%{}) | |
Cron.add_job("say hello", fn -> (IO.puts("Hello")) end, 1000) | |
Cron.add_job("say ohayo", fn -> (IO.puts("Ohayo Gozaimasu")) end, 4000) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment