2016-08-09 40 views
0

So wurde ich Tutorial über akka Lesen und kam in dieser http://manuel.bernhardt.io/2014/04/23/a-handful-akka-techniques/ und ich glaube, er erklärt es ziemlich gut, ich habe einfach scala vor kurzem und über Schwierigkeiten mit dem Tutorial mit,Unterschied zwischen RoundRobinRouter und RoundRobinRoutinglogic

Ich frage mich, was ist der Unterschied zwischen RoundRobinRouter und der aktuellen RoundRobinRouterLogic? Offensichtlich ist die Implementierung ganz anders.

Bisher war die Implementierung von RoundRobinRouter ist

val workers = context.actorOf(Props[ItemProcessingWorker].withRouter(RoundRobinRouter(100))) 

mit processBatch

def processBatch(batch: List[BatchItem]) = { 

    if (batch.isEmpty) { 
     log.info(s"Done migrating all items for data set $dataSetId. $totalItems processed items, we had ${allProcessingErrors.size} errors in total") 
    } else { 
     // reset processing state for the current batch 
     currentBatchSize = batch.size 
     allProcessedItemsCount = currentProcessedItemsCount + allProcessedItemsCount 
     currentProcessedItemsCount = 0 
     allProcessingErrors = currentProcessingErrors ::: allProcessingErrors 
     currentProcessingErrors = List.empty 

     // distribute the work 
     batch foreach { item => 
     workers ! item 
     } 
    } 

    } 

Hier ist meine Implementierung von RoundRobinRouterLogic

var mappings : Option[ActorRef] = None 

    var router = { 
    val routees = Vector.fill(100) { 
     mappings = Some(context.actorOf(Props[Application3])) 
     context watch mappings.get 
     ActorRefRoutee(mappings.get) 
    } 
    Router(RoundRobinRoutingLogic(), routees) 
    } 

und behandelt, um die processBatch als solche

def processBatch(batch: List[BatchItem]) = { 

    if (batch.isEmpty) { 
     println(s"Done migrating all items for data set $dataSetId. $totalItems processed items, we had ${allProcessingErrors.size} errors in total") 
    } else { 
     // reset processing state for the current batch 
     currentBatchSize = batch.size 
     allProcessedItemsCount = currentProcessedItemsCount + allProcessedItemsCount 
     currentProcessedItemsCount = 0 
     allProcessingErrors = currentProcessingErrors ::: allProcessingErrors 
     currentProcessingErrors = List.empty 

     // distribute the work 
     batch foreach { item => 
     // println(item.id)    
     mappings.get ! item 
     } 
    } 
    } 

Ich kann dieses Tutorial irgendwie nicht ausführen, und es ist an dem Punkt fest, wo es die Batch-Liste iteriert. Ich frage mich, was ich falsch gemacht habe.

Dank

Antwort

1

Eigentlich mißverstanden ich die Methode, und fand heraus, die Lösung RoundRobinPool in http://doc.akka.io/docs/akka/2.3-M2/project/migration-guide-2.2.x-2.3.x.html wie angegeben zu verwenden, war

Zum Beispiel RoundRobinRouter wurde umbenannt in RoundRobinPool oder RoundRobinGroup abhängig davon, welchen Typ Sie tatsächlich verwenden.

von

val workers = context.actorOf(Props[ItemProcessingWorker].withRouter(RoundRobinRouter(100))) 

zu

val workers = context.actorOf(RoundRobinPool(100).props(Props[ItemProcessingWorker]), "router2") 
1

In erster Linie müssen Sie diff zwischen ihnen unterscheiden.

RoundRobinRouter ist ein Router, der Round-Robin verwendet, um eine Verbindung auszuwählen.

Während RoundRobinRoutingLogic Round-Robin verwendet eine routee wählen

Sie eigene RoutingLogic zur Verfügung stellen kann (es hat mir geholfen, zu verstehen, wie Akka unter der Haube arbeitet)

class RedundancyRoutingLogic(nbrCopies: Int) extends RoutingLogic { 
    val roundRobin = RoundRobinRoutingLogic() 
    def select(message: Any, routees: immutable.IndexedSeq[Routee]): Routee = { 
    val targets = (1 to nbrCopies).map(_ => roundRobin.select(message, routees)) 
    SeveralRoutees(targets) 
    } 
} 

Link auf doc http://doc.akka.io/docs/akka/2.3.3/scala/routing.html ps Dieses Dokument ist sehr klar, und es hat mir geholfen, die

+0

Thanks :) Art_Rebel – kenlz

+0

wenn es nützlich ist, markieren Sie diesen Beitrag als beantwortet, bitte. – pacman

+0

Markierte es als nützlich, ich suchte nach der Ersatzimplementierung für RoundRobinRouter :) – kenlz