Fix Exq startup conflict causing crash loop

- Remove manual Exq startup from application supervision tree
- Add :exq to extra_applications in mix.exs for automatic startup
- Remove duplicate Exq configuration functions
- Let Exq start automatically via runtime.exs configuration

The issue was Exq being started twice - once manually in the supervision
tree and once automatically via configuration, causing "already_started" error.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Graham McIntire 2025-07-27 10:49:42 -05:00
parent 4f7aabbce9
commit 8b3e433e61
No known key found for this signature in database
2 changed files with 33 additions and 61 deletions

View file

@ -63,7 +63,7 @@ defmodule Aprsme.Application do
children = maybe_add_cluster_components(children) children = maybe_add_cluster_components(children)
children = maybe_add_is_supervisor(children, Application.get_env(:aprsme, :env)) children = maybe_add_is_supervisor(children, Application.get_env(:aprsme, :env))
children = maybe_add_aprs_connection(children, Application.get_env(:aprsme, :env)) children = maybe_add_aprs_connection(children, Application.get_env(:aprsme, :env))
children = maybe_add_exq(children) # Exq is now started automatically via config, not in supervision tree
# See https://hexdocs.pm/elixir/Supervisor.html # See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options # for other strategies and supported options
@ -204,67 +204,39 @@ defmodule Aprsme.Application do
end end
end end
defp exq_config do # Removed - Exq configuration is now in runtime.exs
redis_url = System.get_env("REDIS_URL", "redis://localhost:6379") # defp exq_config do
# redis_url = System.get_env("REDIS_URL", "redis://localhost:6379")
{Exq, #
name: Exq, # {Exq,
host: parse_redis_host(redis_url), # name: Exq,
port: parse_redis_port(redis_url), # host: parse_redis_host(redis_url),
password: parse_redis_password(redis_url), # port: parse_redis_port(redis_url),
database: parse_redis_database(redis_url), # password: parse_redis_password(redis_url),
concurrency: :infinite, # database: parse_redis_database(redis_url),
queues: [ # concurrency: :infinite,
{"default", 10}, # queues: [
{"maintenance", 2} # {"default", 10},
], # {"maintenance", 2}
scheduler_enable: true, # ],
scheduler_poll_timeout: 200, # scheduler_enable: true,
poll_timeout: 50, # scheduler_poll_timeout: 200,
redis_timeout: 5000} # poll_timeout: 50,
end # redis_timeout: 5000}
# end
defp parse_redis_host(redis_url) do # Removed - Redis parsing functions no longer needed
%URI{host: host} = URI.parse(redis_url) # Exq configuration is now handled in runtime.exs
host || "localhost"
end
defp parse_redis_port(redis_url) do # Removed - Exq is now started automatically via config
%URI{port: port} = URI.parse(redis_url) # defp maybe_add_exq(children) do
port || 6379 # env = Application.get_env(:aprsme, :env)
end # if env == :test do
# children
defp parse_redis_password(redis_url) do # else
case URI.parse(redis_url) do # children ++ [exq_config()]
%URI{userinfo: nil} -> "" # end
%URI{userinfo: userinfo} -> # end
case String.split(userinfo, ":") do
[_user, password] -> password
_ -> ""
end
end
end
defp parse_redis_database(redis_url) do
case URI.parse(redis_url) do
%URI{path: nil} -> 0
%URI{path: ""} -> 0
%URI{path: "/" <> db} ->
case Integer.parse(db) do
{num, ""} -> num
_ -> 0
end
end
end
defp maybe_add_exq(children) do
env = Application.get_env(:aprsme, :env)
if env == :test do
children
else
children ++ [exq_config()]
end
end
defp redis_children do defp redis_children do
if System.get_env("REDIS_URL") do if System.get_env("REDIS_URL") do

View file

@ -46,7 +46,7 @@ defmodule Aprsme.MixProject do
def application do def application do
[ [
mod: {Aprsme.Application, []}, mod: {Aprsme.Application, []},
extra_applications: [:hackney, :logger, :runtime_tools, :os_mon] extra_applications: [:hackney, :logger, :runtime_tools, :os_mon, :exq]
] ]
end end