2010-09-30 34 views
2

我正在使用Erlang OTP框架构建网络路由器应用程序。Erlang Gen Server之间的通信

在其运行Supervisor的过程中,创建了两个genservers,并且每个estagen_server:call(CurrentProcName,{BinEvent,UniqueTrxId,MdPid},infinity)都使到两个单独服务器的tcp连接变得模糊。

现在,在运行应用程序时,发生一个genserver接收到重复事件,在这种情况下,我希望该事件由第二个gen_server处理。

对于这一点,我打电话gen_server:调用(NextProcName,{BinEvent,UniqueTrxId,MdPid},无穷大)

此功能,我的gen_server模块内打电话时重复的事件满足条件。

NextProcName ::这是第二gen_server

注意注册名称::代码仍然是两个gen_server的

的问题同样是我能够复制事件,但该事件是不知何故没有得到传递给第二gen_server :(

请建议如果我做它在错误的道路或没有。

回答

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

正确的方法做,这是不是从发送一个Server1异步调用(一cast)到Server2,包括From变量,以便Server2可以gen_server:reply/2回复自身替换到Server1Server1应该返回一个noreply元组。这将释放Server1的进程,并且可以继续处理其他内容。

+0

你当然不会给出可怕的建议:P。 – Arunmu 2010-09-30 12:39:32

+0

我很抱歉,我无法在此时分享代码。但是我会尽最大努力来解释条件,作为本线索的答案,而不是评论。 – Arunmu 2010-09-30 12:42:06