Не удается найти неявный ExecutionContext. Вы могли бы пройти спрей Скала

У меня есть две ошибки:

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
               ^

Мой код:

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()
}
 }

}`

person kam kimo    schedule 23.10.2015    source источник


Ответы (1)


Вам нужно import scala.concurrent.ExecutionContext.Implicits.global как ошибку указать.

Вы видите, что метод sendReceive имеет параметр implicit executionContext: scala.concurrent.ExecutionContext.

--редактировать--

Этот ответ получает много просмотров, поэтому я хочу его обновить. Как вы видите, это глобальный контекст выполнения по умолчанию, объявленный как;

/**
 * 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)

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

person Fatih Donmez    schedule 23.10.2015
comment
ваш ответ правильный, но @Fatih Donmez Я хочу уклониться, когда делаю log.info (высота горы Эверест: {} м, result.toString().decodeOption.get), но все время у меня ошибка: Ошибка :(54, 76) расходящееся неявное расширение для типа argonaut.DecodeJson[A], начиная с метода SetDecodeJson в трейте DecodeJsons log.info(Высота горы Эверест: {} m, result.toString().decodeOption.get) ^ - person kam kimo; 23.10.2015
comment
Я думаю, вам следует создать для него еще один вопрос. - person Fatih Donmez; 23.10.2015
comment
Я не могу, я исчерпал свой лимит вопросов :'( :( - person kam kimo; 23.10.2015
comment
Я понятия не имею для этого второго вопроса. Вот почему я попросил вас создать новый. Потому что кто-то другой может помочь вам с более подробным новым вопросом. Если мой ответ решает ваш основной вопрос, пожалуйста, одобрите его. - person Fatih Donmez; 23.10.2015
comment
можешь опубликовать решение? - person SaKou; 18.02.2016
comment
Что здесь подразумевается? - person Seraf; 19.02.2018
comment
Это имя пакета. - person Fatih Donmez; 20.02.2018