Von Erlang / Elixir nach Java und umgekehrt. Abenteuer für 20 Minuten

Hallo zusammen!


Wenn Sie mit Java aus der Erlang / Elixir-Welt kommunizieren müssen und umgekehrt, gibt es nicht so viele Optionen. Ein verlassenes Jinterface für alle und eine neue Encon- Bibliothek, von der ein grundlegendes Beispiel unter der Katze präsentiert wird.


Abhängigkeiten hinzufügen


Fügen Encon der JVM Anwendung die Encon Abhängigkeit hinzu:


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' } 

HINWEIS: Wenn ein solcher Bedarf besteht (z. B. ein Projekt auf Ant ), finden Sie Abhängigkeiten in Form von JAR- Dateien auf GitHub im Abschnitt " Releases ".

Starten Sie Erlang Nodes


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

HINWEIS: Damit das obige Beispiel funktioniert, müssen Sie entweder den EPMD Dämon oder dessen Java-Implementierung ausführen.

Postfächer erstellen


Mailbox, auch bekannt als Prozess, in der Erlang-Terminalologie:


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

Verbindung zu Knoten


HINWEIS: Sie können eine Verbindung über Erlang / Elixir oder Java herstellen, indem Sie automatisch eine Nachricht im Format {, } Knoten {, } oder per PID (falls vorhanden) senden.

Sie können die Kommunikation zwischen Knoten starten, indem Sie eine Ping-Nachricht von Erlang über net_adm:ping/1 :


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

Es ist auch möglich, eine Nachricht an {Name, Node} zu senden, wobei Node ein Atom der Form 'java@localhost' ist und Name die PID oder der registrierte Postfachname ist, der auf der Java-Seite vorhanden ist.


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

Wenn das Postfach auf der Java-Seite vorhanden ist, erhält es eine Nachricht.


Senden einer Nachricht von Java


Mailbox ganze Familie von send , die Folgendes liefern:


  • send ( ErlangPid , ErlangTerm ) - sendet eine Nachricht an eine entfernte oder lokale PID ;
  • send ( String , ErlangTerm ) - sendet den Begriff mit dem Namen desselben Knotens an das lokale Postfach.
  • send ( String , String , ErlangTerm ) - sendet eine Nachricht mit ihrem Namen an einen entfernten / lokalen Knoten und ein Postfach.

Probieren wir es aus, öffnen Sie die Erlang-Shell und registrieren Sie sie mit dem Namen ... 'shell' :


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

Jetzt können wir eine Nachricht von Java senden (die Kommunikation mit dem Knoten wird automatisch hergestellt):


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

Wir kehren nach Erlang zurück und lesen die empfangene Nachricht:


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

Empfangen von Nachrichten in Java


Um eine eingehende Nachricht zu empfangen, müssen Sie eine der Mailbox Methoden verwenden: receive() oder receive(timeout, timeUnit) , die endlos auf eine neue Nachricht oder eine festgelegte Zeit warten können.


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

Starten Sie den Erlang-Knoten und senden Sie eine Nachricht:


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

Fazit


Diese und viele andere Beispiele können auf der Projektwebsite und / oder auf der GitHub-Seite untersucht werden .

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


All Articles