SORU
29 Mayıs 2011, Pazar


Eğer bir özel durum sona değil, Akka Aktör

Şu anda Akka başlamak için çalışıyorum ve garip bir sorunla karşı karşıyayım. Benim Aktör için aşağıdaki kodu var:

class AkkaWorkerFT extends Actor {
  def receive = {
    case Work(n, c) if n < 0 => throw new Exception("Negative number")
    case Work(n, c) => self reply n.isProbablePrime(c);
  }
}

Ve bu benim işçim başlar

val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start());
val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start()

Ve bu her şeyi kapatıyoruz

futures.foreach( _.await )
router ! Broadcast(PoisonPill)
router ! PoisonPill

Şimdi olursa işçiler n ^ ile mesaj göndermek . 0 (hiçbir istisnası atılır), her şey düzgün çalışır ve uygulamanın düzgün bir şekilde kapatır. Ancak, en kısa sürede göndermek için bir tek mesaj sonuçlarında bir istisna uygulaması değildir sonlandırma çünkü orada hala çalışan bir aktör, ama çözemedim nereden geliyor.

Yardımcı olur diye, bu söz konusu iplik yığını:

  Thread [akka:event-driven:dispatcher:event:handler-6] (Suspended) 
    Unsafe.park(boolean, long) line: not available [native method]  
    LockSupport.park(Object) line: 158  
    AbstractQueuedSynchronizer$ConditionObject.await() line: 1987   
    LinkedBlockingQueue<E>.take() line: 399 
    ThreadPoolExecutor.getTask() line: 947  
    ThreadPoolExecutor$Worker.run() line: 907   
    MonitorableThread(Thread).run() line: 680   
    MonitorableThread.run() line: 182   

Sonlandırıcı olmayan iş parçacığı, işçi iş parçacığı değil, postStop geri ekledim çünkü, her biri düzgün durur. PS:

PPS: Actors.registry.shutdownAll sorun geçici çözümler ama shutdownAll sadece son çare olarak kullanılması gerektiğini düşünüyorum, değil mi?

CEVAP
11 Kasım 2011, Cuma


Akka aktörler içinde sorunları çözmenin en doğru yöntemi bir özel durum için değil, Gözetmen hiyerarşileri ayarlamak için değil

"Eşzamanlı kod bir özel durum atma (hadi kullanıyoruz varsayalım -bağlı olmayan aktörler), sadece iplik patlayacak şu anda yürütür aktör.

Bir şeyler yanlış gitti bulmak için bir yolu (dışında yok teftiş yığın izleme). Bu konuda yapabileceğin bir şey yok."

Fault Tolerance Through Supervisor Hierarchies (1.2) bkz

* * notyukarıdaki Akka eski sürüm (1.2)için de geçerlidir Yeni sürümleri (örneğin 2.2) hala yönetici hiyerarşi oluşturmak istiyorum ama İstisnalar alt işlemler tarafından atılan tuzak. örneğin

class Child extends Actor {
    var state = 0
    def receive = {
      case ex: Exception ⇒ throw ex
      case x: Int        ⇒ state = x
      case "get"         ⇒ sender ! state
    }
  }

Danışmanı:

class Supervisor extends Actor {
    import akka.actor.OneForOneStrategy
    import akka.actor.SupervisorStrategy._
    import scala.concurrent.duration._

    override val supervisorStrategy =
      OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
        case _: ArithmeticException      ⇒ Resume
        case _: NullPointerException     ⇒ Restart
        case _: IllegalArgumentException ⇒ Stop
        case _: Exception                ⇒ Escalate
      }

    def receive = {
      case p: Props ⇒ sender ! context.actorOf(p)
    }
  }

Fault Tolerance Through Supervisor Hierarchies (2.2) bkz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Россия

    Google Ро

    9 Temmuz 2007
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • Julian Smith

    Julian Smith

    31 EKİM 2006