代码之家  ›  专栏  ›  技术社区  ›  mikel

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

  •  2
  • mikel  · 技术社区  · 6 年前

    在尝试在两个MarkLogic集群之间传输大型文档时,我不断遇到一个内部服务器错误。5分钟后超时。

    SVC-SOCRECV: xdmp:http-post(...) Timeout (decodeResponseLine1)
    

    url如下所示:

    http://source-host:8020/uri.transfer.xqy?key=/COLLECTION/DB/VeryLargeDoc.xml&srcdb=DB&destdb=DB&desthost=dest-host
    

    我已尝试使用将超时设置为10分钟 xdmp:set-request-time-limit(600) 在函数中。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 回复  |  直到 6 年前
        1
  •  4
  •   Mads Hansen    6 年前

    有多个超时可能会困扰您:

    • 保留 xdmp:set-request-time-limit ,或者如果http post太慢,MarkLogic可能会不耐烦地终止整个语句。
    • 添加一个 <timeout> xdmp:http-post options 确保http post不会取消客户端请求。默认值是组的http超时。(注:SVC-SOCRECV似乎表明正在发生这种情况)
    • 还要确保服务器端时间限制足够大。服务器端将运行代码来编写您发送的任何内容。它将受到 default time limit 除非 doc_transfer.xqy 包含显式 xdmp:设置请求时间限制

    嗯!

        2
  •  0
  •   mikel    6 年前

    对于那些希望看到有效解决方案的人。(感谢@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)
    };