2015-11-26 7 views
5

के बाद अभिनेता के नाम का हमेशा पुन: उपयोग नहीं कर सकता है मैंने अभिनेताओं के लिए अक्का के "ग्रेसफुल स्टॉप" का अध्ययन किया और इसका परीक्षण करने के लिए एक छोटा परीक्षण ऐप बनाया।सुंदर स्टॉप

आवेदन से पता चलता है कि "मनोहर बंद करो" http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Graceful_Stop में उल्लेख नहीं हमेशा गारंटी नहीं है कि आप पुन: उपयोग कर सकते हैं शान से अभिनेता का नाम बंद कर दिया।

हर अब और फिर निम्नलिखित अपवाद प्रकट होता है:

Exception in thread "main" akka.actor.InvalidActorNameException: actor name [DummyActor] is not unique! 

कि क्यों है? मैं ऐप को कैसे ठीक कर सकता हूं ताकि अवैध डोमेन नाम अपवाद अब और फिर प्रकट न हों?

मुख्य वर्ग ...

import akka.actor._ 
import akka.pattern.gracefulStop 
import DummyActor.Stop 
import DummyActor 

import scala.concurrent.duration._ 
import scala.concurrent.{Await, Future} 

object AkkaTest { 
    def main(args: Array[String]) { 

    val actorsystem = ActorSystem("testSystem") 

    1 to 5 foreach { _ => 

     // Create an actor with name: DummyActor 
     val dummyActor = actorsystem.actorOf(Props[DummyActor], "DummyActor") 

     // Gracefully stop the DummyActor 
     val stopped: Future[Boolean] = gracefulStop(dummyActor, 5 seconds, Stop) 
     Await.result(stopped, 6 seconds) 
    } 

    val terminated: Future[Terminated] = actorsystem.terminate() 
    Await.result(terminated, 10 seconds) 

    System.out.println("Finished successfully. Try again, eventually it will fail. You can also increase the amount of loops.") 
    } 
} 

और अभिनेता ...

import akka.actor.Actor 
import DummyActor.Stop 

object DummyActor { 
    case object Stop 
} 

class DummyActor extends Actor { 

    override def receive: Receive = { 
    case Stop => context stop self 
    } 

} 

मैं स्काला 2.11.7 और जावा 8 और अक्का के साथ है:

यहाँ कोड है 2.4.0।

+3

लिंक आप जुड़ा हुआ है और यहां इसके बाद पर हमनाम शुरू: चेतावनी कि एक अभिनेता को रोकने और उसके नाम विपंजीकृत की जा रही अलग घटनाओं जो एसिंक्रोनस रूप से हो रहे हैं ध्यान में रखें एक दूसरे से। इसलिए यह हो सकता है कि आपको gracefulStop() लौटाए जाने के बाद भी नाम का उपयोग मिल जाएगा। उचित अपंजीकरण की गारंटी के लिए, केवल पर्यवेक्षक के भीतर से नामों का पुन: उपयोग करें और केवल एक समाप्ति संदेश के जवाब में, यानी शीर्ष-स्तरीय कलाकारों के लिए नहीं। तो पर्यवेक्षक अभिनेता बनाएं और केवल 'समाप्ति' रिसेप्शन पर नामांकन शुरू करें – Odomontois

उत्तर

7

सराहना awfull स्वरूपण तो है, मैं इसे यहाँ कॉपी करेंगे

मैं सिर्फ लिंक का पालन किया और रेड एलर्ट यहाँ

चेतावनी

ध्यान रखें कि एक अभिनेता रोक पाया और इसका नाम अपंजीकृत किया जा रहा है अलग-अलग घटनाएं जो एक-दूसरे से असीमित रूप से होती हैं। इसलिए हो सकता है कि आपको gracefulStop() लौटाए जाने के बाद भी नाम का उपयोग मिल जाएगा। उचित अपंजीकरण की गारंटी के लिए, केवल पर्यवेक्षक के भीतर से नामों का पुन: उपयोग करें, आप पर नियंत्रण करते हैं और केवल Terminated संदेश के जवाब में, यानी शीर्ष-स्तर कलाकारों के लिए नहीं।

तो पर्यवेक्षक अभिनेता बनाने के लिए और केवल Terminated स्वागत