在 Marklogic 中启动 http 通信的林中触发数据创建

To trigger data creation in a forest that launches a http communication in Marklogic

几个问题

  1. 为给定林创建触发器时,使用带有林名称的 trgr:collection-scope 函数是否正确?

https://docs.marklogic.com/trgr:trigger-data-event

  1. 我有兴趣执行一个 jsp 脚本,该脚本在将数据提交发布到林时将参数传递给脚本。以下是正确的做法吗?

    xquery version "1.0-ml"
    import module namespace trgr="http://marklogic.com/xdmp/triggers" 
        at "/MarkLogic/triggers.xqy";
    
    trgr:create-trigger("executeCreateBlock", "Execute Block Creation", 
    
       trgr:trigger-data-event(
       trgr:collection-scope("/str-1/"),
       trgr:document-content("create"),
       trgr:post-commit()),
    
       trgr:trigger-module(xdmp:database("str-1-modules"), "/modules/", "http.xqy"),
    
       fn:true(), 
    
       xdmp:default-permissions() 
    );
    

使用以下 http.xqy 当前用于测试的模块只接受一个名为文件名的参数

xquery version "1.0-ml";

let $payload :=  '{ "filename": $filename}' 
return xdmp:http-post("http://chain1.xmp.com:8080/CreateBlock/response.jsp",
     <options xmlns="xdmp:http">
       <data>{$payload}</data>
     </options>)
  1. 是否可以将在数据库中创建的导致触发器触发的文件的名称传递给模块脚本?

谢谢

康特

你看过Alerting API了吗?它为需要对匹配(反向)查询数据的数据库更改做出反应的应用程序抽象低级触发器详细信息。

警报 API 通过外部变量自动注入有关触发操作的文档的上下文。例如,您的操作(为响应警报触发器而调用的代码)将包括如下内容:

xquery version "1.0-ml";
declare namespace alert = "http://marklogic.com/xdmp/alert";

declare variable $alert:config-uri as xs:string external;
declare variable $alert:doc as node() external;
declare variable $alert:rule as element(alert:rule) external;
declare variable $alert:action as element(alert:action) external;

至于你的具体问题,trgr:collecion-scope()将集合的名称作为参数,通常是URI。顾名思义,它允许您将触发器的权限限制为特定集合。一般来说,您的应用程序代码 不应该 关注森林。数据库在抽象数据的组织方式方面做得很好。您直接使用森林的代码可能效率不高,并且可能会破坏安全检查,例如重复 URI 检测。

从警报开始 API。