Si ma méthode de GenStage handle_demand/2
ressemble à ceci:GenStage: nouvelle tentative handle_demand lorsque les mises à jour GenServer
def handle_demand(demand, _state) when demand > 0 do
case Queue.dequeue do
nil ->
Logger.debug("Queue empty.")
{:noreply, [], []}
{job, updated_queue} -> {:noreply, job, updated_queue}
end
end
Comment puis-je obtenir à « reprise » quand mon Queue
(un GenServer) est modifié/mis à jour?
Mon module file d'attente ressemble à ceci:
defmodule Queue do
use GenServer
### client
def start_link(state \\ []) do
GenServer.start_link(__MODULE__, state, name: __MODULE__)
end
def queue, do: GenServer.call(__MODULE__, :queue)
def enqueue(value), do: GenServer.cast(__MODULE__, {:enqueue, value})
def dequeue, do: GenServer.call(__MODULE__, :dequeue)
### server
def init(state), do: {:ok, state}
def handle_call(:dequeue, _from, [value | state]) do
{:reply, value, state}
end
def handle_call(:dequeue, _from, []), do: {:reply, nil, []}
def handle_call(:queue, _from, state), do: {:reply, state, state}
def handle_cast({:enqueue, value}, state) do
{:noreply, state ++ [value]}
end
end