De Erlang / Elixir a Java e vice-versa. Aventura por 20 minutos

Olá a todos!


Quando você precisa se comunicar do mundo Erlang / Elixir com Java e vice-versa - não há tantas opções. Uma interface de interface abandonada para todos e uma nova biblioteca encon , cujo exemplo básico é apresentado sob o gato.


Adicionar dependências


Inclua a dependência do Encon no aplicativo 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: se houver essa necessidade (por exemplo, um projeto no Ant ), as dependências na forma de arquivos jar podem ser encontradas no GitHub, na seção releases .

Iniciar nós 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: qualquer que seja o exemplo acima para o trabalho, você deve executar o daemon EPMD ou Java-implementação .

Criando caixas de correio


Caixa de correio, também conhecido como processo, na terminalologia Erlang:


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

Conexão com nós


NOTA: Você pode iniciar uma conexão a partir do Erlang / Elixir ou Java enviando automaticamente uma mensagem usando o formato de {, }{, } ou por PID (se houver).

Você pode iniciar a comunicação entre os nós enviando uma mensagem de ping de Erlang através de net_adm:ping/1 :


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

Também é possível enviar uma mensagem para {Name, Node} , onde Node é um átomo no formato 'java@localhost' e Name é o PID ou o nome da caixa de correio registrada existente no lado Java.


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

Se a caixa de correio existir no lado Java, ela receberá uma mensagem.


Enviando uma mensagem do Java


Mailbox toda Mailbox família de métodos de send que fornecem:


  • send ( ErlangPid , ErlangTerm ) - envia uma mensagem para um PID remoto ou local;
  • send ( String , ErlangTerm ) - envia o termo para a caixa de correio local pelo nome do mesmo nó;
  • send ( String , String , ErlangTerm ) - envia uma mensagem para um nó remoto / local e uma caixa de correio por seu nome.

Vamos tentar abrir o Erlang-shell e registrá-lo com o nome ... 'shell' :


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

Agora, podemos enviar uma mensagem de Java (a comunicação com o nó será estabelecida automaticamente):


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

Voltamos a Erlang e lemos a mensagem recebida:


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

Recebendo mensagens em Java


Para receber uma mensagem de entrada, você deve usar um dos métodos da Mailbox de Mailbox : receive() ou receive(timeout, timeUnit) , que pode esperar infinitamente por uma nova mensagem ou por um período fixo de tempo.


 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 o nó Erlang e envie uma mensagem:


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

Conclusão


Estes e muitos outros exemplos podem ser exploradas no local do projeto e / ou na página GitHub .

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


All Articles