MarkLogicパイプラインをデバッグしようとしていますが、パイプラインで使用されるxqueryファイルの1つを変更するたびに、すべてのシステムモジュールをリロードする自家製のスクリプトを実行する必要があります。これは、プロジェクトにモジュールが数個しかないときに開発された手法だと思いますが、今ではこのプロセスに数分かかります。必要なのは、1)変更した1つのモジュールだけをリロードするためのより高速な手法、たとえばCQで実行できるコードスニペット、または2)まったく異なるアプローチのいずれかです。ありがとう。
4 に答える
通常、ファイル システムからコードを直接実行できますが、パイプラインでは機能しません。
2 番目に簡単なのは、webdav アプリ サーバーと webdav 対応のエディター (oXygen など) を使用することです。必要なことは、webdav タイプの新しいアプリケーション サーバーを作成し、それをアクセスしたいモジュール データベースに接続し、ログインするためのアカウントがあることを確認するだけです。これで準備完了です。
他のアプローチでは、よりスマートなシステムを使用して、変更されたファイルのみをアップロードしています。Ant は通常、変化の検出に非常に優れています。また、github ( https://github.com/garyvidal/marklogic-ant-tasks )で利用可能な MarkLogic ant タスクがあります。ただし、それが実際にうまく機能するかどうかはわかりませんが、試してみる必要があります。ビルド スクリプトをよく考えなければならない場合があります。前回使用したときは、間違いがなければ数百のファイルをロードしたにもかかわらず、かなりうまく機能しましたが、確かに数分ではありませんでした。
使用するアプローチが非常に遅いのには別の理由があるかもしれません。開示できる場合は、具体的な最適化のヒントを求めることができます。
「すべてのシステムモジュール」をリロードする必要があることについて少し混乱しています。おそらく、最新のサーバー リリースを試すか、サポートに確認する必要がありますか?
しかし、単に独自のコードをリロードしたい場合は、RecordLoader を使用できます: https://github.com/marklogic/recordloader
cq を使用したい場合は、 http: //developer.marklogic.com/pubs/4.2/apidocs/AdminBuiltins.html#xdmp:filesystem-directory から始めることができます。おそらく、doc-insert 呼び出しにドキュメントのアクセス許可を追加する必要があり、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))
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:test@localhost: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>
モジュールのアップロードを高速化するだけの場合: モジュール データベースをクリアし、「ディレクトリ作成: 自動」をオフにして、複数のスレッドが構成された RecordLoader などを使用します。ディレクトリ作成をモジュール データベースへの自動書き込みに設定しないと、ロックの競合が発生し、実質的にシングル スレッドになります。