Define a GenServer
with a handle_info
callback function:
defmodule Echo do
use GenServer
def start_link(reply_to) do
GenServer.start_link(__MODULE__, reply_to)
end
@impl GenServer
def init(reply_to) do
{:ok, reply_to}
end
@impl GenServer
def handle_info(:ping, reply_to) do
send(reply_to, :pong)
{:noreply, reply_to}
end
end
Start the process and send it an expected message:
{:ok, pid} = Echo.start_link(self())
send(pid, :ping)
flush()
Sending an unexpected message will crash the GenServer
process.
iex> send(pid, :unexpected)
iex> 15:50:36.859 [error] GenServer #PID<0.133.0> terminating
** (FunctionClauseError) no function clause matching in Echo.handle_info/2
iex:14: Echo.handle_info(:unexpected, #PID<0.108.0>)
(stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:711: :gen_server.handle_msg/6
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: :unexpected
State: #PID<0.108.0>
** (EXIT from #PID<0.108.0>) shell process exited with reason: an exception was raised:
** (FunctionClauseError) no function clause matching in Echo.handle_info/2
iex:14: Echo.handle_info(:unexpected, #PID<0.108.0>)
(stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:711: :gen_server.handle_msg/6
(stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3