2016-03-28 44 views
2

昨天我問了一個similar question關於在另一個應用程序中使用一個應用程序。
比方說,我想在一個新模塊y中使用名爲x的應用程序。
x已被編譯,爲簡單起見,我們假設它已經在本地主機上運行,​​並且目標是在不同節點中運行這兩個組件。如何使用已經從模塊運行的OTP應用程序?

如何從y內撥打x的功能?
會像rpc:call(Node, x, Fun, Param)工作?

此外,是否需要使用rpc模塊進行任何(網絡)設置?

重要

如果你不能夠在兩個節點之間的測試連接,請確保您使用命令行標誌-name和您在您的通話net_adm:ping/1全名。例如如果您命名節點[email protected],則必須通過執行net_adm('[email protected]').從另一模塊ping x。注意單引號。有關更多詳細信息,請參閱this question

回答

4

如何調用x取決於其API和x是否在與y相同的節點中運行。

  • 如果x在同一節點上運行的y和以前y開始您的應用程序相關的聲明,這樣x開始,你可以簡單地調入的x同一個模塊調用任何其他本地模塊。

  • 如果x位於不同的節點,那麼是的,使用the rpc module來調用它是一個可行的選項。只要y節點可以通過Distributed Erlang連接到x節點,rpc就可以在沒有任何額外設置的情況下工作。

我提到的API,因爲它經常是模塊做通過註冊的進程ID成某種名義登記,他們的工作的情況下,如通過erlang:register/2the global registry本地註冊表,或者替代註冊,如gproc,呼叫者可能需要先直接或間接地訪問註冊表以找到他們嘗試呼叫的目標。例如,在調用gen_server instance時,通常需要將您試圖調用的實例的名稱或pid作爲參數傳遞,而對於遠程調用,也需要目標節點名稱。

+1

謝謝!節點應該是不同的,我忘了提到這一點。然而,你的答案是有用的,我試圖通過用'erl -name [email protected] -setcookie y'啓動一個新的shell來連接到'x'節點。我試着用'net_adm:ping(x)'來ping'x'',但它用'pang'響應。你有什麼想法我可能做錯了嗎? – goncalotomas

+2

'x'節點的名稱是什麼?如果你在'x'節點上打開了一個Erlang shell,它的名字應該在shell提示符下。 「x」是用短名稱(使用'-sname')還是長名稱(使用'-name')開始的?你確定它使用同一個cookie嗎?如果你運行'epmd -names',它是否列出'x'節點?只是猜測,但我懷疑'127.0.0.1'部分應該是主機名。 –

+0

在'x'上運行'node()。'輸出'x @ 127.0.0.1'。這就是爲什麼我命名'y'' y @ 127.0.0.1'。我相信兩者都使用長名稱('-name'),而不是短名稱。我通過在其輸出'x'的控制檯上運行'erlang:get_cookie()。'來從'x'獲取cookie。所以我用'erl -name [email protected] -setcookie x'開始'y',但結果保持不變。 我也感興趣的是運行'net_adm:names()'輸出'{ok,[{「x」,58521},{「y」,58920}}}和'epmd -names'輸出'name y at端口58920','端口58521處的名稱x'。 – goncalotomas

相關問題