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;
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")
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 {, }
Nó {, }
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 .