astery
How to stop gen_server by timeout?
Ideally I want to create a gen_server and stop it after some timeout after inactivity (not receiving messages).
With simple process I can achieve that with this:
def MyProcess do
def new do
spawn fn -> init() end
end
def init do
state = %State{}
loop(state)
end
def loop(state) do
receive do
some_stuff ->
# some stuff going here
loop(state)
after
@timeout ->
exit(:normal)
end
end
end
How to do the same with gen_server?
Marked As Solved
rcavanaugh
If I’m reading this properly, there’s actually something built into GenServer for this too.
defmodule Timesout do
@timeout 1000
use GenServer
require Logger
def start_link do
GenServer.start_link(__MODULE__, [])
end
def init(_) do
Logger.info "starting up with timeout #{@timeout}"
{:ok, [], @timeout}
end
def handle_call({:add, a, b}, _, _) do
Logger.info "adding and resetting timer"
{:reply, a + b, [], @timeout}
end
def handle_info(:timeout, _) do
Logger.info "shutting down"
{:stop, :normal, []}
end
end
{:ok, p} = Timesout.start_link
Process.sleep(900)
IO.inspect GenServer.call(p, {:add, 10, 20})
Process.sleep(1100)
IO.inspect GenServer.call(p, {:add, 20, 50})
This results in:
> elixir timesout.exs 2646ms Wed Sep 21 10:42:38 2016
10:43:37.778 [info] starting up with timeout 1000
10:43:38.685 [info] adding and resetting timer
30
10:43:39.688 [info] shutting down
** (exit) exited in: GenServer.call(#PID<0.76.0>, {:add, 20, 50}, 5000)
** (EXIT) no process
(elixir) lib/gen_server.ex:604: GenServer.call/3
timesout.exs:38: (file)
(elixir) lib/code.ex:363: Code.require_file/2
7
Also Liked
benwilson512
Author of Craft GraphQL APIs in Elixir with Absinthe
Create a timer when you start the genserver. In all of your message callbacks bump the timer. If you ever receive a message from the timer, quit.
1
astery
I was the one who read it badly, thank you it helps.
1
Popular in Questions
Hi! May someone helps me, please!
I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Hello, I have map which I want to convert it to string like this:
the map:
%{last_name: "tavakkoli", name: "shahryar"}
the string I ne...
New
Hi all,
I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage.
I'm trying to use Postg...
New
Hi all
I want to have a unix time, from the current time plus 1 hour.
DateTime.now + 1 hour
How to get it in elixir?
Thanks
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
Other popular topics
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
Credo is smart enough to check for (something like) this:
assert length(the_list) == 0
with this response:
Checking if an enum is empt...
New
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
Hi,
I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: )
Hello all, this is ...
New







