2014-11-13 16 views
0

Я работаю над простым применением REST с применением искры, и у меня есть следующий код (созданный с помощью шаблона спрея). Я изменил его, включив поддержку json и некоторую рекомендательную программу, которая возвращает список предприятий. По какой-то причине запрос истекает, хотя я задал параметр тайм-аута бесконечным. может кто-то сказать мне, что я делаю неправильно? похоже, я принял неправильный выбор технологий, и поддержка на форумах очень меньше. Рекомендатор работает в фоновом режиме, хотя сервер немедленно возвращается клиенту с ошибкой таймаута. Я играл с множеством значений конфигурации, но мне все равно не нравится. любая помощь очень ценится.Время запроса сервера с помощью Spray

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 
    } 
} 
Смежные вопросы