MarkLogic CoRB任务报错:SEVERE: received more than 1 results: 1求助
问题:MarkLogic CoRB任务报错“received more than 1 results: 1”失败
运行MarkLogic CoRB任务预期返回100条记录,但任务因报错SEVERE: received more than 1 results: 1失败,相关脚本及异常信息如下:
URIs生成脚本(uris.xqy)
declare namespace lab = "http://labs.com/record"; declare namespace meta="http://labs.com/lab/record/meta"; let $org := ("Ros* Lab*") for $uri in cts:uris( (), (), cts:and-query(( cts:collection-query('/Lab'), cts:field-range-query("updated","<","2023-08-18"), cts:or-query(( cts:field-word-query("do",$org,"case-insensitive"), )) )) ) return (count($uri),$uri)
处理脚本(uris-process.xqy)
xquery version "1.0-ml"; declare namespace lab = "http://labs.com/record"; declare namespace meta="http://labs.com/lab/record/meta"; declare variable $URI as xs:string external; xdmp:set-request-time-limit(3600), for $uris in $URI let $doc := fn:doc($uris) let $meta := <lab:Record><meta:Metadata> $doc//meta:IDNumber} {$doc//meta:ReportDate} {$doc//meta:ReportNumbers} </meta:Metadata></lab:Record> let $IDNumber := fn:data($meta//meta:IDNumber) return xdmp:save(fn:concat("/XML/",$IDNumber,".xml")$IDNumber ,$meta)
任务异常信息
SEVERE: interrupted: exiting java.lang.InterruptedException at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2088) at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467) at java.util.concurrent.ExecutorCompletionService.poll(ExecutorCompletionService.java:202) at com.marklogic.developer.corb.Monitor.monitorResults(Monitor.java:97) at com.marklogic.developer.corb.Monitor.run(Monitor.java:76) at java.lang.Thread.run(Thread.java:750) Sep 11, 2023 3:32:41 PM com.marklogic.developer.corb.Manager run SEVERE: received more than 1 results: 1 Sep 11, 2023 3:32:41 PM com.marklogic.developer.corb.Manager stop INFO: cleaning up Sep 11, 2023 3:32:41 PM com.marklogic.developer.corb.Manager main SEVERE: Error while running CORB java.lang.ArrayIndexOutOfBoundsException: received more than 1 results: 1
错误原因及修复方案
1. URIs脚本(uris.xqy)的核心问题
CoRB的URIS模块要求每行输出一个URI,但当前脚本返回(count($uri), $uri)——对每个URI会返回两个结果:count($uri)(单个字符串的count值为1)和URI本身。CoRB会将这两个结果视为独立的URI条目,触发解析错误。
修复后的uris.xqy:
declare namespace lab = "http://labs.com/record"; declare namespace meta="http://labs.com/lab/record/meta"; let $org := ("Ros* Lab*") for $uri in cts:uris( (), (), cts:and-query(( cts:collection-query('/Lab'), cts:field-range-query("updated","<","2023-08-18"), cts:or-query(( cts:field-word-query("do",$org,"case-insensitive") )) )) ) return $uri
- 移除多余的
count($uri),直接返回URI即可。
2. 处理脚本(uris-process.xqy)的语法错误
脚本存在多处语法问题,会导致执行失败:
$doc//meta:IDNumber}多了一个闭合大括号}xdmp:save(fn:concat("/XML/",$IDNumber,".xml")$IDNumber ,$meta)参数错误:fn:concat后冗余了$IDNumber,正确参数应为保存路径和内容- 冗余的
for $uris in $URI:$URI是单个字符串,无需循环遍历
修复后的uris-process.xqy:
xquery version "1.0-ml"; declare namespace lab = "http://labs.com/record"; declare namespace meta="http://labs.com/lab/record/meta"; declare variable $URI as xs:string external; xdmp:set-request-time-limit(3600), let $doc := fn:doc($URI) let $meta := <lab:Record><meta:Metadata> {$doc//meta:IDNumber} {$doc//meta:ReportDate} {$doc//meta:ReportNumbers} </meta:Metadata></lab:Record> let $IDNumber := fn:data($meta//meta:IDNumber) return xdmp:save(fn:concat("/XML/", $IDNumber, ".xml"), $meta)
内容的提问来源于stack exchange,提问作者thichxai
相关产品推荐
相关产品推荐

