2011-12-06 2 views
0

MarkLogic 파이프 라인을 디버깅하려고하는데 파이프 라인에서 사용하는 xquery 파일 중 하나를 변경할 때마다 모든 시스템 모듈을 다시로드하는 수제 스크립트를 실행해야합니다. 저는이 프로젝트가 프로젝트가 몇 개의 모듈 만 가지고있을 때 개발 된 기법이라고 추측합니다. 그러나 이제는이 프로세스에 몇 분이 걸립니다. 내가 필요한 것은 1) 변경된 하나의 모듈 만 다시로드하는 더 빠른 기술입니다. CQ 또는 2) 완전히 다른 접근 방식으로 실행할 수있는 코드 스 니펫. 감사.MarkLogic 템플릿 디버깅 : 생산성을 높이는 방법?

답변

2

일반적으로 코드를 파일 시스템에서 직접 실행할 수는 있지만 파이프 라인에서는 작동하지 않습니다.

두 번째로 쉬운 일은 webdav 앱 서버와 webdav를 사용할 수있는 편집기 (oXygen과 같은)를 사용하는 것입니다. webdav 유형의 새 앱 서버를 만들고 액세스하려는 모듈 데이터베이스에 연결하고, 로그인 할 계정이 있는지 확인하고 준비가 되었으면합니다.

다른 방법은 더 똑똑한 시스템을 사용하여 변경된 파일 만 업로드하는 것입니다. 개미는 대개 변경 사항을 감지하는 데 아주 좋습니다. github (https://github.com/garyvidal/marklogic-ant-tasks)에서 사용할 수있는 MarkLogic Ant 태스크가 있습니다. 비록 그것이 정말로 잘 작동한다고해도 확실하지 않습니다. 시도해야 할 것입니다. 빌드 스크립트를 잘 생각해야 할 수도 있습니다. 지난 번 내가 그것을 사용했을 때, 그것은 비록 내가 잘못하지 않는다면 몇 백개의 파일을로드 했음에도 불구하고 합리적으로 잘 작동했다.

사용하는 접근 방식이 왜 그렇게 느린 지에도 다른 이유가있을 수 있습니다. 공개 할 수 있다면 구체적인 최적화 도움말을 요청할 수 있습니다.

+0

WebDAV를 통해 연결하면 모듈의 캐시를 덤프해야하는 문제 (또는 컴파일 작업이 무엇이든간에)를 어떻게 해결할 수 있습니까? 감사! – bethesdaboys

+0

필자의 지식으로는 모듈이 처음 액세스 할 때 컴파일되고 캐시됩니다 (초기 또는 업데이트 후). AFAIK 업데이트 속도를 늦춰서는 안됩니다. 이 동작은 모듈을 업데이트하는 데 사용하는 모든 방법에서 동일하므로 WEBDAV 모듈 데이터베이스에 업로드 할 때와 다른 점은 없습니다. – grtjn

1

"모든 시스템 모듈"을 다시로드해야 할 필요가 있는지 혼란스러워합니다. 어쩌면 최신 서버 버전을 사용해 보시거나 지원 여부를 확인 하시겠습니까?

그러나 당신은 단순히 자신의 코드를 다시로드 할 가정, 당신은 RecordLoader를 사용할 수 있습니다 : 당신이 오히려 CQ을 사용하는 경우, 당신은 http://developer.marklogic.com/pubs/4.2/apidocs/AdminBuiltins.html#xdmp:filesystem-directory으로 시작할 수 https://github.com/marklogic/recordloader

- 이것은 당신이 시작할 수 있습니다. doc-insert 호출에 문서 사용 권한을 추가해야 할 수도 있습니다. URI를 작성하려면 더 많은 문자열 조작이 필요할 수 있습니다. Marklogic 개미 작업의 기술과 XCC 연결 사용

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를 살펴 보겠습니다.나는 거의 툴링이없는 매우 고풍스러운 개발 환경과 같은 느낌으로 인해 계속해서 좌절감을 느낍니다 ... 나는 빗나갑니다. CQ 대신 Oxygen을 사용하여 적어도 구문 색상 강조 표시를 얻을 수 있습니다. 다시 한번 감사드립니다. – bethesdaboys

+0

내 생각에 실제 질문은 내가 왜 일부 xqy 파일을 수정하고 즉시 결과를 볼 수 있는가하는 것이다. 그러나 분명히 파이프 라인에 의해 건드려지는 모든 xqy 파일에 대해서는 이것이 작동하지 않습니다. 그리고 그것을 교정하기 위해 정확히 무엇이 수행되어야하는지 명확하지 않습니다. – bethesdaboys

+0

CPF 파이프 라인은 트리거에 의해 구현되며 해당 CPF 트리거는 모듈 루트가 모듈 데이터베이스로 설정된 상태로 평가됩니다. 따라서 트리거가 사용하는 코드를 설치하는 일반적인 방법은이를 모듈 데이터베이스에 복사하는 것입니다. 반면 응용 프로그램 서버는 파일 시스템 위치를 루트로 사용할 수 있습니다. 하나의 대안은/opt/MarkLogic/Modules (Linux의 경우 - 다른 환경이 다를 경우)을 사용하는 것입니다. 파일 시스템 위치에있는 모듈은 보편적으로 사용할 수 있습니다. – mblakele

1

(어떤 나던 데이터베이스를 가리 키도록해야) : 이 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와 같은 것을 사용하십시오. 디렉토리 작성을 모듈 데이터베이스에 대한 자동 쓰기로 설정하지 않으면 잠금 경합이 일어나 효과적으로 단일 스레드가됩니다.

관련 문제