2017-12-22 35 views
0
def resolve(url: String): Future[WSResponse] = ws.url(url).withFollowRedirects(true).get() 

def validateAllLinks(links: List[String]) = ??? 

어떻게 두 번째 기능을 해결 하시겠습니까?ScalaWS (Play!)와 동시에 http-URL 목록을 확인하는 방법은 무엇입니까?

def validateAllLinks(links: List[String]) = links.map(link => 
    Await.result(resolve(link), Duration.create(3, TimeUnit.SECONDS)) 
) 

이 접근 방식의 문제점 : 내가 얻을

  1. 내가 트래버스, Future.sequence, 기다리고 있습니다을 시도

    ...

    이 나의 가장 최근의 시도였다 TimeoutExceptions 및 MaxRedirectException 시도/catch 싶지 않아

  2. 솔루션이 작동한다고해도 솔루션이 동시라고 생각하지 않습니다.

미리 감사드립니다. 당신이 Future.sequenceAwait.result를 호출하는 경우가 완료 병렬 작업을 기다리는,

def validateAllLinks(links: List[String]): Future[List[WSResponse]] = 
    Future.sequence(links.map(resolve)) 

:

답변

2

그들은 병렬로 실행됩니다 Future.sequence을 자유롭게 사용

import scala.concurrent.duration._ 
def validateAllLinks(links: List[String]): List[WSResponse] = 
    Await.result(Future.sequence(links.map(resolve)), 10 seconds) 

그러나 Await.result은 나쁜 습관으로 간주되므로 Future을 반환해야하며 clien 그것을 다루는 방법을 결정하지 마라.

는 나쁜 관행 이유에 대해 좀 더 자세히 :

  1. https://monix.io/docs/2x/best-practices/blocking.html

  2. https://github.com/alexandru/scala-best-practices/blob/master/sections/4-concurrency-parallelism.md#45-should-not-block

+0

수정, 그러나 그것은하지 않는 이러한 접근 방식에 문제가 개별 요청에 대한 시간 초과 및 오류를 처리 할 수 ​​있습니다. 아마이 링크 : https://stackoverflow.com/questions/17466889/run-multiple-futures-in-parallel-return-default-value-on-timeout 도움이됩니다. – igorpcholkin

+0

맞아, 내 솔루션은 그것을 동시에 만들어야했다. 타임 아웃을 처리하려면 resolve 메소드에서'ws.url (url) .withRequestTimeout (timeout)'을 사용해야합니다. 그리고'resolve (..). 복구 (..)'는 어떤 테이블이 실패하고 어떤 테이블이 성공했는지를 이해하는데 사용되어야한다. – Feyyaz