مرحبا بالجميع!
عندما يكون عليك التواصل من عالم 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;
ملاحظة: لكي يعمل المثال أعلاه ، يجب عليك إما تشغيل البرنامج الخفي EPMD
أو تطبيق Java الخاص به.
إنشاء صناديق البريد
صندوق البريد ، المعروف أيضًا باسم عملية ، في مصطلحات إرلانغ:
import io.appulse.encon.mailbox.Mailbox; Mailbox mailbox = node.mailbox() .name("popa")
الاتصال بالعقد
ملاحظة: يمكنك بدء اتصال من 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 .