astery

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

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

Also Liked

benwilson512

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.

astery

astery

I was the one who read it badly, thank you it helps.

Where Next?

Popular in Questions Top

chokchit
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
sergio
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
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
ovidiubadita
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
Lily
In templates/appointment/index.html.eex: &lt;%= for appointment &lt;- @appointments do %&gt; &lt;tr&gt; &lt;td&gt;&lt;%= appoi...
New
baxterw3b
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
srinivasu
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
ashish173
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
dotdotdotPaul
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
joaquinalcerro
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 Top

vertexbuffer
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
electic
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
shahryarjb
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
AngeloChecked
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
aesmail
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
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
ashish173
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
nsuchy
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
komlanvi
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
lanycrost
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

We're in Beta

About us Mission Statement