我正在尝试调试 MarkLogic 管道,每次更改管道使用的 xquery 文件之一时,我都必须运行一个自制的脚本,我们拥有重新加载所有系统模块的脚本。我猜这是在项目只有几个模块时开发的技术,但现在这个过程需要几分钟。我需要的是 1) 一种更快的技术来重新加载我更改的一个模块,例如我可以在 CQ 中运行的代码片段或 2) 一些完全不同的方法。谢谢。
4 回答
通常你可以直接从文件系统运行你的代码,但这不适用于管道。
第二个最简单的事情是只使用 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 之类的东西。如果您不将目录创建设置为自动写入模块数据库,则将进入锁定争用并有效地成为单线程。