Task API
Contents
Functions for execution of asynchronous tasks.
Usage
Add the following to your build.gradle
file:
dependencies {
include "com.enonic.xp:lib-task:${xpVersion}"
}
Add the import
statement to your controller:
import taskLib from '/lib/xp/task';
You are now ready to use the API.
Events
Usage of this API produces the following events:
Event | Occurs when |
---|---|
task.submitted |
a task is submitted |
task.updated |
a task is updated |
task.removed |
a task is removed |
task.finished |
a task completes |
task.failed |
a task fails |
For more information on events, check out the event API
Functions
get
Returns the current state and progress details for the specified task.
Parameters
Name | Type | Description |
---|---|---|
taskId |
string |
Id of the task |
Returns
object : (TaskInfo
) Detail information for the task. Or null if the task could not be found.
Example
import {get as getTask} from '/lib/xp/task';
const taskInfo = getTask('7ca603c1-3b88-4009-8f30-46ddbcc4bb19');
if (taskInfo) {
log.info('Current task state = %s', taskInfo.state);
} else {
log.info('Task not found');
}
const expected = {
description: "Long running task",
id: "7ca603c1-3b88-4009-8f30-46ddbcc4bb19",
name: "task-7ca603c1-3b88-4009-8f30-46ddbcc4bb19",
state: "RUNNING",
application: "com.enonic.myapp",
user: "user:store:me",
startTime: "2017-10-01T09:00:00Z",
progress: {
info: "Processing item 33",
current: 33,
total: 42
}
};
isRunning
Checks if any task with the given name or id is currently running.
Parameters
Name | Type | Description |
---|---|---|
task |
string |
Name or id of the task. |
Returns
boolean : true
if there is a task with the specified name or id, and state 'RUNNING'; false
otherwise.
Example
import {isRunning} from '/lib/xp/task';
if (!isRunning('com.enonic.myapp:clean-up-task')) {
log.info('Start task...');
} else {
log.info('Task already running');
}
list
Returns the list of running tasks with their current state and progress details. On clustered environments aggregated list is returned.
Parameters
Name | Type | Attributes | Description | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
params |
object |
<optional> |
JSON with optional parameters
|
Returns
Array : (TaskInfo[]
) List with task information for every task.
Example
import {list} from '/lib/xp/task';
const tasks = list();
const expected = [
{
description: "Long running task",
id: "7ca603c1-3b88-4009-8f30-46ddbcc4bb19",
name: "task-7ca603c1-3b88-4009-8f30-46ddbcc4bb19",
state: "RUNNING",
application: "com.enonic.app1",
user: "user:store:user1",
startTime: "2017-10-01T09:00:00Z",
progress: {
info: "Processing item 33",
current: 33,
total: 42
}
},
{
description: "Update statistics",
id: "b6173bcb-bf54-409b-aa6b-96ae6fcec263",
name: "task-b6173bcb-bf54-409b-aa6b-96ae6fcec263",
state: "FINISHED",
application: "com.enonic.app2",
user: "user:store:user2",
startTime: "2017-10-02T09:00:00Z",
progress: {
info: "Work completed",
current: 0,
total: 0
}
},
{
description: "Import remote data",
id: "e1f57280-d672-4cd8-b674-98e26e5b69ae",
name: "task-e1f57280-d672-4cd8-b674-98e26e5b69ae",
state: "FAILED",
application: "com.enonic.app3",
user: "user:store:user3",
startTime: "2017-10-03T09:00:00Z",
progress: {
info: "Fetching data",
current: 33,
total: 100
}
}
];
import {list} from '/lib/xp/task';
const tasks = list({
name: "com.enonic.myapp:clean-up",
state: "RUNNING"
});
const expected = [
{
description: "Long running task",
id: "7ca603c1-3b88-4009-8f30-46ddbcc4bb19",
name: "com.enonic.myapp:clean-up",
state: "RUNNING",
application: "com.enonic.myapp",
user: "user:store:user",
startTime: "2017-10-01T09:00:00Z",
progress: {
info: "Processing item 33",
current: 33,
total: 42
}
}
];
progress
Reports progress information from an executing task. This function can only be called within the context of a task function, otherwise it will fail and throw an exception.
Parameters
Name | Type | Description | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
params |
object |
JSON with progress details
|
Returns
void
Example
import {executeFunction, progress} from '/lib/xp/task';
const taskId = executeFunction({
description: 'Background task',
func: () => {
progress({info: 'Initializing task'});
for (const i of Array(10).keys()) {
progress({
info: 'Processing item ' + (i + 1),
current: i,
total: 10
});
processItem(i);
}
progress({info: 'Task completed'});
}
});
sleep
Causes the current execution thread to sleep (temporarily cease execution) for the specified number of milliseconds.
Parameters
Name | Type | Description |
---|---|---|
timeMillis |
number |
The length of time to sleep in milliseconds |
Returns
void
Example
import {sleep} from '/lib/xp/task';
let retries = 3;
let result = fetchRemoteData();
while (!result && retries > 0) {
// wait half a second before retrying
sleep(500);
retries -= 1;
result = fetchRemoteData();
}
executeFunction
Executes a function in the background. Returns an id representing the task of execution.
This function returns immediately. The callback function will be executed asynchronously.
Parameters
Name | Type | Description | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
params |
object |
JSON with the parameters
|
Returns
string : Id of the task function that will be executed.
Example
import {executeFunction} from '/lib/xp/task';
const taskId = executeFunction({
description: 'Background function',
func: () => {
longRunningFunction();
}
});
submitTask
Submits a named task to be executed in the background and returns an id representing the task.
This function returns immediately. The callback function will be executed asynchronously. |
lib-task prior version 7.6 does not submit distributable named tasks, instead task always gets executed locally. Recompile your application with the newer library version in order for tasks to be distributable. |
Parameters
Name | Type | Description | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
params |
object |
JSON with the parameters
|
Returns
string : Id of the task that will be executed.
Example
import {submitTask} from '/lib/xp/task';
const taskId = submitTask({
descriptor: 'job42',
config: {
count: 123
}
});
import {submitTask} from '/lib/xp/task';
const taskId = submitTask({
descriptor: 'com.enonic.app.myapp:work',
config: {}
});
submit
Deprecated from
Replaced with executeFunction.
submitNamed
Deprecated from
Replaced with submitTask
Type Definitions
TaskInfo
Type
object
Properties
Name | Type | Description | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id |
string |
Task Id |
||||||||||||
name |
string |
Task name |
||||||||||||
description |
string |
Task description |
||||||||||||
state |
string |
Task state ( |
||||||||||||
application |
string |
Application containing the callback function to run |
||||||||||||
user |
string |
Key of the user that submitted the task |
||||||||||||
startTime |
string |
Time when the task was submitted (in ISO-8601 format) |
||||||||||||
progress |
object |
Progress information provided by the running task |
||||||||||||
node |
string |
XP cluster node the task is running on
|