سؤال

أود أن استخدام الجهات الفاعلة في البرنامج حيث سوف يكون نوعا من تقييد حول علاج بعض الجهات كما لو كانوا على قوائم الانتظار.على سبيل المثال, لنفترض أن لدي بعض خارجي النظام الذي أحداث التغيير يتم تطبيقها أيضا بعض ذاكرة التخزين المؤقت الخارجية بيانات النظام.لذلك لدي 2 الفاعلة:

  1. ChangeApplicationActor
  2. CacheActor

كجزء من ChangeApplicationActor, عندما أتقدم بطلب تغيير بعض الكيان X في نظام خارجي, أريد أن أرسل بعض الأحداث لنقول CacheActor المزامنة:

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

ولكن لدي الآن شرطين:

  1. على CacheActor وقد الحالة الداخلية و من الناحية المثالية أود أن عملية لها Sync تعليمات بالتتابع
  2. إذا كنت في نهاية المطاف مع CacheActor's علبة تحتوي على اثنين Sync(x) تعليمات نفس قيمة x, ثم أود أن تجاهل ثانية واحدة (أييجب أن يكون واحد فقط في انتظار Sync تعليمات أي قيمة x)

هل هناك أي طريقة من إجبار فاعل أن يكون واحد الخيوط ؟ هل هناك أي طريقة يمكنني الوصول إلى الفاعل علبة وإزالة أي تكرار الأحداث ؟ هل يمكنني تجنب تنفيذ CacheActor كما أم ، لا فاعل?

هل كانت مفيدة؟

المحلول

فاعل يضمن تنفيذ فقط على موضوع واحد في وقت واحد ، و الرسائل في الفاعل علبة البريد في أجل FIFO, لذلك #1 هناك.

2 هو اصعب حيث لا يوجد دعم مدمج لذلك.هناك سمة على الفاعل يسمى "علبة البريد." يمكنك الوصول إلى علبة البريد مباشرة بدلا من خلال تلقي أو رد فعل.كل ما عليك القيام به هو سحب استدعاء مطابقة مزامنة الرسائل من علبة البريد قبل أن تتم معالجة الرسالة.عند القيام بذلك, يجب أن تزامن على الفاعل من أجل الحفاظ على ترابط آخر من محاولة إضافة الأشياء إلى علبة البريد من خلال رسالة ترسل.

وتجدر الإشارة إلى أن تزامن على الفاعل يزيل الجمود الحرية الضمانات المقدمة من قبل المكتبة ، سوف يقلل من قابلية.ولكن من وجهة النظر العملية ربما سوف تكون على ما يرام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top