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.call(目标,…)失败';不存在_Elixir - Fatal编程技术网

Elixir 如何在目标进程不运行时捕获GenServer.call(目标,…)失败';不存在

Elixir 如何在目标进程不运行时捕获GenServer.call(目标,…)失败';不存在,elixir,Elixir,在我的应用程序中,所有登录的用户都由GenServer表示,我称之为UserAgent,它基本上将每个用户的状态保存在内存中。所有这些进程都是基于一个唯一ID在集群的分布式注册表中注册的。每当用户执行某些操作时,客户端应用程序都会发送要与用户ID一起执行的操作。在服务器端,控制器检查参数(强制、可选、语法等),并最终调用UserAgent。The_action(…)函数只向服务器发送一条消息,其中包含要执行的操作:GenServer.call(通过\u tuple(id),{:The_actio

在我的应用程序中,所有登录的用户都由
GenServer
表示,我称之为
UserAgent
,它基本上将每个用户的状态保存在内存中。所有这些进程都是基于一个唯一ID在集群的分布式注册表中注册的。每当用户执行某些操作时,客户端应用程序都会发送要与
用户ID一起执行的操作。在服务器端,控制器检查参数(强制、可选、语法等),并最终调用
UserAgent。
The_action(…)
函数只向服务器发送一条消息,其中包含要执行的操作:
GenServer.call(通过\u tuple(id),{:The_action,params})

在某些情况下,
user\u id
引用的
UserAgent
不再存在,例如,因为用户已经不活动了一段时间,进程已经被清除(sesion已经过期),或者因为此时无法访问集群的某些部分(目前的假想用例)。在这些情况下,调用
GenServer.call(通过元组(id),{:the_action,params})
会导致下面的错误,这也会使HTTP端点进程崩溃(
#PID
下面),这反过来会导致
500
HTTP错误(出于调试目的,
转储
api调用转储进程的状态):

[错误]#运行AppWeb的PID。终结点(连接#PID,流id 1)已终止
服务器:localhost:4001(http)
请求:GET/api/v1/dump/5f534b99d6ca3fe1ff6d2f78
**(退出)退出:GenServer.call({:via,Horde.Registry,{App.DReg,“5f534b99d6ca3fe1ff6d2f78”},:dump,5000)
**(退出)无进程:进程不活动或当前没有关联的进程\
使用给定名称,可能是因为其应用程序尚未启动
我就是不知道如何截获这个错误。实际上,我最后在
UserAgent
的客户端部分调用
Horde.Registry.lookup(App.UserAgent.via_tuple(user_id))
,然后调用
GenServer.call(),并返回
pid`或在找不到进程时向控制器返回错误


我想知道是否有更好的方法。

这就是
GenServer.call/3
的方式。尽管如此,它还是会调用
whereis/1
,因此您可以自己调用
whereis/1
,或者从我链接的代码复制逻辑,或者使用
捕获异常

[error] #PID<0.1359.0> running AppWeb.Endpoint (connection #PID<0.1358.0>, stream id 1) terminated
Server: localhost:4001 (http)
Request: GET /api/v1/dump/5f534b99d6ca3fe1ff6d2f78
** (exit) exited in: GenServer.call({:via, Horde.Registry, {App.DReg, "5f534b99d6ca3fe1ff6d2f78"}}, :dump, 5000)
    ** (EXIT) no process: the process is not alive or there's no process currently associated \
        with the given name, possibly because its application isn't started