2014-11-13 4 views
0

나는 간단한 스프레이 REST 응용 프로그램에서 spark로 작업 중이며 다음과 같은 코드가 있습니다 (스프레이 템플릿에서 생성 됨). json 지원과 List of Businesses를 반환하는 추천 프로그램을 포함하도록 수정했습니다. 어떤 이유로 타임 아웃 매개 변수를 무한대로 지정했지만 요청 시간이 초과되었습니다. 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 내가 잘못된 기술을 택한 것처럼 보이고 포럼에서 지원이 거의 없다. 서버는 시간 초과 오류가있는 클라이언트에 즉시 반환되지만 권장 사항은 백그라운드에서 실행됩니다. 나는 많은 설정 값으로 플레이했지만 여전히 그것을 좋아하지 않는 것 같습니다. 어떤 도움이라도 대단히 감사하겠습니다. 와스프레이로 서버 요청 시간 초과

case class Business(name:String) 
object MyProtocol extends DefaultJsonProtocol with SprayJsonSupport{ 
    implicit val elementFormat = jsonFormat1(Business) 
} 

trait MyService extends HttpService { 
import MyProtocol._ 

val myRoute = { 

     path("") { 
     get { 
      respondWithMediaType(`application/json`) { 
      complete(Recommender.recommend(1000)) // times out 
      complete('some html') // works immediately 
      } 
    } 
} 

def Recommend(userId: Int) : List[Business] = { 
    ...................... 
} 

application.conf 

spray.can { 
    server { 
    request-timeout = infinite 
    } 
} 
+0

귀하의 예는 나를 위해 작동 : https://gist.github.com/jrudolph/e6bb940a341f46873cd5. 요청 시간 초과가 유일한 시간 초과 설정이 아닙니다. 또한 설정할 수있는'spray.can.server.idle-timeout'도 있습니다. – jrudolph

답변

0

시도 :

// In some file, define yopur model 
case class Business(name: String, age: Int) 
object MyProtocol extends DefaultJsonProtocol with SprayJsonSupport{ 
    implicit val elementFormat = jsonFormat2(Business) 
} 

// In other file 
trait MyService extends HttpService { 
    import MyProtocol._ 

    val myRoutes = { 
    path("sthnotverytimeconsuming") { 
     get { 
     complete { 
      doRequest() 
     } 
     } 
    } ~ 
    path("sthverytimeconsuming") { 
     get { 
     complete { 
      doTimeConsumingRequest() 
     } 
     } 
    } 
    } 

    private def doRequest(): Future[List[Business]] = { 
    Future{ 
     val result : List[Business] = // ... do something that take times but not very long 
     result 
    } 
    } 

    private def doTimeConsumingRequest(): Future[List[Business]] = { 
    Future{ 
     // ... you can do something that take a long time here 
    } 
    val result : List[Business] = //... 
    result //... this will return immediately 
    } 
}