查询从任务服务器运行找不到文件?

时间:2015-10-26 01:17:06

标签: task scheduled-tasks marklogic

我定义了一个XQuery,可以从Query Console(QC)运行。 我在任务服务器上设置了任务。

查询似乎无法找到搜索到的文档,因此这必须是权限问题,这是我的猜测。

任务查询:

xquery version "1.0-ml";

import module namespace object = "http://marklogic.com/solutions/obi/object" at 
  "/ext/obi/lib/object-query-lib.xqy",
  "/ext/obi/lib/object-service-lib.xqy",
  "/ext/obi/lib/object-lib.xqy";

declare namespace obj="http://marklogic.com/solutions/obi/object";

declare namespace alt="http://example.com/sccs/alert";
declare namespace scc="http://example.com/sccs";
declare namespace source="http://marklogic.com/solutions/obi/source";

(: Start task :)
let $_ := xdmp:log("******* START CHECK UPDATE ALERTS TASK *********")
(: Find al active alerts :)
let $alerts := cts:search(
                        collection("object"),                
                        cts:and-query((
                                        cts:element-range-query(xs:QName("obj:type"), "=", "alert"),
                                        cts:element-range-query(xs:QName("alt:status"), "=", "Active")
                                        (:
                                        cts:element-range-query(xs:QName("alt:device-id"), "=", $device-id)
                                        :)
                                        ))
                        )/obj:object

let $update-object-content :=  <alert xmlns="http://example.com/sccs/alert">
                                    <obj:property>
                                        <status xmlns="http://example.com/sccs/alert">Inactive</status>
                                    </obj:property>
                                </alert>

let $now := fn:current-dateTime()
(: minimum duration before alerts turns inactive :)
let $duration-min := xs:dayTimeDuration('PT25M0S') (: defines 30 minutes :)

(: loop over all active alerts :)
let $_ := 
    for $a in $alerts
        let $a-id := $a//obj:id/text()
        let $s-id := $a//source:id/text()[1]
        let $timestamp := xdmp:parse-dateTime('[Y0001]-[M01]-[D01]T[h01]:[m01]:[s01]',$a//scc:timestamp/text())
        (: if Alert is older then $delta then set status to Inactive :)
        let $delta := $now - $timestamp
        let $upd := if ($delta > $duration-min) then
                      ( 
                      let $_ := xdmp:log(fn:concat("Update Alert ID : ",$a-id," to INACTIVE."))
                      let $detail-id := obj:add-details($a-id, $update-object-content, $s-id,())
                      return $detail-id
                      )
                    else ()
    return $upd

let $_ := xdmp:log(fn:concat("DEBUG NUM ALERTS:",fn:count($alerts)))

return ()

任务保障:

      <scheduled-task>
        <task-path>/tasks/update-alerts-to-inactive.xqy</task-path>
        <task-root>/</task-root>
        <task-type>minutely</task-type>
        <task-period>5</task-period>
        <task-database name="${content-db}"/>
        <task-modules name="${app-modules-db}"/>
        <task-user name="${app-name}-user"/>
      </scheduled-task>

如果需要将警报对象设置为&#34;非活动状态&#34;该任务每5分钟检查一次。

从日志Error.txt我可以看到任务运行但无法找到文档。

2015-10-26 00:45:00.395 Info: TaskServer: ******* START CHECK UPDATE ALERTS TASK *********
2015-10-26 00:45:00.395 Info: TaskServer: DEBUG NUM ALERTS:0

我在codepoint root collat​​ion中运行所有代码,但在此上下文中无法找到任何与taskserver相关的代码。

documentation on permissions needed for the user to perform a task非常隐秘:

  

在“任务用户和任务主机”字段中,指定用户   权限调用任务和任务的主机   是要被调用。如果未指定主机,则任务将在所有主机上运行   主机。 “任务用户”字段中指定的用户必须具有   执行模块中使用的函数所需的特权。看到   附录B:完整列表的预定义执行权限   执行权限。

问题:为什么app-user无法在任务服务器上找到文档?

更新

尝试获取OBI文档的权限但失败了。

这是代码(由Dave建议)

import module namespace sec="http://marklogic.com/xdmp/security" at 
  "/MarkLogic/security.xqy";

declare namespace obj="http://marklogic.com/solutions/obi/object";

let $o-id := cts:search(
                        collection("object"),                
                        cts:and-query((
                                        cts:element-range-query(xs:QName("obj:type"), "=", "alert")
                                        ))
                       )/obj:object/obj:id/text()

let $uri := object:master-uri($o-id)

let $res := for $perm in xdmp:document-get-permissions($uri)
    let $role-name := sec:get-role-names($perm/sec:role-id)
    return $role-name || ": " || $perm/sec:capability/fn:string()

let $string-uri := '/marklogic.solutions.obi/object/cec48c59-a648-4da5-a758-2b6bb4065279.xml'

return xdmp:document-get-permissions($string-uri)

我在QC上以管理员身份运行它,它返回空序列...

1 个答案:

答案 0 :(得分:2)

检查权限部分的最简单方法是在查询控制台中以${app-name}-user}运行您的代码。以该用户身份连接到Query Console,或者将代码包装在xdmp:eval()中并在选项中指定用户。我希望你能得到同样的结果。

这似乎不是执行权限的问题,因为它似乎确实运行了任务。

在Query Console中,运行以下代码:

import module namespace sec="http://marklogic.com/xdmp/security" at 
  "/MarkLogic/security.xqy";

for $perm in xdmp:document-get-permissions($uri)
let $role-name := sec:get-role-names($perm/sec:role-id)
return $role-name || ": " || $perm/sec:capability/fn:string()

...用$ uri替换你的一个目标文件的URI。这将告诉您哪些角色对该文档具有哪些权限。现在,您可以检查${app-name}-user是否具有(或继承)该角色。