2014-12-01 13 views
6

Ho un progetto MVC di Maven spring molto semplice e ho aggiunto Scala. Voglio che i seguenti tre futuri vengano eseguiti simultaneamente come dovrebbero. Tuttavia eseguono uno dopo l'altroScala Futures non in parallelo

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

La mia macchina ha 4 core e sto usando scala.concurrent.ExecutionContext.Implicits.global contesto. Oltre a questo non esiste una configurazione che possa impedire/abilitare l'esecuzione parallela dei futures.

risposta

8

Per la comprensione sono solo zucchero sintattico e sono translated to flatMap like in Example 2.

Il che significa che il codice sarà più o meno simile a questa:

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

Come vedete Future s sono solo in fase di lancio dopo la precedente completato. Per aggirare il problema della prima accensione del Future s e poi fare il per la comprensione:

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

Grazie Akos per il chiarimento. Ho incompreso in precedenza per comprensione. – Robin