[英]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.