Skip to content

Instantly share code, notes, and snippets.

@avinayak
Created May 16, 2022 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avinayak/de48c2195e1c7971fdca230a254c6fec to your computer and use it in GitHub Desktop.
Save avinayak/de48c2195e1c7971fdca230a254c6fec to your computer and use it in GitHub Desktop.
A interval cron thing in genserver
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