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
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
In Ruby, I can go:
User.find_by(email: "foobar@email.com").update(email: "hello@email.com")
How can I do something similar in Elixir?
...
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New
Hey all,
I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
In templates/appointment/index.html.eex:
<%= for appointment <- @appointments do %>
<tr>
<td><%= appoi...
New
Hi guys, i’m new in the Elixir world, and i have to say, that i love it!
i’m having some problem to understand anonymous functions with ...
New
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 t...
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
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
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 records...
New
Other popular topics
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
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
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
What learn first? Rust or Elixir
Hi Elixir community!
I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
Hello guys,
I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
Hello everybody,
usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
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’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
Hi everyone,
I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
Hi everyone!
I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








