尝试在两个MarkLogic群集之间传输大型文档时,我一直收到内部服务器错误。它在5分钟后超时。
SVC-SOCRECV: xdmp:http-post(...) Timeout (decodeResponseLine1)
网址如下:
http://source-host:8020/uri.transfer.xqy?key=/COLLECTION/DB/VeryLargeDoc.xml&srcdb=DB&destdb=DB&desthost=dest-host
我尝试在功能中使用xdmp:set-request-time-limit(600)
将超时设置为10分钟。 xquery函数:
declare function my-ns:transfer-records(
$record as element(record),
$database as xs:string,
$host as xs:string)
{
let $response :=
xdmp:set-request-time-limit(600,
xdmp:http-post("http://" || $host || ":" || $PORT || "/doc_transfer.xqy?database=" || $database,
<options xmlns="xdmp:http">
<headers>
<content-type>application/gzip</content-type>
</headers>
</options>,
xdmp:gzip($record)
)
)
return
xdmp:set-response-code($response[1]//*:code, $response[1]//*:message)
};
这不起作用。我应该在哪里修改超时。超时似乎发生在源主机上。
答案 0 :(得分:4)
有多个超时可能会打扰你:
xdmp:set-request-time-limit
,如果http-post太慢,MarkLogic可能会不耐烦地终止整个语句。<timeout>
options添加xdmp:http-post
,以确保http-post不会取消请求客户端。默认值是组的http超时。 (注意:SVC-SOCRECV似乎表明这是正在发生的事情)default time limit
的约束,除非doc_transfer.xqy
包含明确的xdmp:set-request-time-limit
。HTH!
答案 1 :(得分:0)
对于那些可能希望看到有效的解决方案的人。 (感谢@grtjn)我添加了一个<timeout>900</timeout>
元素,将超时设置为900秒。对于我,此群集上此组中的默认值为300秒。
declare function my-ns:transfer-records(
$record as element(record),
$database as xs:string,
$host as xs:string)
{
let $response :=
xdmp:set-request-time-limit(600,
xdmp:http-post("http://" || $host || ":" || $PORT || "/doc_transfer.xqy?database=" || $database,
<options xmlns="xdmp:http">
<headers>
<content-type>application/gzip</content-type>
</headers>
<timeout>900</timeout>
</options>,
xdmp:gzip($record)
)
)
return
xdmp:set-response-code($response[1]//*:code, $response[1]//*:message)
};