Dari Erlang / Elixir ke Jawa dan sebaliknya. Petualangan selama 20 menit

Hai semuanya!


Ketika Anda harus berkomunikasi dari dunia Erlang / Elixir dengan Java dan sebaliknya - tidak ada begitu banyak pilihan. Sebuah jinterface yang ditinggalkan untuk semua orang dan perpustakaan encon baru, contoh dasar yang disajikan di bawah kucing.


Tambahkan Dependensi


Tambahkan ketergantungan Encon ke aplikasi 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' } 

CATATAN: jika ada kebutuhan seperti itu (misalnya, proyek pada Ant ), maka dependensi dalam bentuk file jar dapat ditemukan di GitHub, di bagian rilis .

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

CATATAN: agar contoh di atas berfungsi, Anda harus menjalankan daemon EPMD atau implementasi Java -nya.

Membuat Kotak Surat


Kotak surat, alias proses, dalam terminologi Erlang:


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

Koneksi ke node


CATATAN: Anda dapat memulai koneksi dari Erlang / Elixir atau Java dengan secara otomatis mengirim pesan menggunakan format {, } Node {, } atau dengan PID (jika ada).

Anda dapat memulai komunikasi antar node dengan mengirim pesan ping dari Erlang melalui net_adm:ping/1 :


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

Dimungkinkan juga untuk mengirim pesan ke {Name, Node} , di mana Node adalah atom dari bentuk 'java@localhost' , dan Name adalah PID atau nama kotak surat terdaftar yang ada di sisi Java.


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

Jika kotak surat ada di sisi Java, maka itu akan menerima pesan.


Mengirim pesan dari Jawa


Mailbox seluruh keluarga metode pengiriman yang mengirimkan:


  • send ( ErlangPid , ErlangTerm ) - mengirim pesan ke PID jarak jauh atau lokal;
  • send ( String , ErlangTerm ) - mengirim istilah ke kotak surat lokal dengan nama simpul yang sama;
  • send ( String , String , ErlangTerm ) - mengirim pesan ke node lokal / jauh dan kotak surat dengan namanya.

Mari kita coba, buka Erlang-shell dan daftarkan dengan nama ... 'shell' :


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

Sekarang, kita dapat mengirim pesan dari Java (komunikasi dengan node akan dibuat secara otomatis):


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

Kami kembali ke Erlang dan membaca pesan yang diterima:


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

Menerima Pesan di Jawa


Untuk menerima pesan masuk, Anda harus menggunakan salah satu metode Mailbox : receive(timeout, timeUnit) receive() atau receive(timeout, timeUnit) , yang dapat tanpa henti menunggu pesan baru atau jumlah waktu yang tetap.


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

Mulai simpul Erlang dan kirim pesan:


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

Kesimpulan


Ini dan banyak contoh lainnya dapat dipelajari di situs web proyek dan / atau di halaman GitHub .

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


All Articles