Difference between revisions of "Job Module"
Line 99: | Line 99: | ||
** If a time is specified, the query will be queued at this time. Examples for valid times are: <code>02:00:00</code> (2am), <code>12:00:00</code> (noon). If the time lies in the past, the query will be executed next day. | ** If a time is specified, the query will be queued at this time. Examples for valid times are: <code>02:00:00</code> (2am), <code>12:00:00</code> (noon). If the time lies in the past, the query will be executed next day. | ||
** If a dateTime is specified, the query will be queued at this date. Examples for valid values are: <code>2018-12-31T23:59:59</code> (New Year's Eve 2018, close to midnight). An error will be raised if the specified time lies in the past. | ** If a dateTime is specified, the query will be queued at this date. Examples for valid values are: <code>2018-12-31T23:59:59</code> (New Year's Eve 2018, close to midnight). An error will be raised if the specified time lies in the past. | ||
− | * {{Code|interval}}: a dayTimeDuration string can be specified to execute the query periodically. An error is raised if the specified interval is less than one second (<code>PT1S</code>). | + | * {{Code|interval}}: a dayTimeDuration string can be specified to execute the query periodically. An error is raised if the specified interval is less than one second (<code>PT1S</code>). If the next scheduled call is due, and if a query with the same id is still running, it will be skipped. |
* {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | * {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | ||
|- | |- | ||
Line 107: | Line 107: | ||
| '''Examples''' | | '''Examples''' | ||
| | | | ||
− | * {{Code|jobs:schedule("1+3", (), map{ 'cache': true() })}} returns a query id, e.g. {{Code|Job-123}}. The result can be retrieved via a second query in the same BaseX context: {{Code|jobs:result("Job-123")}}<br /> | + | * {{Code|jobs:schedule("1+3", (), map { 'cache': true() })}} returns a query id, e.g. {{Code|Job-123}}. The result can be retrieved via a second query in the same BaseX context: {{Code|jobs:result("Job-123")}}<br /> |
* The following [[RESTXQ]] function will return the id of the query thread, which evaluates the query that has been specified in the body of a POST request: | * The following [[RESTXQ]] function will return the id of the query thread, which evaluates the query that has been specified in the body of a POST request: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
declare %rest:POST("{$query}") %rest:path('/eval') function local:schedule($query) { | declare %rest:POST("{$query}") %rest:path('/eval') function local:schedule($query) { | ||
jobs:schedule($query) | jobs:schedule($query) | ||
+ | * {{Code|jobs:schedule("import module namespace m='maintain'; m:cleanup()", (), map { 'start': '02:00:00', 'interval': 'P1D' })}} calls a maintenance function at 2am every day.<br /> | ||
+ | * {{Code|jobs:schedule("prof:sleep(1500)", (), map { 'interval': 'PT1S' })}} tries to run a query every second. As the query will take 1.5 seconds, it will only be executed every second time.<br /> | ||
}; | }; | ||
</pre> | </pre> | ||
Line 178: | Line 180: | ||
|{{Code|overflow}} | |{{Code|overflow}} | ||
| Too many queries or query results are queued. | | Too many queries or query results are queued. | ||
+ | |- | ||
+ | {{Code|range}} | ||
+ | | A specified time or duration is out of range. | ||
|} | |} | ||
Revision as of 11:15, 3 July 2016
This XQuery Module provides functions for organizing queued and running jobs (commands, queries, REST, RESTXQ and WebDAV requests).
Contents
Conventions
All functions in this module are assigned to the http://basex.org/modules/jobs
namespace, which is statically bound to the jobs
prefix. Errors will be bound to the same prefix.
Functions
jobs:current
Signatures | jobs:current() as xs:string
|
Summary | Returns the id of the current job. |
jobs:list
Signatures | jobs:list() as xs:string*
|
Summary | Returns the ids of all jobs that are currently queued or executed. |
Examples |
|
jobs:list-details
Signatures | jobs:list-details() as element(job)* jobs:list-details($id as xs:string) as element(job)*
|
Summary | Returns information on all jobs that are currently queued or executed. The input comprises the job id, the type (XQuery, a command, REST, RESTXQ), the time a job is already being evaluated, the state (queued, running, stopped, timeout, memory) and the user who started the job. |
Examples |
<job id="job1" type="XQuery" duration="PT0S" state="running" user="admin"> XQUERY jobs:list-details() </job> |
jobs:finished
Signatures | jobs:finished($id as xs:string) as xs:boolean
|
Summary | Indicates if the evaluation of a job with the specified $id has finished:
|
jobs:stop
Signatures | jobs:stop($id as xs:string) as empty-sequence()
|
Summary | Cancels the execution of a job with the specified $id , or drops the cached result of a query. Unknown ids are ignored. All jobs are gracefully stopped; it is up to the process to decide when it is safe to shut down.
|
Asynchronous Execution
Asynchronous query execution is recommendable if a client does not, or cannot, wait until a request is fully processed. This is e. g. the case with web browsers, which will usually cancel a request after a specific timeout. In such cases, you can use asynchronous execution to trigger another server-side process, which will start the time-consuming process, and fetch the result later on as soon as it is available.
jobs:schedule
Signatures | jobs:schedule($query as xs:string) as xs:string jobs:schedule($query as xs:string, $bindings as map(*)?) as xs:string jobs:schedule($query as xs:string, $bindings as map(*)?, $options as map(xs:string, xs:string)) as xs:string |
Summary | Schedules the execution of the supplied $query and returns a query id. The query will be queued, and the result will optionally be cached. Queries may be updating.Variables and context items can be declared via $bindings (see xquery:eval for more details).The $options parameter contains evaluation options:
|
Errors | overflow : Too many queries or query results are queued. CACHETIMEOUT can be decreased if the default setting is too restrictive.range : A specified time or duration is out of range.
|
Examples |
declare %rest:POST("{$query}") %rest:path('/eval') function local:schedule($query) { jobs:schedule($query) * {{Code|jobs:schedule("import module namespace m='maintain'; m:cleanup()", (), map { 'start': '02:00:00', 'interval': 'P1D' })}} calls a maintenance function at 2am every day.<br /> * {{Code|jobs:schedule("prof:sleep(1500)", (), map { 'interval': 'PT1S' })}} tries to run a query every second. As the query will take 1.5 seconds, it will only be executed every second time.<br /> }; |
jobs:result
Signatures | jobs:result($id as xs:string) as item()*
|
Summary | Returns the cached result of a query with the specified job $id :
|
Errors | running : the job is still running.unknown : the supplied id is unknown: The id is unknown, or the result has already been retrieved. |
Examples |
declare %rest:path('/result/{$id}') function local:result($id) { jobs:result($id) };
let $query := jobs:schedule('(1 to 10000000)[. = 1]', map{}, map{ 'cache': true() }) return ( hof:until( function($f) { jobs:finished($query) }, function($f) { prof:sleep(10) }, () ), jobs:result($query) ) |
jobs:results
Signatures | jobs:results() as xs:string*
|
Summary | Returns the ids of all jobs for which results are cached. |
Errors
range
Code | Description |
---|---|
unknown
|
The supplied query id is unknown or not available anymore. |
running
|
A query is still running. |
overflow
|
Too many queries or query results are queued. |
A specified time or duration is out of range. |
Changelog
The module was introduced with Version 8.5.