1
votes

I have an example of genstage application, and in its consumers I need to use a connection with redis. And I do not understand how I need to pass this connection to handle_events.

If I write:

  defp connection do
    {:ok, conn} = Redix.start_link(host: "0.0.0.0", port: 6379)
    conn
  end

Then every time the connection is called inside the handle_events function, it will create a new connection.

how can I solve this problem?

1

1 Answers

0
votes

You can keep the conn in the state of the GenStage consumer (just like you would to in a GenServer, something like this:

defmodule C do
  use GenStage

  def start_link() do
    GenStage.start_link(C, :ok)
  end

  def init(:ok) do
    {:ok, conn} = Redis.start_link(...)
    {:consumer, conn}
  end

  def handle_events(events, _from, conn) do
    Redix.command!(conn, ...)

    {:noreply, [], conn}
  end
end

Here I'm creating the connection when the consumer is created. You can also create the connection higher up and pass it down to this if you want, like this:

defmodule C do
  use GenStage

  def start_link(conn) do
    GenStage.start_link(C, conn)
  end

  def init(conn) do
    {:consumer, conn}
  end

  def handle_events(events, _from, conn) do
    Redix.command!(conn, ...)

    {:noreply, [], conn}
  end
end