在Marklogic集群之间移动大型文档时,如何增加超时时间?

时间:2018-03-08 15:33:38

标签: ruby xquery marklogic marklogic-8

尝试在两个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)
};

这不起作用。我应该在哪里修改超时。超时似乎发生在源主机上。

2 个答案:

答案 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)
};