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
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)
}
}
özel durum "ben İllegalStateExcep...
Neden eğer sözlük anahtarı varsa kontr...
Özel durum yakalandı Java değil mi?...
Eğer sonunda bir blok bir özel durum o...
Eğer özel HTML öznitelikleri değil...