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