大家好!
当您必须使用Java从Erlang / Elixir世界进行通信,反之亦然时,没有太多选择。 每个人都将放弃的jinterface和新的encon库,下面是一个基本示例。
添加依赖项
将Encon
依赖项添加到JVM
应用程序:
Maven :
<dependencies> ... <dependency> <groupId>io.appulse.encon</groupId> <artifactId>encon</artifactId> <version>1.6.4</version> </dependency> ... </dependencies>
摇篮
dependencies { compile 'io.appulse.encon:encon:1.6.4' }
注意:如果有这样的需要(例如, Ant
上的一个项目),则可以在GitHub的releases部分中找到jar文件形式的依赖项。
启动Erlang节点
import io.appulse.encon.Node; import io.appulse.encon.Nodes; import io.appulse.encon.config.NodeConfig;
注意:为了使以上示例正常工作,您必须运行EPMD
守护程序或其Java实现 。
创建邮箱
邮箱,又名进程,在Erlang终端中:
import io.appulse.encon.mailbox.Mailbox; Mailbox mailbox = node.mailbox() .name("popa")
连接到节点
注意:您可以通过使用{, }
Node {, }
格式或PID(如果有的话)自动发送消息来启动从Erlang / Elixir或Java的连接。
您可以通过net_adm:ping/1
从Erlang发送ping消息来开始节点之间的通信net_adm:ping/1
:
(erlang@localhost)1> net_adm:ping('java@localhost'). pong (erlang@localhost)2>
也可以向{Name, Node}
发送消息,其中Node
是形式为'java@localhost'
的原子,而Name
是Java端上存在的PID或注册邮箱名称。
(erlang@localhost)1> {my_process, 'java@localhost'} ! hello. hello (erlang@localhost)2>
如果邮箱位于Java端,则它将收到一条消息。
从Java发送消息
Mailbox
一整套send
方法,这些方法可以提供:
- 发送( ErlangPid , ErlangTerm )-发送消息到远程或本地PID ;
- send( String , ErlangTerm )-通过相同节点的名称将术语发送到本地邮箱;
- send( String , String , ErlangTerm )-通过其名称将消息发送到远程/本地节点和邮箱。
让我们尝试一下,打开Erlang-shell并用... 'shell'
名称注册:
(erlang@localhost)1> erlang:register(shell, self()). true (erlang@localhost)2>
现在,我们可以从Java发送消息(与该节点的通信将自动建立):
import static io.appulse.encon.terms.Erlang.atom; mailbox.send("erlang@localhost", "shell", atom("hello"));
我们返回Erlang并阅读收到的消息:
(erlang@localhost) 1> flush(). Shell got hello ok (erlang@localhost) 2>
用Java接收消息
要接收传入的消息,您必须使用Mailbox
方法之一: receive()
或receive(timeout, timeUnit)
,它们可以无休止地等待新消息或固定时间。
import io.appulse.encon.Node; import io.appulse.encon.Nodes; import io.appulse.encon.config.NodeConfig; import io.appulse.encon.connection.regular.Message; import io.appulse.encon.mailbox.Mailbox; public class Main { public static void main (String[] args) { NodeConfig config = NodeConfig.builder() .shortName(true) .build(); Node node = Nodes.singleNode("java@localhost", config); Mailbox mailbox = node.mailbox() .name("my_process") .build(); Message message = mailbox.receive(); System.out.println("Incoming message: " + message.getBody().asText()); } }
启动Erlang节点并发送一条消息:
$> erl -sname erlang@localhost ... (erlang@localhost)1> {my_process, 'java@localhost'} ! hello.
结论
这些和许多其他示例可以在项目网站和/或GitHub页面上进行研究 。