问题标签 [gen-server]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
664 浏览

ssl - Erlang Apple Push 通知在断开连接之前没有收到响应错误

我目前正在测试我的推送通知模块。当设备令牌无效时,它会断开连接...

根据Apple推送通知开发人员文档,我应该在Apple推送服务器断开之前收到一个错误响应数据包......

问题是我断开了连接,但在那之前我没有在 Socket 上得到任何东西,我需要知道推送失败是因为推送格式错误(所以我可以修复错误),还是无效的设备令牌(所以我可以从数据库中删除它)。

这是我的代码:

当有效负载和 deviceToken 都正确时,它工作得很好。如果 deviceToken 无效,它只会断开连接。

有谁可以发现这个问题?因为经过4个小时的搜索,我才发现我显然不能!

这是错误响应表:

0 投票
2 回答
906 浏览

erlang - otp gen_server 的 info、call、cast 消息队列中是否有不同的优先级?

写代码时,我会问自己应该使用call哪种类型的消息,应该使用哪种类型的消息info

在这个问题下面,还有一个长期以来的疑问,info, cast, call消息之间是否存在优先级差异?这 3 种类型的消息是否共享同一个队列?

0 投票
4 回答
2176 浏览

erlang - 当 gen_server 方法被两个客户端同时调用时会发生什么?

我有一个 gen_server 模块,它在客户端进程发送数据时将数据记录到文件中。当两个客户端进程同时向该模块发送数据时会发生什么?文件操作会不会相互冲突?erlang 文档在这里令人沮丧地不清楚。

0 投票
1 回答
412 浏览

erlang - Erlang code_change 和本地函数调用

我不确定如何在模块中调用本地函数,以便在代码更改后使用最新版本的代码。请参见以下示例:

将要更改的功能是add/1。为了使用最新版本的函数,add/1(第 17 行)的调用应该是完全限定的函数调用 {Pid, Z} -> Pid ! ?MODULE:add(Z)。当我尝试它时,我得到了这个:

第 22 行更改为N + 2

第 22 行再次更改为N + 3

为什么我会收到此错误?

0 投票
1 回答
369 浏览

tcp - 自动重新连接到 TCP 主机

TLDR:是否存在用于自动重新连接到有时失败的 TCP 服务器的可重用代码?


我正在编写一个服务器应用程序——称之为它hal——它还打开了到其他服务器的一些 TCP 连接——其中包括xbmc。我最初编写它是为了当xbmc失败时,xbmcerlang 进程将停止并随后由其主管重新启动。

显然,这不是在 erlang 中进行持久 TCP 连接的好方法。首先,它并没有真正起作用:当xbmc失败时,进程会重启得太快,主管会关闭整个hal程序。其次,我显然不应该为此使用主管:Erlang Supervisor Strategy For Restarting Connections to Downed Hosts(当我读到它时,这个链接的问题只回答“主管解决这个问题吗?”,而不是我的问题的重复)

我认为这听起来像是一个相当常见的用例,即使主机不时出现故障,也要尽可能保持 TCP 连接的连接。我应该使用一些 OTP 或其他库代码来实现这一点吗?

0 投票
1 回答
651 浏览

erlang - 我的 gen_server 会成为瓶颈吗?

我目前正在用 erlang 编写一个软件,它现在基于 gen_server 行为。这个 gen_server 应该导出一个函数(我们称之为 update/1),它应该使用 ssl 连接到另一个在线服务,并将作为参数传递给函数的值发送给它。

当前 update/1 是这样的:

因此,一旦调用它,就会调用 ?SERVER ,其处理方式如下:

一旦数据包被发送到远程服务器,对等方应该切断连接。

现在,这适用于我在 shell 中的测试,但是如果我们必须调用 1000 次 mymod:update(Value) 并且 ssl:connect/4 不能正常工作(即达到超时)会发生什么?

此时,我的 gen_server 将有非常大量的值,它们只能一个一个地处理,导致第 1000 次更新将在使用 update/1 更新其值后仅 1000*3000 毫秒完成。

使用强制转换而不是调用会留下同样的问题。我怎么解决这个问题?我应该使用普通函数而不是 gen_server 调用吗?

0 投票
1 回答
2079 浏览

erlang - 当我尝试从 eshell 启动时,我的主管崩溃了?

我对 OTP 很陌生,我正在尝试创建简单的示例来了解主管的行为:

这是简单的增量服务器

我想让它由这个模块监督:

之后,我在 erlang shell 中执行了后续步骤:

在此之后我尝试了下一个(正如我所料我有错误):

在此之后,我期望 - 我的主管重新启动inc_serv。但它没有:

你能帮我理解发生了什么吗?我应该如何重写我的主管,使其能够重新启动inc_serv

谢谢

0 投票
1 回答
267 浏览

erlang - Mochiweb 中是否有任何状态变量?

我浏览了Mochiweb 代码,但没有发现 State 变量的任何迹象。

Mochiweb 中是否存在类似于 gen_server 的State变量的东西?

我需要在服务器上存储少量与状态相关的服务器端(与会话无关)数据,我不想为此使用 ETS 或 Mnesia。

0 投票
2 回答
683 浏览

erlang - Erlang:如何从 gen_server 中的 init() 获取结果

我的 init() 函数创建 UDP Socket 并将 Socket 值作为状态返回。

如何在我的函数 start() 中获取 Socket?

0 投票
2 回答
2344 浏览

erlang - Erlang gen_server 如何 start_link 另一个节点上的 gen_server?

我有一个 Erlang 应用程序,它有点太消耗资源而无法留在一个节点上。我正在让 gen_servers 从一个进程移动到另一个进程——结果证明这相对容易。我遇到了最后一个障碍:让创建这些 gen_servers 的工厂进程在远程节点而不是本地节点上生成它们。start_link 的默认行为显然是仅在本地启动,但我看不到任何更改它的选项。

看来我将不得不对解决方案具有创造性,并想看看那里是否有人已经成功地实施了类似的东西。IOW,推荐的解决方案是什么?

编辑

我正在查看由调用触发的调用链:

gen_server:start_link/3:

创:开始/ 5:

gen:do_spawn/5:

proc_lib:start_link/5:

这最终让我们来到了有趣的地方。有一个 spawn_opt/4 匹配:

但是,有一个实际上对我有用:

令人难以置信的是,这没有暴露。我意识到粗心的程序员可能会尝试 gen_server:start_link 恰好在火星上运行的 erlang 节点上的进程,从而阻塞调用半小时,但可以肯定的是,这是程序员的注意。我真的坚持修改 OTP 或编写某种临时解决方案吗?