2015-07-28 79 views
0

我有一個REST端點,它需要處理一長串代碼。因爲這可能會導致超時,所以我嘗試使用產卵函數並在後臺執行這些魔術。但它看起來像spawn-function正在持有來自我的REST端點的200 OK響應,所以它並不真正產生。MarkLogic 7刷新功能

我已經添加了日誌行來檢查它的位置。所有日誌行都會彈出到調試日誌中。

對於少量的數據,這工作正常。隨着更大的一套(60k代碼)它失敗。

更改代碼產卵在$文本的每一項功能,使60K產卵後,我得到這個錯誤:

2015-07-28 10:20:02.326 Debug: Forest::insert: STRLF3-content-001-1 XDMP-INMMFULL: In-memory storage full; list: table=5%, wordsused=3%, wordsfree=95%, overhead=1%; tree: table=8%, wordsused=3%, wordsfree=97%, overhead=0% 

插入的數據:

{ 
    ProjectID: 102124, 
    Text: "2311\n2253\n2312\n6626\n2253\n1234" 
} 

調用產卵過程:

(: ======================================================================= :) 
(: ! Load Transactions into seperate XML files        :) 
(: ======================================================================= :) 

declare 
%roxy:params("") 
function strlf:post(
    $context as map:map, 
    $params as map:map, 
    $input as document-node()* 
) as document-node()? 
{ 
    map:put($context, "output-types", "application/json"), 
    xdmp:set-response-code(200, "OK"), 
    document { 

        (: Get project ID :) 
        let $_ := xdmp:log('TransTest - stap1', 'debug') 
        let $project := json:transform-from-json($input)/ns:ProjectID 

        let $_ := xdmp:log('TransTest - stap2', 'debug') 
        let $codes := json:transform-from-json($input)/ns:Text 

        (: Clean current project :) 
        let $_ := xdmp:log('TransTest - stap3', 'debug') 
        let $uridir := fn:concat('/app/transactie/', $project/text(), '/', '*') 

        let $_ := xdmp:log('TransTest - stap4', 'debug') 
        let $kill  := xdmp:document-delete(cts:uri-match($uridir)) 

        (: Spawn the trannies :) 
        let $_ := xdmp:log('TransTest - stap5', 'debug') 

        (: return 'ja' :) 
        let $_ := xdmp:spawn-function(strlf:spawner($project, $codes, $uridir), 
        <options xmlns="xdmp:eval"> 
         <transaction-mode>update-auto-commit</transaction-mode> 
        </options>) 

        return 'done' 

    } 
}; 

功能strlf:產卵:

declare private function strlf:spawner(
    $project, 
    $codes, 
    $uridir 
) 
{ 
    (: Tokenize on lines :) 
    let $text  := fn:tokenize($codes, fn:codepoints-to-string(10)) 

    let $loop  := 
    for $regel in $text 

     let $tokregel := fn:tokenize($regel, ",")   

     let $intvalue := 
     if (fn:contains($regel, ",")) 
     then fn:substring-after($regel, "€") 
     else 1 

     let $code := 
     if (fn:contains($regel, ",")) 
     then $tokregel[1] 
     else $regel 

     (: Build map of maps, p4 should be postcode :) 
     let $map  := map:map() 
     let $_  := map:put($map, 'code', $code) 
     let $_  := map:put($map, 'p4', fn:substring($code[1], 1, 4)) 
     let $_  := map:put($map, 'value', $intvalue) 
     let $_  := map:put($map, 'projectid', $project/text()) 

     (: Create unverified random doc id :) 
     let $docid := fn:string(xdmp:random(1000000000000)) 

     (: Build URI :) 
     let $uridoc := fn:concat('/app/transactie/', $project/text(), '/', $docid, '.xml') 

    (: Save transaction document and skip header :) 
    return 
    (if (map:get($map, 'code') != 'CODE') 
    then xdmp:document-insert 
      (
      $uridoc, 
       <transaction xmlns='http://www.dikw.nl/transactions' projectid='{map:get($map, 'projectid')}' code='{map:get($map, 'code')}' p4='{map:get($map, 'p4')}'> 
       <value>{map:get($map, 'value')}</value> 
       </transaction> 
      ) 
    else()) 

    (: Empty return :) 
    return $loop   
}; 

回答

1

正確的,你有strlf:spawner($project, $codes, $uridir)作爲第一個參數xdmp:spawn-function,使其得到執行,並將結果傳遞到xdmp:spawn-function。由於spawner函數返回一個空序列,因此spawn函數不會拋出任何錯誤。

解決方法是相當簡單的,你的包裹產卵呼叫一個匿名函數:

let $_ := xdmp:spawn-function(function() { strlf:spawner($project, $codes, $uridir) }, 
       <options xmlns="xdmp:eval"> 
        <transaction-mode>update-auto-commit</transaction-mode> 
       </options>) 

HTH!

+0

謝謝。這似乎是做我想要的。但是現在每個交易模式選項都被拒絕。我似乎無法更新/插入這種方式。 – Thijs

+0

我已經添加了「更新」選項和提交到衍生函數的底部。似乎現在工作良好! – Thijs

+1

聽起來就像是在運行MarkLogic 7.從MarkLogic 8開始支持'update-auto-commit'。添加'xdmp:commit()'並使用'update'模式確實是在MarkLogic 7中工作的正確方法。 – grtjn