2015-02-02 2 views
2

문제 1) YQL에서 scala로 통화를 추출하려고합니다. 아래에 언급 된 getXML은 나머지 URL을 가져와 xml 노드를 반환합니다. 내 주 코드에서 10000 밀리 초의 수면 후 실패가 발생하면 getXML을 다시 호출하고 싶습니다.scala에서 try 재귀 호출

오류 코드 내에 getXML을 만들려고 할 때 어떻게 컴파일 할 수 있는지 조언 해 주시면 컴파일되지 않습니다.

def getXML(url: String): Try[scala.xml.Node] = 
{ 

Try(XML.loadString(Source.fromURL(new URL(url)).mkString)) 

} 


val nodes = getXML(ccyurl) match { 
    case Success(node) => node 
    case Failure(f) => { 
     Thread.sleep(10000) 
     /****/ 
} 

문제 2) 하나 더 질문드립니다. 나는 프로그래밍에 익숙하지도 않고 너무나 비틀 거리는 스칼라도있다. 나는

def exchangelookup(s :String): Try[String] = Try(exchange_currency_map(s)) 

그것의 사용은 아래에 언급처럼오고 함수를 정의하고이 배열의 항목 4입니다.

exchangelookup(Cols(0).takeRight(3)) match {case Success(x) => x 
           case Failure(x) =>  FileParserlogger.error(x.getMessage()) } , //ExchangeCurrency 4 

하지만 난 정적 (4) 내가 점점 오전 같은 다른 배열이 사용하고 때 "형식이 일치, 발견 : 모든 필요한 : 문자열"사전에

val fxconversion = fxconvertor(getexchange(nodes,static(10)),getexchange(nodes, exchange_to_real_ccy_map.getOrElse(static(4),static(4)))) 

감사합니다.

답변

2

Failure에서 복구하려면 recoverWith을 사용해야하고 Try을 사용해야합니다. 간단한 사용법은 다음과 같을 것이다 : (너무 깊이 재귀에서 스택 오버 플로우를 돌 때까지 영원히에 의해, 내 말은)는 성공하지 못할 경우

def getXML(url: String): Try[scala.xml.Node] = { 
    Try(XML.loadString(io.Source.fromURL(new URL(url)).mkString)) 
     .recoverWith { 
      case _ => {Thread.sleep(10000); getXML(url)} 
     } 
} 

그러나,이 영원히 실행됩니다, 우리는 아마하지 않는 필요. 그러나 최대 재시도 횟수를 계산하는 카운터를 추가하는 것은 쉽습니다.

def getXML(url: String)(retries: Int): Try[scala.xml.Node] = { 
    Try(XML.loadString(io.Source.fromURL(new URL(url)).mkString)) 
     .recoverWith { 
      case _ if(retries > 0) => { 
       Thread.sleep(10000) 
       getXML(url)(retries - 1) 
      } 
     } 
} 

또 다른 잠재적 인 문제점은 차단 코드 때문입니다. 사용 사례에 따라 다르 겠지만 프로그램에 동시성이 필요하면 Try 대신 Future을 사용하는 것이 좋습니다. getXML의 구현은 거의 동일하지만 사용법은 매우 다를 수 있습니다.

+0

감사합니다. m-z. 이 함수의 출력은 Try입니다. 내가 패턴 일치를해야만 성공을 얻을 수있어서 scala.xml.Node를 얻을 수 있습니까? 이 함수의 출력이 scala.xml을 받아들이는 다른 함수의 입력으로 사용되기 때문에 묻습니다. 노드 – user3341078

+0

예,이 함수의 반환 값을 패턴 일치 또는'map '해야합니다. 실패 가능성. –

+0

또 하나 마지막 질문. 나는 프로그래밍에 익숙하지도 않고 너무나 비틀 거리는 스칼라도있다. – user3341078