Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Elixir上异常退出后,有没有办法用不同的配置重新启动GenServer?_Elixir_Otp - Fatal编程技术网

在Elixir上异常退出后,有没有办法用不同的配置重新启动GenServer?

在Elixir上异常退出后,有没有办法用不同的配置重新启动GenServer?,elixir,otp,Elixir,Otp,几天前我开始学习长生不老药,我真的很喜欢它。尤其是使用主管进程作为助手来创建容错应用程序的想法 然而,有一种我认为很自然但到目前为止我找不到任何参考的情况,那就是在发生故障时用不同的配置重新启动子进程(GenServer) 我的用例如下所示: 我有一个从数据库中获取数据并在某种程度上使用它的过程。数据库连接对于进程生命周期至关重要。 如果进程异常退出,我希望能够使用不同的数据库连接(备份数据库),因为它无法连接到数据库或从数据库获取数据给定N次(而不是释放地狱并抛出进程因数据库连接而死亡的通知)

几天前我开始学习长生不老药,我真的很喜欢它。尤其是使用主管进程作为助手来创建容错应用程序的想法

然而,有一种我认为很自然但到目前为止我找不到任何参考的情况,那就是在发生故障时用不同的配置重新启动子进程(GenServer)

我的用例如下所示:

我有一个从数据库中获取数据并在某种程度上使用它的过程。数据库连接对于进程生命周期至关重要。 如果进程异常退出,我希望能够使用不同的数据库连接(备份数据库),因为它无法连接到数据库或从数据库获取数据给定N次(而不是释放地狱并抛出进程因数据库连接而死亡的通知)

可能吗


就我所见,主管每次都以相同的方式重新启动流程。也许用一个
:简单的“一对一”策略就足够了,但我不知道具体怎么做

AFAIK,使用单个选项是不可能的,因为需要存储此进程的状态(默认与备份)

不过,实现所需的行为相对容易

首先,让主管加载并维护连接池,例如。G从配置文件。其次,是的,使用重启策略更容易重要提示:使其显式捕获出口:

Process.flag :trap_exit, true
最后,当收到
:EXIT
信号时,旋转连接池,进行清理,并使用
start\u link
手动重新启动底层关键进程,将连接池中当前的头连接设置作为参数传递给它


一个简单但更快的解决方案是将连接池存储在
DETS
(或任何其他持久性存储)中,在初始化时读取它并传递给底层子级,立即旋转并覆盖
DETS
中的列表。这样人们就可以使用
:一对一
或任何其他想要的策略。应该在每次重新启动监控器时清理存储,以使默认连接设置此时处于顶部。我不推荐这种方法


更新:显然,在您的特定情况下,仅使用长时间运行并处理来自它的
:DOWN
信号就足够了