من Erlang / Elixir إلى Java والعكس. مغامرة لمدة 20 دقيقة

مرحبا بالجميع!


عندما يكون عليك التواصل من عالم Erlang / Elixir باستخدام Java والعكس صحيح - لا يوجد الكثير من الخيارات. واجهة متداخلة مهجورة للجميع ومكتبة encon جديدة ، يتم تقديم مثال أساسي عنها تحت القط.


أضف التبعيات


قم بإضافة تبعية Encon إلى تطبيق JVM :


مخضرم :


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

ملاحظة: إذا كانت هناك حاجة (على سبيل المثال ، مشروع على Ant ) ، فيمكن العثور على التبعيات في شكل ملفات jar على GitHub ، في قسم الإصدارات .

قم بتشغيل 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); 

ملاحظة: لكي يعمل المثال أعلاه ، يجب عليك إما تشغيل البرنامج الخفي EPMD أو تطبيق Java الخاص به.

إنشاء صناديق البريد


صندوق البريد ، المعروف أيضًا باسم عملية ، في مصطلحات إرلانغ:


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

الاتصال بالعقد


ملاحظة: يمكنك بدء اتصال من Erlang / Elixir أو Java عن طريق إرسال رسالة تلقائيًا باستخدام تنسيق {, } Node {, } أو بواسطة PID (إن وجد).

يمكنك بدء الاتصال بين العقد عن طريق إرسال رسالة ping من Erlang من خلال net_adm:ping/1 :


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

من الممكن أيضًا إرسال رسالة إلى {Name, Node} ، حيث Node هي ذرة النموذج 'java@localhost' ، و Name هو PID أو اسم صندوق البريد المسجل الموجود على جانب Java.


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

إذا كان صندوق البريد موجودًا على جانب Java ، فسوف يتلقى رسالة.


إرسال رسالة من Java


Mailbox كاملة من طرق send التي تقدم:


  • إرسال ( ErlangPid ، ErlangTerm ) - يرسل رسالة إلى PID محلي أو بعيد ؛
  • send ( String ، ErlangTerm ) - يرسل المصطلح إلى صندوق البريد المحلي باسمه لنفس العقدة ؛
  • send ( String ، String ، ErlangTerm ) - يرسل رسالة إلى عقدة بعيدة / محلية وصندوق بريد باسمه.

لنجربها ، افتح Erlang-shell وقم بتسجيله باسم ... 'shell' :


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

الآن ، يمكننا إرسال رسالة من Java (سيتم إنشاء الاتصال مع العقدة تلقائيًا):


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

نعود إلى إرلانج ونقرأ الرسالة المستلمة:


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

استقبال الرسائل في جافا


لتلقي رسالة واردة ، يجب عليك استخدام إحدى طرق Mailbox : receive() أو receive(timeout, timeUnit) ، والتي يمكن أن تنتظر إلى ما لا نهاية رسالة جديدة أو فترة زمنية ثابتة.


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

ابدأ عقدة Erlang وأرسل رسالة:


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

الخلاصة


يمكن دراسة هذه والعديد من الأمثلة الأخرى على موقع المشروع و / أو على صفحة GitHub .

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


All Articles