Erlang Gen Server之间的通信

时间:2010-09-30 05:06:27

标签: erlang

我正在使用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 :(

请建议我是否以错误的方式进行。

1 个答案:

答案 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的回复。这通常会在超时和崩溃时结束。

执行此操作的正确方法是从castServer1发送异步调用(Server2),包括From变量,以便{{1} }}可以回复Server2以将自己替换为gen_server:reply/2。然后,Server1应返回Server1元组。这将免除noreply的过程,并且能够继续处理其他内容。