2015-10-23 10 views
6

ho questo due erros:Impossibile trovare un ExecutionContext implicito. Si potrebbe passare a spruzzo Scala

Error:(39, 20) Cannot find an implicit ExecutionContext. You might pass 
an (implicit ec: ExecutionContext) parameter to your method 
or import scala.concurrent.ExecutionContext.Implicits.global. 
    val pipeline = sendReceive 

      ^

Error:(39, 20) not enough arguments for method sendReceive: (implicit refFactory: akka.actor.ActorRefFactory, implicit executionContext: scala.concurrent.ExecutionContext, implicit futureTimeout: akka.util.Timeout)spray.client.pipelining.SendReceive. 
Unspecified value parameter executionContext. 
    val pipeline = sendReceive 
      ^

il mio codice è:

import scala.util.{Success, Failure} 
import scala.concurrent.duration._ 
import akka.actor.ActorSystem 
import akka.pattern.ask 
import akka.event.Logging 
import akka.io.IO 
import spray.can.Http 
import spray.client.pipelining._ 
import spray.util._ 
import argonaut._, Argonaut._ 

object test { 

case class Elevation(location: Location, elevation: Double) 

case class Location(lat: Double, lng: Double) 

case class GoogleApiResult(status: String, results: List[Elevation]) 

implicit def locationFormat: CodecJson[Location] = casecodec2(Location.apply, Location.unapply)("lat", "lng") 

implicit def elevationFormat: CodecJson[Elevation] = casecodec2(Elevation.apply, Elevation.unapply)("location", "elevation") 

implicit def googleApiResultFormat: CodecJson[GoogleApiResult] = casecodec2(GoogleApiResult.apply, GoogleApiResult.unapply)("status", "results") 


object Main extends App { 
// we need an ActorSystem to host our application in 
implicit val system = ActorSystem("simple-spray-client") 

// execution context for futures below 
val log = Logging(system, getClass) 

log.info("Requesting the elevation of Mt. Everest from Googles Elevation API...") 

val pipeline = sendReceive 

val responseFuture= pipeline { 
    Get("http://maps.googleapis.com/maps/api/elevation/json?locations=27.988056,86.925278&sensor=false") 
} 

responseFuture.onComplete { 
    case Success(result) => 
    println(result) 
    log.info("The elevation of Mt.Everest is: {} m", result.toString.decodeOption[Elevation].get) 
    shutdown() 

    case Failure(error) => 
    log.error(error, "Couldn't get elevation") 
    shutdown() 
} 
def shutdown(): Unit = { 
    IO(Http).ask(Http.CloseAll)(1.second).await 
    system.shutdown() 
} 
} 

}` 

risposta

20

È necessario import scala.concurrent.ExecutionContext.Implicits.global come errore di specificare.

Si vede il metodo ha il parametro implicit executionContext: scala.concurrent.ExecutionContext.

--edit--

Questa risposta è sempre un sacco di vista quindi voglio aggiornarlo. Come vedi questo è il contesto di esecuzione globale predefinito, dichiarato come;

/** 
* The implicit global `ExecutionContext`. Import `global` when you want to provide the global 
* `ExecutionContext` implicitly. 
* 
* The default `ExecutionContext` implementation is backed by a work-stealing thread pool. By default, 
* the thread pool uses a target number of worker threads equal to the number of 
* [[https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#availableProcessors-- available processors]]. 
*/ 
implicit lazy val global: ExecutionContextExecutor = impl.ExecutionContextImpl.fromExecutor(null: Executor) 

Utilizza il pool di sottrazione di lavoro predefinito. Quindi potrebbe essere necessario fornire diversi tipi di contesto di esecuzione per diversi tipi di esigenze di concorrenza.

+0

la tua risposta è corretta ma @Fatih Donmez voglio evation quando ho fatto log.info ("L'elevazione di Mt.Everest è: {} m", result.toString(). DecodeOption.get) ma tutto il tempo Ho errore: Errore: (54, 76) espansione implicita divergente per tipo argonaut.DecodeJson [A] a partire dal metodo SetDecodeJson in tratto DecodeJsons log.info ("L'elevazione di Mt.Everest è: {} m", risultato .toString(). decodeOption.get) ^ –

+0

Penso che dovresti creare un'altra domanda per questo. –

+0

Non riesco a raggiungere il limite della mia domanda: '(:( –