簡體   English   中英

在Elixir / Mix / Phoenix應用中將服務/初始化代碼放在哪里?

[英]Where to put service/initialization code in an Elixir/Mix/Phoenix app?

我有一個Elixir / Mix應用程序(也有Phoenix,但也有很多非Phoenix的東西),我想知道放入“啟動”代碼的最佳實踐是什么,例如將子級動態添加到主管,解雇等事情。 “我還活着!” ping或您希望在啟動后立即發生的其他事情。

一個明顯的地方是Application文件,但是期望的收益是Supervisor.start_link(children, opts)的收益。 因此,例如,在Phoenix應用程序中,我可以這樣做:

defmodule MyApp do
  use Application

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

    children = [
      supervisor(MyApp.Repo, []),
      supervisor(MyApp.Endpoint, []),
      supervisor(MyApp.DynamicSupervisorThingy, [])
    ]
    opts = [strategy: :one_for_one, name: MyApp.Supervisor]
    start_val = Supervisor.start_link(children, opts)



    # --- Put things right here that I want to start ----
    MyApp.DynamicSupervisorThingy.add_children_dynamically()
    MyApp.SomeModule.do_some_thingy()
    MyApp.OtherModule.send_some_pings()
    if MIX_ENV == :prod do
      MyApp.YetAnother.prod_stuff_i_dont_want_in_dev()
    end


    start_val
  end
end

這似乎是錯誤的,但是我不知道應該將這段代碼放在哪里。

很好 Phoenix應用程序只是一個OTP應用程序,您可以隨意隨意射擊。 Application.start只期望一個{:ok, pid}元組,這基本上是應用程序的頂級過程。

我通常會先放置自定義的啟動代碼,然后設置主主管規范並啟動該主管-請注意,如果在啟動的“動態主管”和要添加的應用程序之間具有排序依賴性,就像上面的情況一樣,您可能會因為計時問題而丟失-我會在其規范中正確配置該主管,以便它可以在其init回調中執行操作,但是我不知道您的代碼或您的要求。

無論如何,只要您遵守它的合同, Application.start就是您所有的:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM