Xml scala中try的递归调用
问题1)我试图在scala中从YQL提取货币。下面提到的getXML获取RESTURL并返回xml节点。在我的主代码中,我想再次调用getXML,以防在10000毫秒的睡眠后发生故障 当我试图在失败代码未编译的情况下在内部生成getXML时,请告知如何实现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
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)
}
}
}