2010-09-30 31 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