Elixir 在Phoenix中,我应该在哪里调用初始化代码,这可能涉及到连接到db?

Elixir 在Phoenix中,我应该在哪里调用初始化代码,这可能涉及到连接到db?,elixir,phoenix-framework,otp,Elixir,Phoenix Framework,Otp,我有一些代码需要在Elixir Phoneix应用程序启动时调用。代码的某些部分需要向数据库发出请求,以检索将用于初始化的数据 虽然我可以在 如果我理解正确的话,不应该从MyAppWeb.Endpoint 这是正确的吗?如果是这样的话,我应该从哪里开始编写这样的代码来进行初始化 首先,不要将与Phoenix本身无关的代码放入其助手中 创造你自己的,做任何你需要的,然后优雅地停止它 GenServer初始化过程分为三个阶段: 第一个在调用进程中执行,最后两个是回调,在已启动的GenSer

我有一些代码需要在Elixir Phoneix应用程序启动时调用。代码的某些部分需要向数据库发出请求,以检索将用于初始化的数据

虽然我可以在

如果我理解正确的话,不应该从
MyAppWeb.Endpoint


这是正确的吗?如果是这样的话,我应该从哪里开始编写这样的代码来进行初始化

首先,不要将与Phoenix本身无关的代码放入其助手中

创造你自己的,做任何你需要的,然后优雅地停止它

GenServer
初始化过程分为三个阶段:

第一个在调用进程中执行,最后两个是回调,在已启动的
GenServer
进程中同步执行,
init/1
handle\u continue/2
异步执行

也就是说,执行长时间运行的初始化的常见做法是:

defmodule MyInit do
使用GenServer
@spec start_链接(opts::keyword())::GenServer.on_start()
@doc“启动GenServer进程”
def start_链接(选项\\[])do
GenServer.start\u链接(\u模块\u,…,名称:\u模块\u)
结束
@impl-GenServer
@虚假文件
def init(:ok),do:{:ok,:ok,{:continue,:connect}
@impl-GenServer
@虚假文件
def handle_continue(:connect,:ok)执行
do_init(…)
{:停止,:正常,无}
结束
结束
从你的监督树开始这个过程



如果在端点启动之前完成此初始化至关重要,将对
do_init
的调用移动到
init/1
回调中,并将此
GenServer
放在监督树的端点之前。

您应该从这里查看
ReleaseTasks
:@Daniel我真的怀疑我是否了解ReleaseTasks在这里有什么帮助。是的,我的错,我想指出配置提供程序:@Daniel config providers都是关于要加载的静态配置的,从那里执行一些代码肯定是一种反模式。GenServer应该被称为
supervisor(MyInit)
还是
worker(MyInit)
?还是没关系?另外,从我的
MyInit
我需要打电话到我应用程序中的另一个GenServer,特别是
ets
。有什么细微差别吗?
supervisor(MyInit)
/
worker(MyInit)
早就被弃用了
GenServer
公开了
child\u spec
,因此只需将其放入监控树中即可
ets
决不是一个
GenServer
,而且没有任何细微差别,只需打开它并调用(请注意,
ets
由调用进程拥有,因此如果您从该
GenServer
打开它,请让它保持运行。您的意思是什么
进入监控树中?您能给我看一下代码吗?在
应用程序中。ex
我有
def start(_type,_args)do
多个
监控程序(AAA)
worker(MyInit)
在其中。是的,在那里。有大量关于这个主题的文档。还有来自那里的链接。
defmodule MyAppWeb.Endpoint do 
  # [............]

  #
  # some of my init code will go here
  #


  def init(...) do
    # [.........]
  end
end