2011-12-06 49 views
0

我正在嘗試調試MarkLogic管道,並且每次更改管道使用的xquery文件之一時,我都必須運行自制腳本來重新加載所有系統模塊。我猜測這是一個在項目只有幾個模塊時開發的技術,但現在這個過程需要幾分鐘的時間。我需要的是1)更快的技術來重新加載我更改的一個模塊,例如我可以運行在CQ中的代碼片段或2)一些完全不同的方法。謝謝。MarkLogic模板調試:如何提高生產力?

回答

2

通常情況下,您可以直接從文件系統運行代碼,但這不適用於管道。

第二個最簡單的事情就是使用webdav應用服務器和一個支持webdav的編輯器(如oXygen)。您只需創建一個新的WebDAV類型的應用服務器,將其連接到您想要訪問的模塊數據庫,確保您有一個賬戶登錄,並且您已準備就緒。

其他方法正在使用智能系統上傳僅更改的文件。螞蟻通常很擅長檢測變化。在github上有可用的MarkLogic ant任務(https://github.com/garyvidal/marklogic-ant-tasks)。不知道雖然這確實效果更好,但你必須嘗試。你可能必須認真思考你的構建腳本。上次我使用它時,儘管它沒有錯誤,但即使它裝載了幾百個文件,它的工作仍然相當好。

儘管您使用的方法如此之慢,但可能有不同的原因。如果你能夠透露它,你可以要求具體的優化技巧。

+0

通過WebDAV進行連接如何解決ML不得不轉儲它的緩存(或其他任何操作,編譯?)的問題?謝謝! – bethesdaboys

+0

據我所知,模塊在初次訪問(初始或更新後)時被編譯和緩存。它不應該減慢更新AFAIK。對於所有用來更新模塊的方法,這種行爲都是一樣的,所以WEBDAV上傳到模塊數據庫沒有什麼不同。 – grtjn

1

我有點困惑需要重新加載「所有系統模塊」。也許你應該嘗試最新的服務器版本,或檢查支持?

不過,假設你只是想重新加載自己的代碼,你可以使用RecordLoader:https://github.com/marklogic/recordloader

如果您願意使用CQ,你可以用http://developer.marklogic.com/pubs/4.2/apidocs/AdminBuiltins.html#xdmp:filesystem-directory開始 - 這可能讓你開始。您可能需要向文檔插入調用添加文檔權限,並且您可能需要執行更多字符串操作才能構建URI。

declare namespace dir="http://marklogic.com/xdmp/directory"; 

if (xdmp:database('Modules') eq xdmp:database()) then() 
else error(
(), 'INSTALL-NOTMODULES', text { 
    xdmp:database-name(xdmp:database()), 'is not the Modules database' }) 
, 
for $i in xdmp:filesystem-directory('/path/to/files')/dir:entry 
    [dir:type eq 'file'] 
    [ends-with(dir:filename, '.xqy')] 
let $uri := $i/filename/string() 
return xdmp:document-insert($uri, xdmp:document-get($i/dir:pathname)) 
+0

對不起,我的帖子不清楚:底線是我只需要一個目標的方式來重新加載一個或我正在處理兩個xqy文件。ML是否只需要將文件從文件系統重新插入數據庫?我會看看RecordLoader。我仍然感到沮喪,感覺像一個極其陳舊的開發環境,而且工具很少...我離題了。我使用Oxygen代替CQ,這樣至少我可以獲得語法顏色突出顯示。再次感謝。 – bethesdaboys

+0

我想我腦海中真正的問題是爲什麼我可以修改一些xqy文件並立即看到結果;然而,顯然對於流水線所觸及的任何xqy文件,這是行不通的 - 我不清楚究竟需要做些什麼來補救。 – bethesdaboys

+0

CPF流水線由觸發器實現,並且這些CPF觸發器將其模塊根設置爲Modules數據庫進行評估。因此,安裝觸發器使用的代碼的正常方法是將其複製到模塊數據庫中。另一方面,應用程序服務器可以使用文件系統位置作爲它的根。一種選擇是使用/ opt/MarkLogic/Modules(在Linux上 - 其他環境不同)。該文件系統位置中的模塊通用。 – mblakele

1

使用Marklogic Ant任務的技術和XCC連接(任何不必須指向你的數據庫): https://github.com/garyvidal/marklogic-ant-tasks

您可以使用下面是一些你可以在你的模板中使用:

<!--Define ml namespace in project root element--> 
<project name="ML Build Task" xmlns:ml="http://www.marklogic.com/ant"> 
> 
<!--Set you the classpath to where your mlant.jar file is located. 
    Include any other dependent jar files required to execute tasks 
    noted in Dependencies section. 
--> 
<path id="mlant-classpath"> 
    <fileset dir="${lib-dir}"> 
      <include name="xcc.jar" /> 
      <include name="mlant.jar" /> 
      <include name="corb.jar"/> 
      <include name="saxon9he.jar"/> 
      <include name="xqdoc-ml.jar"/> 
      <include name="antlr-2.7.5.jar"/> 
    </fileset> 
</path> 
<!-- 
    Setup the type definition and assign classpathref to mlant-classpath 
--> 
<typedef 
    uri="http://www.marklogic.com/ant" 
    resource="com/marklogic/ant/antlib.xml" 
    classpathref="mlant-classpath" 
/> 
<!--Optional: Set the property for xccstring used to connect to MarkLogic database--> 
<property name="xccstring" value="xcc://test:[email protected]:9090/Docs"> 

<!--Create a target element and use the tasks--> 
<target name="load-modified"> 
    <ml:load xccurl="${xccstring}"> 
      <ml:docset destdir="/app-code/"> 
       <ml:permissionset> 
        <ml:permission role="nobody" permission="execute" /> 
        <ml:permission role="nobody" permission="insert" /> 
        <ml:permission role="nobody" permission="read" /> 
        <ml:permission role="nobody" permission="update" /> 
       </ml:permissionset> 
       <ml:collectionset> 
        <ml:collection name="collection1" /> 
        <ml:collection name="collection2" /> 
       </ml:collectionset> 
       <fileset dir="../src" includes="**/*" > 
       <modified/> 
       </fileset>     
      </ml:docset> 
     </ml:load> 
</target> 

<!--Have Fun--> 
</project> 
0

如果你只是想讓你的模塊上傳變得更快:清除你的模塊數據庫,關閉「目錄創建:自動」,並使用配置多個線程的RecordLoader之類的東西。如果您沒有將目錄創建設置爲自動寫入模塊數據庫,則會進入鎖定爭用並且實際上是單線程的。