shijith.k

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]}}

First 5 of 5 Posts Switch mode

rvirding

rvirding

Creator of Erlang

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}.

shijith.k

shijith.k OP

I am planning to set up a connection with an iOT device, which does not expect a reply there. In such cases what can I do?

kokolegorille

kokolegorille

You need to use handle_cast in this case…

rvirding

rvirding

Creator of Erlang

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

lucaong

lucaong

In other words, when you use handle_call, your caller (the process that calls GenServer.call) expects a reply. One can return {:noreply, state} from handle_call, but only if the reply is computed asynchronously and then sent later with GenServer.reply.

As @rvirding and @kokolegorille wrote, you have two options:

  • Return a simple reply like {:reply, :ok, state}. This ensures that GenServer.call will return :ok only after the operation that you perform in the GenServer completes. This is, generally, the best way, as it ensures that whatever you wanted to execute actually does execute.

  • Alternatively, if you really don’t care about the answer, and also you don’t need to guarantee that the GenServer actually performed the operation, you can use GenServer.cast and handle_cast.

— All posts loaded —

Where Next?

Trending in Questions Top

jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
silverdr
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated! To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead. Sta...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
michallepicki
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New

We're in Beta

About us Mission Statement