benperiton

benperiton

Starting multiple apps

I currently have 3 apps in an umbrella project, 1 Phoenix and 2 gen_server.

  • WebDisplay
  • AppA
  • AppB

For the purposes of this test, only WebDisplay connects to the other apps, but in the future there will be others that ned to communicate with them.

Im struggling to figure out a way to supervise all of the apps and make sure that they all stay running. I had 2 ideas;

Use the Phoenix app (WebDisplay) to supervise the other apps, but that would mean that if the WebDisplay app restarted, then the other apps would be restarted as well - which is not ideal for the future.

Create a new app (Main) that would supervise all the other apps, so they could be restarted independently of each other. This half works, but if I try and run iex -S mix phoenix.server from the Main app it errors with:

    ** (Mix) Could not start application main: Main.start(:normal, []) returned an error: shutdown: failed to start child: WebDisplay.Endpoint
    ** (EXIT) shutdown: failed to start child: Phoenix.Endpoint.Server
        ** (EXIT) shutdown: failed to start child: {:ranch_listener_sup, WebDisplay.Endpoint.HTTP}
            ** (EXIT) exited in: :gen_server.call(:ranch_server, {:set_new_listener_opts, WebDisplay.Endpoint.HTTP, 16384, [env: [dispatch: [{:_, [], [{["phoenix", "live_reload", "socket", "longpoll"], [], Plug.Adapters.Cowboy.Handler, {Phoenix.Transports.LongPoll, {WebDisplay.Endpoint, Phoenix.LiveReloader.Socket, :longpoll}}}, {["phoenix", "live_reload", "socket", "websocket"], [], Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, {WebDisplay.Endpoint, Phoenix.LiveReloader.Socket, :websocket}}}, {["socket", "websocket"], [], Phoenix.Endpoint.CowboyWebSocket, {Phoenix.Transports.WebSocket, {WebDisplay.Endpoint, WebDisplay.UserSocket, :websocket}}}, {:_, [], Plug.Adapters.Cowboy.Handler, {WebDisplay.Endpoint, []}}]}]]]})
                ** (EXIT) no process

I feel like the second approach is better, but not sure how to go about it properly.
My main.ex looks like:

defmodule Main do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false


    children = [
      supervisor(App1.Supervisor, []),
      supervisor(App2.Supervisor, []),
      supervisor(WebDisplay.Endpoint, [])
    ]

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

Does anyone have any suggestions on the best way forward?

Marked As Solved

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Applications do not need to supervise each other. Each application needs its own top level supervisor. If WebDisplay depends on appa and appb then they need to be added to the mix.exs applications list. That’s all you need :slight_smile:

Think about it, you don’t supervise :httpoison or :ex_aws or any of your other dependencies. Umbrella applications have the same relationship to each other.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
nobody
How to bind a phoenix app to a specific ip address? could not find anything about that, nowhere, unfortunately, but for me this is quite...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
beno
I will often find my self writing things similar to: case some_value do nil -> something() "" -> something() _ -> somethi...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
dotdotdotPaul
Okay, I’m having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I’m sure I’...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

Other popular topics Top

Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
AstonJ
Please see the new poll here: Which code editor or IDE do you use? (Poll) (2022 Edition) It’s been a while since we first asked this, I...
208 31142 143
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New

We're in Beta

About us Mission Statement