Unknown registry: MyApp.Pubsub

Background

I have a Phoenix LiveView App inside an umbrella project which is basically a HelloWorld project.
In This Phoenix App is special though, in that it is a Desktop App:

My Phoenix app does not use Ecto nor any DB, so I had to add the usual PubSub line to the supervision tree in application.ex.

Problem

Everything works as expected, except when I close the application. Upon closing it I get an error:

12:19:22.507 [error] GenServer #PID<0.553.0> terminating
** (ArgumentError) unknown registry: WebInterface.PubSub
    (elixir 1.13.1) lib/registry.ex:1334: Registry.info!/1
    (elixir 1.13.1) lib/registry.ex:985: Registry.register/3
    (phoenix_pubsub 2.0.0) lib/phoenix/pubsub.ex:117: Phoenix.PubSub.subscribe/3
    (phoenix 1.6.5) lib/phoenix/channel/server.ex:419: Phoenix.Channel.Server.init_join/3
    (phoenix 1.6.5) lib/phoenix/channel/server.ex:378: Phoenix.Channel.Server.channel_join/4
    (phoenix 1.6.5) lib/phoenix/channel/server.ex:298: Phoenix.Channel.Server.handle_info/2
    (stdlib 3.16.1) gen_server.erl:695: :gen_server.try_dispatch/4
    (stdlib 3.16.1) gen_server.erl:771: :gen_server.handle_msg/6
Last message: {Phoenix.Channel, %{}, {#PID<0.541.0>, #Reference<0.3172133806.691273734.151736>}, %Phoenix.Socket{assigns: %{}, channel: Phoenix.LiveReloader.Channel, channel_pid: nil, endpoint: WebInterface.Endpoint, handler: Phoenix.LiveReloader.Socket, id: nil, join_ref: "4", joined: false, private: %{}, pubsub_server: WebInterface.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, topic: "phoenix:live_reload", transport: :websocket, transport_pid: #PID<0.541.0>}}
State: #Reference<0.3172133806.691273734.151738>

Here is my application.ex file:

defmodule WebInterface.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

    alias Desktop

  @impl true
  def start(_type, _args) do
    children = [
      WebInterface.Telemetry,
      WebInterface.Endpoint,
      {Phoenix.PubSub, name: WebInterface.PubSub},
      {Desktop.Window,
       [
         app: :web_interface,
         id: WebInterface,
         title: "Web Interface",
         size: {600, 500},
         menubar: WebInterface.MenuBar,
         url: &WebInterface.Endpoint.url/0
       ]}
    ]

    opts = [strategy: :one_for_one, name: WebInterface.Supervisor]
    Supervisor.start_link(children, opts)
  end

  @impl true
  def config_change(changed, _new, removed) do
    WebInterface.Endpoint.config_change(changed, removed)
    :ok
  end
end

What am I doing wrong?

You should probably start pubsub before the endpoint… the order matters

1 Like

Hello, How to check Pubsub is started or not? Because I have a genserver sends data to my database, but I need to check Pubsub is started or not, if not I can return my genserver with a timeout until it is started.

Update

I found it, I thought Process.whereis just accepts pid

2 Likes

I have the PubSub in correct order in application.ex but it still throws an error

application.ex

children = [
      # Start the Telemetry supervisor
      Pxf.Web.Telemetry,
      # Start the PubSub system
      {Phoenix.PubSub, name: Pxf.PubSub},
      # Start the Endpoint (http/https)
      Pxf.Web.Endpoint,
      # Start a worker by calling: Pxf.Worker.start_link(arg)
      # {Pxf.Worker, arg}
      Pxf.Scheduler,
      # web server plug
      {Plug.Cowboy, scheme: :http, plug: Pxf.Router, options: [port: 8000]}
]

Error

Last message: {Phoenix.Channel, %{}, {#PID<0.1038.0>, #Reference<0.2815987139.1106509825.214751>}, %Phoenix.Socket{assigns: %{}, channel: Phoenix.LiveReloader.Channel, channel_pid: nil, endpoint: Pxf.Web.Endpoint, handler: Phoenix.LiveReloader.Socket, id: nil, joined: false, join_ref: "103", private: %{}, pubsub_server: Pxf.PubSub, ref: nil, serializer: Phoenix.Socket.V2.JSONSerializer, topic: "phoenix:live_reload", transport: :websocket, transport_pid: #PID<0.1038.0>}}
State: #Reference<0.2815987139.1106509825.214753>
[error] an exception was raised:
    ** (ArgumentError) unknown registry: Pxf.PubSub
        (elixir 1.14.2) lib/registry.ex:1373: Registry.info!/1
        (elixir 1.14.2) lib/registry.ex:989: Registry.register/3
        (phoenix_pubsub 2.1.1) lib/phoenix/pubsub.ex:121: Phoenix.PubSub.subscribe/3
        (phoenix 1.6.15) lib/phoenix/channel/server.ex:419: Phoenix.Channel.Server.init_join/3
        (phoenix 1.6.15) lib/phoenix/channel/server.ex:378: Phoenix.Channel.Server.channel_join/4
        (phoenix 1.6.15) lib/phoenix/channel/server.ex:298: Phoenix.Channel.Server.handle_info/2
        (stdlib 4.1.1) gen_server.erl:1123: :gen_server.try_dispatch/4
        (stdlib 4.1.1) gen_server.erl:1200: :gen_server.handle_msg/6
        (stdlib 4.1.1) proc_lib.erl:240: :proc_lib.init_p_do_apply/3