2016-04-21 8 views
2

Ein paar FragenUm Datenerstellung in einem Wald auslösen, der eine http-Kommunikation in Marklogic

  1. startet Wenn ein Trigger für einen bestimmten Wald zu schaffen, ist es richtig, die trgr zu verwenden: collection-Scope-Funktion mit dem Wald Name?

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

  1. Ich bin daran interessiert, eine jsp Skript in der Ausführung, die Parameter an das Skript übergibt, wenn ein Datum an einen Wald begehen veröffentlichen. Ist der folgende Weg der richtige Weg?

    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() 
    ); 
    

Mit folgendem http.xqy Modul, das derzeit zur Prüfung akzeptiert nur einen Parameter Dateinamen

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>) 
    genannt
  1. Ist es möglich, den Namen zu übergeben der Datei, die in der Datenbank erstellt wurde, die den Auslöser ausgelöst hat, zum Modul-Skript?

Dank

Conteh

Antwort

4

Haben Sie bei der Alerting API geschaut? Es abstrahiert die Low-Level-Triggerdetails für Anwendungen, die auf Datenbankänderungen reagieren müssen, wenn Daten mit (umgekehrten) Abfragen übereinstimmen.

Die Alerting-API fügt über externe Variablen automatisch einen Kontext für das Dokument ein, das die Aktion ausgelöst hat. Zum Beispiel Ihre aktions der Code, der in Reaktion auf eine Warnung genannt Trigger wird so etwas wie die folgenden Angaben enthalten:

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; 

Was Ihre konkrete Frage, nimmt trgr:collecion-scope() den Namen einer Sammlung als Parameter, in der Regel ein URI. Wie der Name schon andeutet, können Sie den Bereich eines Triggers auf eine bestimmte Sammlung beschränken. In der Regel sollte sich Ihr Anwendungscode nicht mit Wäldern befassen. Die Datenbank macht eine gute Arbeit, um zu abstrahieren, wie die Daten darunter organisiert sind. Ihr Code, der direkt mit Gesamtstrukturen arbeitet, wird wahrscheinlich nicht so effizient sein und Sicherheitsprüfungen, wie die doppelte URI-Erkennung, untergraben.

Starten Sie mit der Alerting-API.

+0

Die Management API sollte auch für die Konfiguration von Alerting/Triggern hilfreich sein. – rjrudin

+0

Danke, ich werde diese studieren. Wie ich bisher einen Trigger konfiguriert habe, habe ich den Java-API-Client com.marklogic.client.example.util.Bootstrapper bearbeitet, der die installBootstrapExtension-Methode in eine installTriggers-Methode konvertiert, die die URL anpasst. HttpPut put = new HttpPut ("http:// "+ Host +": "+ Port +"/Verwalten/v2/Datenbanken/Trigger/Trigger? Methode = POST "); und die setEntity xquery – conteh