从Erlang / Elixir到Java,反之亦然。 冒险20分钟

大家好!


当您必须使用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; //   . //   - .  encon-config NodeConfig config = NodeConfig.builder() // true -   , // false ( ) -   .shortName(true) .cookie("secret") .build(); // ,   EPMD     Erlang  Node node = Nodes.singleNode("echo-node", config); 

注意:为了使以上示例正常工作,您必须运行EPMD守护程序或其Java实现

创建邮箱


邮箱,又名进程,在Erlang终端中:


 import io.appulse.encon.mailbox.Mailbox; Mailbox mailbox = node.mailbox() .name("popa") //  .build(); 

连接到节点


注意:您可以通过使用{, } 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方法,这些方法可以提供:


  • 发送( ErlangPidErlangTerm )-发送消息到远程或本地PID ;
  • send( StringErlangTerm )-通过相同节点的名称将术语发送到本地邮箱;
  • send( StringStringErlangTerm )-通过其名称将消息发送到远程/本地节点和邮箱。

让我们尝试一下,打开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页面上进行研究

Source: https://habr.com/ru/post/zh-CN423719/


All Articles