2014-12-01 10 views
6

Ich habe ein sehr einfaches Maven Spring MVC Projekt und ich fügte Scala hinzu. Ich möchte, dass die folgenden drei Futures gleichzeitig so ausgeführt werden, wie sie sollen. Doch sie einer nach dem anderenScala Futures läuft nicht parallel

val viewName: Future[String] = for { 
    profileSync <- Future { EmployeeLocalServiceUtil.syncProfileInformation() } 
    earningsSync <- Future { EmployeeLocalServiceUtil.syncEarnings() } 
    reimbursementSync <- Future { EmployeeLocalServiceUtil.syncReimbursements() } 
} yield { 
    "employee/view" 
} 

Meine Maschine auszuführen hat 4 Kerne und ich bin mit scala.concurrent.ExecutionContext.Implicits.global Kontext. Abgesehen davon gibt es keine Konfiguration, die eine parallele Ausführung der Futures verhindern/ermöglichen kann.

Antwort

8

Für Verständnis sind nur syntaktischer Zucker und sind translated to flatMap like in Example 2.

Welches ist Ihr Code bedeutet, wird in etwa wie folgt aussehen:

Future { ??? }.flatMap { profileSync => 
    Future { ??? }.flatMap { earningsSync => 
    Future { ??? }.map { reimbursementSync => 
     // Able to access profileSync/earningsSync/reimbursementSync values. 
     "employee/view" 
    } 
    } 
} 

Wie Sie Future s sehen sind erst nach der abgeschlossenen vorherigen ins Leben gerufen. Um dies zu umgehen ersten Ihre Future s beginnen und dann tut das für das Verständnis:

val profileSyncFuture = Future { EmployeeLocalServiceUtil.syncProfileInformation()  } 
val earningsSyncFuture = Future { EmployeeLocalServiceUtil.syncEarnings()  } 
val reimbursementSyncFuture = Future { EmployeeLocalServiceUtil.syncReimbursements()  } 

val viewName: Future[String] = for { 
    profileSync <- profileSyncFuture 
    earningsSync <- earningsSyncFuture 
    reimbursementSync <- reimbursementSyncFuture 
} yield { 
    "employee/view" 
} 
+0

Dank Akos für die Klarstellung. Ich habe das für das Verständnis vorher missverstanden. – Robin