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;
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")
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 .