Difference between revisions of "Job Module"

From BaseX Documentation
Jump to navigation Jump to search
Line 113: Line 113:
 
<pre class="brush:xquery">
 
<pre class="brush:xquery">
 
jobs:schedule("import module namespace mail='mail'; mail:send('Happy birthday!')",
 
jobs:schedule("import module namespace mail='mail'; mail:send('Happy birthday!')",
   (), map { 'start': '2018-09-01T06:00:00', 'interval': 'P1D' })}}
+
   (), map { 'start': '2018-09-01T06:00:00' })}}
</pre>
 
* Query execution is scheduled for every second. As the query itself will take 1.5 seconds, it will only be executed every second time:
 
<pre class="brush:xquery">
 
jobs:schedule("prof:sleep(1500)", (), map { 'interval': 'PT1S' })
 
 
</pre>
 
</pre>
 
* The following [[RESTXQ]] functions can be called to execute a specified query at 2am every day. An id will be returned, which can be used to stop the scheduler again:
 
* The following [[RESTXQ]] functions can be called to execute a specified query at 2am every day. An id will be returned, which can be used to stop the scheduler again:
Line 127: Line 123:
 
   jobs:stop($id)
 
   jobs:stop($id)
 
};
 
};
 +
</pre>
 +
* Query execution is scheduled for every second. As the query itself will take 1.5 seconds, it will only be executed every second time:
 +
<pre class="brush:xquery">
 +
jobs:schedule("prof:sleep(1500)", (), map { 'interval': 'PT1S' })
 
</pre>
 
</pre>
 
|}
 
|}

Revision as of 10:51, 3 July 2016

This XQuery Module provides functions for organizing queued and running jobs (commands, queries, REST, RESTXQ and WebDAV requests).

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() returns the same job id as jobs:current if no other job is running.
  • jobs:list()[. != jobs:current()] ! jobs:stop(.) stops and invalidates all asynchronous queries and results except for the current one.

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
  • jobs:list-details() returns information on the currently running job and possibly others:
<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:
  • true indicates that the job has either finished, or that the id is unknown.
  • false indicates that the job id is still queued or currently running.

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 scheduling options:
  • cache: indicates if the query result will be cached or ignored (default: false):
    • The result will be cached in main-memory until it is fetched via jobs:result, or until CACHETIMEOUT is exceeded.
    • If the query raises an error, it will be cached and returned instead.
  • start: a dayTimeDuration, time or dateTime can be specified to delay the execution of the query:
    • If a dayTimeDuration is specified, the query will be queued after the specified duration has passed. Examples for valid values are: P1D (1 day), PT5M (5 minutes), PT0.1S (100 ms). An error will be raised if a negative value is specified.
    • If a time is specified, the query will be executed at this time of the day. Examples for valid times are: 02:00:00 (2am), 12:00:00 (noon). If the time lies in the past, the query will be executed next day.
    • If a dateTime is specified, the query will be executed at this date. Examples for valid values are: 2018-12-31T23:59:59 (New Year's Eve 2018, close to midnight). An error will be raised if the specified time lies in the past.
  • 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 (PT1S). If the next scheduled call is due, and if a query with the same id is still running, it will be skipped.
  • base-uri: set the base-uri property for the query. This URI will be used when resolving relative URIs, such as with fn:doc.
Errors overflow: Query execution is rejected, because too many jobs are queued or being executed. CACHETIMEOUT can be decreased if the default setting is too restrictive.
range: A specified time or duration is out of range.
Examples
  • Cache query result. An id will be returned, which can be used to pick up the result via jobs:result):
jobs:schedule("1+3", (), map { 'cache': true() })
  • A happy birthday mail will be sent at the given date:
jobs:schedule("import module namespace mail='mail'; mail:send('Happy birthday!')",
  (), map { 'start': '2018-09-01T06:00:00' })}}
  • The following RESTXQ functions can be called to execute a specified query at 2am every day. An id will be returned, which can be used to stop the scheduler again:
declare %rest:POST("{$query}") %rest:path('/start-scheduling') function local:start($query) {
  jobs:schedule($query, (), map { 'start': '02:00:00', 'interval': 'P1D' })
};
declare %rest:path('/stop-scheduling/{$id}') function local:stop($id) {
  jobs:stop($id)
};
  • Query execution is scheduled for every second. As the query itself will take 1.5 seconds, it will only be executed every second time:
jobs:schedule("prof:sleep(1500)", (), map { 'interval': 'PT1S' })

jobs:result

Signatures jobs:result($id as xs:string) as item()*
Summary Returns the cached result of a query with the specified job $id:
  • Results can only be retrieved once. After retrieval, the cached result will be dropped.
  • If the original query has raised an error, the cached error will be raised instead.
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
  • The following RESTXQ function will either return the result of a previously started query or an error:
declare %rest:path('/result/{$id}') function local:result($id) {
  jobs:result($id)
};
  • The following query demonstrates how the results of an asynchronously executed query can be returned within the same query. Please remember that this is not the common way how these functions will be used in practice:
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.