2017-09-28 8 views
0

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 

Répondre

1

Pourquoi voudriez-vous « rerun » quand Queue changements? Ceci est une utilisation abusive drastique de GenStage. Il a été inventé pour permettre une lutte contre-pression, qui vient de Queue, et non vice versa. Dans la vraie vie, soit vous n'avez pas besoin GenStage du tout, ou vous ne voulez pas à la demande « réexécutée » quand Queue est mise à jour, car il va tuer tôt ou tard par les délais d'attente/messagebox.

Vous avez probablement un peu « consommateur » d'appeler handle_demand lorsqu'il gère la charge précédente de la file d'attente. repo de GenStage a four incredibly clear examples à l'aide de différents modèles pour travailler avec GenStage. En outre, il y a une grande introduction à GenStage dans Elixir blog.

Il suffit de choisir le modèle dont vous avez besoin et adopter des sources liées ci-dessus.