D'Erlang / Elixir à Java et vice versa. Aventure pendant 20 minutes

Salut à tous!


Lorsque vous devez communiquer avec le monde Erlang / Elixir avec Java et vice versa - il n'y a pas tellement d'options. Une interface abandonnée pour tout le monde et une nouvelle bibliothèque d' encon , dont un exemple de base est présenté sous le chat.


Ajouter des dépendances


Ajoutez la dépendance Encon à l'application 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' } 

REMARQUE: s'il y a un tel besoin (par exemple, un projet sur Ant ), les dépendances sous forme de fichiers jar peuvent être trouvées sur GitHub, dans la section des versions .

Lancer les nœuds 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); 

REMARQUE: pour que l'exemple ci-dessus fonctionne, vous devez exécuter le démon EPMD ou son implémentation Java .

Création de boîtes aux lettres


Boîte aux lettres, ou processus, dans la terminologie Erlang:


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

Connexion aux nœuds


REMARQUE: Vous pouvez établir une connexion depuis Erlang / Elixir ou Java en envoyant automatiquement un message au format {, } Node {, } ou par PID (le cas échéant).

Vous pouvez démarrer la communication entre les nœuds en envoyant un message ping depuis Erlang via net_adm:ping/1 :


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

Il est également possible d'envoyer un message à {Name, Node} , où Node est un atome de la forme 'java@localhost' , et Name est le PID ou le nom de boîte aux lettres enregistré qui existe du côté Java.


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

Si la boîte aux lettres existe du côté Java, elle recevra un message.


Envoi d'un message depuis Java


Mailbox toute Mailbox famille de méthodes d' send qui offrent:


  • send ( ErlangPid , ErlangTerm ) - envoie un message à un PID distant ou local;
  • send ( String , ErlangTerm ) - envoie le terme à la boîte aux lettres locale par son nom du même nœud;
  • send ( String , String , ErlangTerm ) - envoie un message à un nœud distant / local et à une boîte aux lettres par son nom.

Essayons-le, ouvrons Erlang-shell et enregistrons-le avec le nom ... 'shell' :


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

Maintenant, nous pouvons envoyer un message depuis Java (la communication avec le nœud sera établie automatiquement):


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

Nous retournons à Erlang et lisons le message reçu:


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

Réception de messages en Java


Pour recevoir un message entrant, vous devez utiliser l'une des méthodes de Mailbox aux Mailbox : receive() ou receive(timeout, timeUnit) , qui peut sans cesse attendre un nouveau message ou une durée fixe.


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

Démarrez le nœud Erlang et envoyez un message:


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

Conclusion


Ces exemples et bien d'autres peuvent être étudiés sur le site Web du projet et / ou sur la page GitHub .

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


All Articles