40 lines
1.2 KiB
Elixir
40 lines
1.2 KiB
Elixir
defmodule Aprsme.PacketPipelineSetup do
|
|
@moduledoc """
|
|
Handles the setup of the GenStage pipeline subscription after the supervisor starts.
|
|
"""
|
|
use GenServer
|
|
|
|
def start_link(opts \\ []) do
|
|
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
|
|
end
|
|
|
|
@impl true
|
|
def init(_opts) do
|
|
# Wait a moment for the pipeline to start, then set up the subscription
|
|
Process.send_after(self(), :setup_subscription, 100)
|
|
{:ok, %{}}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info(:setup_subscription, state) do
|
|
# Set up the subscription between producer and consumer
|
|
config = Application.get_env(:aprsme, :packet_pipeline, [])
|
|
max_demand = config[:max_demand] || 50
|
|
|
|
case GenStage.sync_subscribe(Aprsme.PacketConsumer, to: Aprsme.PacketProducer, max_demand: max_demand) do
|
|
{:ok, _subscription} ->
|
|
require Logger
|
|
|
|
Logger.info("GenStage packet pipeline subscription established")
|
|
{:noreply, state}
|
|
|
|
{:error, reason} ->
|
|
require Logger
|
|
|
|
Logger.error("Failed to establish GenStage subscription: #{inspect(reason)}")
|
|
# Retry after a delay
|
|
Process.send_after(self(), :setup_subscription, 1000)
|
|
{:noreply, state}
|
|
end
|
|
end
|
|
end
|