De Erlang / Elixir a Java y viceversa. Aventura por 20 minutos

Hola a todos!


Cuando tiene que comunicarse desde el mundo Erlang / Elixir con Java y viceversa, no hay tantas opciones. Una interfaz abandonada para todos y una nueva biblioteca encon , cuyo ejemplo básico se presenta bajo el gato.


Agregar dependencias


Agregue la dependencia de Encon a la aplicación JVM :


Maven


 <dependencies> ... <dependency> <groupId>io.appulse.encon</groupId> <artifactId>encon</artifactId> <version>1.6.4</version> </dependency> ... </dependencies> 

Gradle :


 dependencies { compile 'io.appulse.encon:encon:1.6.4' } 

NOTA: si existe tal necesidad (por ejemplo, un proyecto en Ant ), las dependencias en forma de archivos jar se pueden encontrar en GitHub, en la sección de lanzamientos .

Lanzar nodos 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); 

NOTA: para que el ejemplo anterior funcione, debe ejecutar el demonio EPMD o su implementación Java .

Crear buzones


Buzón, también conocido como proceso, en la terminalología de Erlang:


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

Conexión a nodos


NOTA: Puede iniciar una conexión desde Erlang / Elixir o Java enviando automáticamente un mensaje utilizando el formato de {, } Nodo {, } o por PID (si corresponde).

Puede iniciar la comunicación entre nodos enviando un mensaje de ping desde Erlang a través de net_adm:ping/1 :


 (erlang@localhost)1> net_adm:ping('java@localhost'). pong (erlang@localhost)2> 

También es posible enviar un mensaje a {Name, Node} , donde Node es un átomo de la forma 'java@localhost' , y Name es el PID o el nombre del buzón registrado que existe en el lado de Java.


 (erlang@localhost)1> {my_process, 'java@localhost'} ! hello. hello (erlang@localhost)2> 

Si el buzón existe en el lado de Java, recibirá un mensaje.


Enviar un mensaje desde Java


Mailbox toda Mailbox familia de métodos de send que entregan:


  • send ( ErlangPid , ErlangTerm ): envía un mensaje a un PID remoto o local;
  • send ( String , ErlangTerm ): envía el término al buzón local por su nombre del mismo nodo;
  • send ( String , String , ErlangTerm ): envía un mensaje a un nodo remoto / local y a un buzón por su nombre.

Probémoslo, abra Erlang-shell y regístrelo con el nombre ... 'shell' :


 (erlang@localhost)1> erlang:register(shell, self()). true (erlang@localhost)2> 

Ahora, podemos enviar un mensaje desde Java (la comunicación con el nodo se establecerá automáticamente):


 import static io.appulse.encon.terms.Erlang.atom; mailbox.send("erlang@localhost", "shell", atom("hello")); 

Regresamos a Erlang y leemos el mensaje recibido:


 (erlang@localhost) 1> flush(). Shell got hello ok (erlang@localhost) 2> 

Recibir mensajes en Java


Para recibir un mensaje entrante, debe utilizar uno de los métodos de Mailbox : receive() o receive(timeout, timeUnit) , que puede esperar sin cesar un nuevo mensaje o una cantidad fija de tiempo.


 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()); } } 

Inicie el nodo Erlang y envíe un mensaje:


 $> erl -sname erlang@localhost ... (erlang@localhost)1> {my_process, 'java@localhost'} ! hello. 

Conclusión


Estos y muchos otros ejemplos se pueden estudiar en el sitio web del proyecto y / o en la página de GitHub .

Source: https://habr.com/ru/post/es423719/


All Articles