shijith.k
Genserver timeout error on :no_reply response
I have GenServer setup in a module. One of the handle_call/3 returns {:no_reply, state}. Every time after executing the call a timeout error raises. Can someone tell me what I am doing wrong here? This is the first time I am trying GenServer.
My code looks like this:
defmodule TestApp.Message do
alias TestApp.Message
use GenServer
import Logger
def init(args) do
{:ok, args}
end
def start_link(_) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def handle_call({%{"message" => message}, state}, _sender, _current_state) do
info("message")
{:noreply, state}
end
end
This is the error message:
{:timeout, {GenServer, :call, [MyApp.Message, {%{"message" => message}, %{id: 1, sender: "user1}}, 5000]}}
Most Liked
kokolegorille
You need to use handle_cast in this case…
rvirding
Yes, one way is to use GenServer.cast/handle_cast. One problem with that is that is gives no guarantees of the destination being there or the message arriving as it literally uses :erlang.send internally. For more safety you could use GenServer.call/handle_call and return the reply :ok. NB that this is doing a synchronous call with all that it costs but you will at least be certain the message has arrived and has been processed.
It’s all a matter of deciding what you need/want and are willing to pay for it. TANSTAAFL
rvirding
The {:noreply, state} return value tells the behaviour not to send a reply to the GenServer.call. As it has built-in timeout of 5 seconds (which can be changed) then it will timeout when a reply does not arrive within that time. You need to explicitly send back a reply by returning {:reply, reply, state}.







