Xml scala中try的递归调用

Xml scala中try的递归调用,xml,scala,Xml,Scala,问题1)我试图在scala中从YQL提取货币。下面提到的getXML获取RESTURL并返回xml节点。在我的主代码中,我想再次调用getXML,以防在10000毫秒的睡眠后发生故障 当我试图在失败代码未编译的情况下在内部生成getXML时,请告知如何实现 def getXML(url: String): Try[scala.xml.Node] = { Try(XML.loadString(Source.fromURL(new URL(url)).mkString)) } va

问题1)我试图在scala中从YQL提取货币。下面提到的getXML获取RESTURL并返回xml节点。在我的主代码中,我想再次调用getXML,以防在10000毫秒的睡眠后发生故障

当我试图在失败代码未编译的情况下在内部生成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) 还有一个问题。我是编程新手,scala也有点结结巴巴。 我定义了一个函数

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)时,我得到了“类型不匹配;发现:任何必需的: “字符串”


提前感谢。

您需要使用
recoverWith
故障中恢复
,然后使用另一个
尝试。一个简单的用法如下所示:

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

另一个潜在的问题是它是阻塞代码。根据您的使用情况,这可能没问题,但是如果您的程序需要并发,您可以考虑使用<代码>将来<代码>而不是<代码>尝试< /COD>。
getXML
的实现几乎完全相同,尽管它的用法会有很大不同。

谢谢m-z。此函数的输出将是Try。我是否需要进行模式匹配才能获得唯一的成功,以便获得scala.xml.Node?我这样问是因为这个函数的输出将被用作另一个接受scala.xml.nodeeyes的函数的输入,您必须对这个函数的返回值进行模式匹配或
map
,因为仍然存在失败的可能性。还有最后一个问题。我是编程新手,scala有点结结巴巴。@user3341078这应该是另一个问题。
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)
            }
        }
}