【问题标题】:How do I use an OTP application that's already running from a module?如何使用已从模块运行的 OTP 应用程序?
【发布时间】:2016-07-15 15:52:26
【问题描述】:

我昨天询问了similar question 关于在另一个应用程序中使用一个应用程序的问题。
假设我想在新模块 y 中使用名为 x 的应用程序。
x 已经编译,为了简单起见,假设它已经在 localhost 上运行,目标是在不同的节点上运行这两个组件。

如何从y 中调用x 的函数?
rpc:call(Node, x, Fun, Param) 这样的东西有用吗?

此外,是否需要任何(网络)设置才能使用rpc 模块?

重要

如果您无法测试两个节点之间的连接,请确保使用命令行标志 -name 并在您的 net_adm:ping/1 调用中包含整个名称。例如如果您将节点命名为 x@localhost,则必须通过执行 net_adm('x@localhost'). 从另一个模块 ping x。注意单引号。详情请见this question

【问题讨论】:

    标签: erlang erlang-otp erlang-shell


    【解决方案1】:

    如何调用x 取决于它的API 以及x 是否与y 在同一节点中运行。

      1234563与调用任何其他本地模块相同。
    • 如果x 在不同的节点中,那么是的,使用the rpc module 调用它是一种可行的选择。只要y 节点可以通过Distributed Erlang 连接到x 节点,rpc 无需任何额外设置即可工作。

    我之所以提到 API,是因为模块通常通过将其进程 ID 注册到某种名称注册表来完成其工作,例如通过 erlang:register/2the global registry 或替代注册表(例如 @987654325)的本地注册表@,调用者可能需要首先直接或间接访问注册表以找到他们尝试调用的目标。例如,在调用gen_server instance 时,您通常需要将尝试调用的实例的名称或 pid 作为参数传递,而对于远程调用,还需要目标节点名称。

    【讨论】:

    • 谢谢!!节点应该是不同的,我忘了提。无论您的回答多么有用,我都试图通过使用erl -name y@127.0.0.1 -setcookie y 启动一个新shell 来连接到x 节点。我尝试使用net_adm:ping(x). ping x,但它以pang 响应。你知道我做错了什么吗?
    • x 节点的名称是什么?如果你在x 节点上打开了一个 Erlang shell,它的名字应该在 shell 提示符中。 x 是以短名称(使用 -sname)还是长名称(使用 -name)开头的?你确定它使用的是同一个cookie吗?如果您运行epmd -names,它会列出x 节点吗?只是猜测,但我怀疑 127.0.0.1 部分应该是主机名。
    • x 上运行node(). 输出x@127.0.0.1。这就是为什么我命名为yy@127.0.0.1。我相信两者都使用长名称(-name),而不是短名称。我通过在其控制台上运行erlang:get_cookie().x 获取cookie,该控制台输出x。所以我以erl -name y@127.0.0.1 -setcookie x 开头y,但结果保持不变。让我感兴趣的是运行net_adm:names() 输出{ok,[{"x",58521},{"y",58920}]}epmd -names 输出name y at port 58920name x at port 58521
    • 我想通了。我必须使用net_adm:ping('x@127.0.0.1').。我认为net_adm:ping(x). 就足够了,但显然不是!我从this question 得到这个想法。
    • 如果你很快来里斯本,我会请你喝一杯啤酒。再次感谢您的所有帮助。你太棒了。
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2014-06-04
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多