我正在使用Erlang OTP框架构建网络路由器应用程序。
在运行Supervisor的过程中创建了两个genservers,每个estagen_server:call(CurrentProcName,{BinEvent,UniqueTrxId,MdPid},infinity),将两个服务器的tcp连接放大。
现在,在运行应用程序时,碰巧有一个genserver接收到重复事件,在这种情况下,我希望第二个gen_server处理该事件。
为此,我打电话给 gen_server:call(NextProcName,{BinEvent,UniqueTrxId,MdPid},infinity),
当重复事件的条件满足时,我在gen_server模块内调用此函数。
NextProcName ::它是第二个gen_server
的注册名称注意 :: gen_server的代码保持不变
问题是我能够复制事件,但事件不会以某种方式传递给第二个gen_server :(
请建议我是否以错误的方式进行。
答案 0 :(得分:3)
如果您可以分享来源,我们将不胜感激。
您确定收到了邮件,还是没有收到回复?
我在这里看到的最合理的问题是你以同步的方式转发消息。如果不是这样,那么你可以完全忽略我的帖子。现在,让我们看看同步转发是如何发挥作用的:
client server1 server2
| | |
>--- Msg1 ----> (ok) |
(waits S1) | |
(ok) <-- Reply ---< |
>--- Msg2 ----> (ok) |
(waits S1) >----- Msg2 -----> (ok)
(waits S1) (waits S2) <--- Reply --<
(waits S1) (Waits S2) |
*Stuff crashes*
这不是很清楚,但它显示了正在发生的事情。这里Server1
基本上仍在计算为将消息Msg2
处理为gen_server行为,因此永远不会读取它正在等待的Server2
的回复。这通常会在超时和崩溃时结束。
执行此操作的正确方法是从cast
向Server1
发送异步调用(Server2
),包括From
变量,以便{{1} }}可以回复Server2
以将自己替换为gen_server:reply/2
。然后,Server1
应返回Server1
元组。这将免除noreply
的过程,并且能够继续处理其他内容。