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