Difference between revisions of "Job Module"
Line 88: | Line 88: | ||
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. | 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: | + | ==jobs:eval== |
{| width='100%' | {| width='100%' | ||
|- | |- | ||
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
− | |{{Func|jobs: | + | |{{Func|jobs:eval|$query as xs:string|xs:string}}<br />{{Func|jobs:eval|$query as xs:string, $bindings as map(*)?|xs:string}}<br />{{Func|jobs:eval|$query as xs:string, $bindings as map(*)?, $options as map(xs:string, xs:string)|xs:string}}<br /> |
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
− | |Schedules the | + | |Schedules the evaluation of the supplied {{Code|$query}} and returns a query id. The query will be queued, and the result will optionally be cached. Queries can be updating. Variables and context items can be declared via {{Code|$bindings}} (see [[XQuery Module#xquery:eval|xquery:eval]] for more details). The {{Code|$options}} parameter contains scheduling options: |
* {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>false</code>): | * {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>false</code>): | ||
** The result will be cached in main-memory until it is fetched via [[#jobs:result|jobs:result]], or until {{Option|CACHETIMEOUT}} is exceeded. | ** The result will be cached in main-memory until it is fetched via [[#jobs:result|jobs:result]], or until {{Option|CACHETIMEOUT}} is exceeded. | ||
Line 115: | Line 115: | ||
* Cache query result. The returned id can be used to pick up the result with [[#jobs:result|jobs:result]]: | * Cache query result. The returned id can be used to pick up the result with [[#jobs:result|jobs:result]]: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
− | jobs: | + | jobs:eval("1+3", (), map { 'cache': true() }) |
</pre> | </pre> | ||
* A happy birthday mail will be sent at the given date: | * A happy birthday mail will be sent at the given date: | ||
<pre class="brush:xquery"> | <pre class="brush:xquery"> | ||
− | jobs: | + | jobs:eval("import module namespace mail='mail'; mail:send('Happy birthday!')", |
(), map { 'start': '2018-09-01T06:00:00' })}} | (), map { 'start': '2018-09-01T06:00:00' })}} | ||
</pre> | </pre> | ||
Line 125: | Line 125: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
declare %rest:POST("{$query}") %rest:path('/start-scheduling') function local:start($query) { | declare %rest:POST("{$query}") %rest:path('/start-scheduling') function local:start($query) { | ||
− | jobs: | + | jobs:eval($query, (), map { 'start': '02:00:00', 'interval': 'P1D' }) |
}; | }; | ||
declare %rest:path('/stop-scheduling/{$id}') function local:stop($id) { | declare %rest:path('/stop-scheduling/{$id}') function local:stop($id) { | ||
Line 133: | Line 133: | ||
* Query execution is scheduled for every second, and for 10 seconds in total. As the query itself will take 1.5 seconds, it will only be executed every second time: | * Query execution is scheduled for every second, and for 10 seconds in total. As the query itself will take 1.5 seconds, it will only be executed every second time: | ||
<pre class="brush:xquery"> | <pre class="brush:xquery"> | ||
− | jobs: | + | jobs:eval("prof:sleep(1500)", (), map { 'interval': 'PT1S', 'end': 'PT10S' }) |
</pre> | </pre> | ||
|} | |} | ||
Line 162: | Line 162: | ||
* 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: | * 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: | ||
<pre class='brush:xquery'> | <pre class='brush:xquery'> | ||
− | let $query := jobs: | + | let $query := jobs:eval('(1 to 10000000)[. = 1]', map{}, map{ 'cache': true() }) |
return ( | return ( | ||
hof:until( | hof:until( |
Revision as of 13:38, 5 July 2016
This XQuery Module provides functions for organizing scheduled, queued, running and cached jobs. Jobs can be commands, queries, client or HTTP 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 registered. The list includes scheduled, queued, running jobs, and cached jobs. |
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 registered. The list includes scheduled, queued, running jobs, and cached jobs. A string representation of the job will be returned in the text node. The returned elements have additional attributes:
|
Examples |
<job id="job1" type="XQuery" state="running" user="admin" duration="PT0.001S"> 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. As the ids of finished jobs will usually be discarded, unless caching is enabled, the function will also return true for unknown jobs.
|
jobs:stop
Signatures | jobs:stop($id as xs:string) as empty-sequence()
|
Summary | Cancels the execution of a job with the specified $id , drops the cached result of a query, or cancels a scheduled job. 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:eval
Signatures | jobs:eval($query as xs:string) as xs:string jobs:eval($query as xs:string, $bindings as map(*)?) as xs:string jobs:eval($query as xs:string, $bindings as map(*)?, $options as map(xs:string, xs:string)) as xs:string |
Summary | Schedules the evaluation of the supplied $query and returns a query id. The query will be queued, and the result will optionally be cached. Queries can be updating. Variables and context items can be declared via $bindings (see xquery:eval for more details). The $options parameter contains scheduling options:
|
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 |
jobs:eval("1+3", (), map { 'cache': true() })
jobs:eval("import module namespace mail='mail'; mail:send('Happy birthday!')", (), map { 'start': '2018-09-01T06:00:00' })}}
declare %rest:POST("{$query}") %rest:path('/start-scheduling') function local:start($query) { jobs:eval($query, (), map { 'start': '02:00:00', 'interval': 'P1D' }) }; declare %rest:path('/stop-scheduling/{$id}') function local:stop($id) { jobs:stop($id) };
jobs:eval("prof:sleep(1500)", (), map { 'interval': 'PT1S', 'end': 'PT10S' }) |
jobs:result
Signatures | jobs:result($id as xs:string) as item()*
|
Summary | Returns the cached result of a job 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:eval('(1 to 10000000)[. = 1]', map{}, map{ 'cache': true() }) return ( hof:until( function($f) { jobs:finished($query) }, function($f) { prof:sleep(10) }, () ), jobs:result($query) ) |
Errors
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. |
range
|
A specified time or duration is out of range. |
Changelog
The module was introduced with Version 8.5.