- XCONF文件中指定XQuery文件路径
- XCONF文件中包含XQuery文件
- XCONF文件中指定Java类
第二种方式,是用XCONF文件通知eXistDB要对哪个collection中的哪些操作做触发,然后将XQuery语句包含在XCONF文件中。
1、在你需要触发的collection的对应配置collection中,增加一个xconf文件,文件名任意,官方推荐collection.xconf。配置collection与原collection的对应关系为,在/db/system/config/db下,建立/db下相同的collection。
比如,如果你希望监控/db/cda02路径,就需要在/db/system/config/db/cda02路径下,新增一个collection.xconf。
collection.xconf
<collection xmlns="http://exist-db.org/collection-config/1.0"> <triggers> <trigger event="create" class="org.exist.collections.triggers.XQueryTrigger"> <parameter name="query" value=" xquery version '3.0'; module namespace trigger='http://exist-db.org/xquery/trigger'; declare namespace xmldb='http://exist-db.org/xquery/xmldb'; declare function trigger:before-create-document($uri as xs:anyURI) { local:log-event('before', 'create', 'document', $uri) }; declare function trigger:after-create-document($uri as xs:anyURI) { local:log-event('after', 'create', 'document', $uri) }; declare function trigger:before-delete-document($uri as xs:anyURI) { local:log-event('before', 'delete', 'document', $uri) }; declare function trigger:after-delete-document($uri as xs:anyURI) { local:log-event('after', 'delete', 'document', $uri) }; declare function local:log-event($type as xs:string, $event as xs:string, $object-type as xs:string, $uri as xs:string) { let $log-collection := '/db/Triggers' let $log := 'log02.xml' let $log-uri := concat($log-collection, '/', $log) return ( (: util:log does not work at all util:log('warn', 'trigger fired'), :) (: create the log file if it does not exist :) if (not(doc-available($log-uri))) then xmldb:store($log-collection, $log, <triggers/>) else () , (: log the trigger details to the log file :) update insert <trigger event='{string-join(($type, $event, $object-type), '-')}' uri='{$uri}' timestamp='{current-dateTime()}'/> into doc($log-uri)/triggers ) };"/> </trigger> </triggers> </collection>
2、保存时,eXide会询问你是否应用配置,点击应用。
3、这样,在/db/cda02路径下所有变更,都会通知到触发器了。触发器会将事件记录到/db/Triggers/log02.xml中。