2015-03-11 3 views
0

У меня есть актер, который направляет сообщения группе других актеров, которые выступают в качестве оберток поверх энергозависимой службы. Пока все отлично, но я хотел бы иметь возможность контролировать, сколько действующих действующих лиц действует на этой службе (поскольку они могут представлять соединения сокетов или другие физические свойства), поэтому beign, способный управлять масштабированием, будет приятным.Удалите маршрут от маршрута и получите ядовитую таблетку?

Я вижу, что на маршрутизаторе есть метод удаления маршрута, и он удаляет маршруты, но есть ли способ отправить ядовитую таблетку моим дочерним актерам прежде, чем они будут удалены? Документы говорят, что сообщение о ядовитой таблетке должно появиться при удалении маршрута таким образом, но я этого не вижу.

У меня есть подобный код

final Collection<Routee> routees = JavaConversions.asJavaCollection(router.routees()); 

for (final Routee routee : routees.stream() 
            .limit(numberToRemove) 
            .collect(toList())) { 

    router = router.removeRoutee(routee); 
} 
+0

Я думаю, что метод 'removeRoutee' отправляет' PoisonPill' на указанный «Маршрут». Что именно вы хотите достичь? Что вы подразумеваете под *, есть ли способ отправить ядовитую таблетку моим дочерним актерам прежде, чем они будут удалены * точнее? – ale64bit

+0

Я думал, что это тоже будет, но это не выглядит. Таким образом, в основном он перестанет отслеживать маршрут, но актер все еще активен. Это имеет смысл, поскольку я могу повторно использовать его для чего-то другого. Похоже, мне нужно просто получить ссылку на референт актера из списка маршрутизаторов и вручную отправить ему ядовитую таблетку, отключить контекст и удалить ее из списка маршрутизации – devshorts

ответ

0

Так выглядит, как я пропускал тот факт, что я должен был послать яд таблетки вручную, чтобы остановить мой маршрутизатор. Вот полное приложение для демонстрации scala

import akka.actor._ 
import akka.routing._ 

case class Add() 

case class Remove() 

class Worker(id: Integer) extends UntypedActor { 
    println(s"Made worker $id") 

    @throws[Exception](classOf[Exception]) override 
    def preStart(): Unit = { 
    println(s"Starting $id") 
    } 

    @throws[Exception](classOf[Exception]) override 
    def postStop(): Unit = { 
    println(s"Stopping $id") 
    } 

    @throws[Exception](classOf[Exception]) 
    override def onReceive(message: Any): Unit = message match { 
    case _ => println(s"Message received on actor $id") 
    } 
} 

class Master extends Actor { 

    var count = 0 

    def makeWorker() = { 
    val id = count 

    count = count + 1 

    context.actorOf(Props(new Worker(id))) 
    } 

    var activeWorkers = Seq.fill(2) { 
    makeWorker() 
    } 

    var router = Router(RoundRobinRoutingLogic(), activeWorkers.map(r => { 
    context watch r 
    ActorRefRoutee(r) 
    }).toIndexedSeq) 

    def receive = { 
    case Remove => 
     println("Removing route") 

     val head = router.routees.head.asInstanceOf[ActorRefRoutee].ref 

     head ! PoisonPill 

     context unwatch head 

     router = router.removeRoutee(head) 

     printRoutes() 


    case Add => 
     println("Adding route") 

     val worker = makeWorker() 

     context watch worker 

     router = router.addRoutee(worker) 

     printRoutes() 


    case w: AnyRef => 

     printRoutes() 

     router.route(w, sender()) 
    } 

    def printRoutes(): Unit ={ 
    val size = router.routees.size 

    println(s"Total routes $size") 
    } 
} 

object Main extends App { 
    var system = ActorSystem.create("foo") 

    var master = system.actorOf(Props[Master]) 

    master ! "foo" 

    master ! Remove 

    master ! "foo" 

    master ! "bar" 

    master ! Add 

    master ! "biz" 
} 
Смежные вопросы