The Workflow Scheduler
The Imixs-Workflow Scheduler is responsible for the automated processing of scheduled events. A scheduled event is a BPMN event assigned to a BPMN task. Scheduled events can be used e.g. for a auto reminding or an escalation task.
The Imixs WorkflowScheduler implements a TimerService to process workitems based on scheduled events. A scheduled event can be configured, using the Imixs-BPM Modeler, on the property tab ‘Timer’. If a workitem is in a status having scheduled events, the Imixs-Workflow Scheduler will process this workitem automatically based on the event definition.
The Scheduled Event
A scheduled event can be configured in the property tab ‘Timer’.
Description | |
---|---|
enabled | choose ‘yes’ to enable a scheduled event (default ‘no’) |
selection | optional definition to select workitems based on a query or selector class |
delay | delay in minutes, hours, days or working days |
from | base item to calculate the schedule |
Note: A scheduled event must define a base datetime item to calculate the schedule. You can choose a standard datetime item like ‘$created’, ‘$modified’ or ‘$lastprocessdate’ or you can define any datetime item managed by your application (e.g. a due-date or an invoice-date) .
The Timer Configuration
The WorkflowSchedulerService expects the scheduling configuration document. The scheduling configuration defines the timer interval to run the workflow scheduler.
A timer configuration can be created with the following item definitions:
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<item name="type">
<value xsi:type="xs:string">scheduler</value>
</item>
<item name="name">
<value xsi:type="xs:string">org.imixs.workflow.scheduler</value>
</item>
<item name="_scheduler_class">
<value xsi:type="xs:string">org.imixs.workflow.engine.WorkflowScheduler</value>
</item>
<item name="_scheduler_definition">
<value xsi:type="xs:string">hour=*</value>
<value xsi:type="xs:string">minute=30</value>
</item>
<item name="_scheduler_enabled">
<value xsi:type="xs:boolean">true</value>
</item>
</document>
The Scheduler configuration object can also be created by the WorkflowSchedulerController bean:
@Inject
WorkflowSchedulerController workflowSchedulerController;
public void setup() {
ItemCollection config=workflowSchedulerController.getConfiguration();
config.setItemValue("_scheduler_definition", "hour=*");
config.appendItemValue("_scheduler_definition", "minute=/5");
workflowSchedulerController.setConfiguration(config);
workflowSchedulerController.saveConfiguration();
workflowSchedulerController.startScheduler();
}
With the method call startScheduler() the workflow scheduler will be started.
Scheduling
The Imixs WorkflowSchedulerService uses a calendar-based syntax for scheduling based on the EJB 3.1 Timer Service specification. The syntax takes its roots from the Unix cron utility. The following attributes can be stored as a value list in the item ‘_scheduler_definition’:
Attriubte | Description | Possible Values | Default Value |
---|---|---|---|
second | One or more seconds within a minute | [0,59] | 0 |
minute | One or more minutes within a hour | [0,59] | 0 |
hour | One or more hours within a day | [0,23] | 0 |
dayOfMonth | One or more days within a month |
[1,31] or “1st”,“2nd”,“3rd”,…. or “Sun”,“Mon”,“Tue”,“Wed”,“Thu”,“Fri”,“Sat” or “Last” (the last day in month) or -x (means x day(s) before the last day of or the month |
* |
month | One or more month within a year | [1,12] or “Jan”,“Feb”,“Mar”,“Apr”,“May”, “Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,“Dec” |
* |
dayOfWeek | One or more days within a week | [1,7] or “Sun”,Mon",“Thu”,“Wed”,“Thu”,“Fri”,“Sat” “0” and “7” refer to Sunday! | * |
year | A paticular year | 4 digit calendar year | * |
timezone | A specific time zone | see time zoneinof (or tz) database | * |
start | Start date | yyyy/mm/dd | |
end | End date | yyyy/mm/dd |
Each attribute of an expression supports values in different formats. For example you can define a list of days or a range of years. The the following table with suported value formats:
Format | Description | Example |
---|---|---|
Single Value | only one possible value | year=“2009” or month=“May” |
Wildcard | all possible values | year=“*” or dayOfWeek=“*” |
List | two or more values | year=“2014,2015” or dayOfWeek=“Sat,Sun” |
Range | range of values | second=“1-10” or dayOfWeek=“Mon-Fri” |
Increments | startignpoint and increment | minute=“*/15” or second=“30/10” |
So you can configure the scheduler is several ways. Here a some typical exampls for possible configuration:
Every hour
hour=*
Every five minutes with the hour
minute=*/15
hour=*
Every hour from Monday to Friday
hour=*
dayOfWeek=1-5
Every 30 minutes with the hours from 8:00 AM to 5:00 PM, from Monday to Friday
minute=*/30
hour=8-17
dayOfWeek=1-5
Only Sunday on 1:00 AM
hour=1
dayOfWeek=7
The configuration entity will be updated by the WorkflowSchedulerService in each iteration and provides the following additional information.
property | type | description |
---|---|---|
$uniqueid | String | defines the unique ID the for the corresponding TimerService |
_scheduler_definition | String List | Holds information about the calendar based scheduling |
_scheduler_enabled | Boolean | indicates if the scheduler is enabled |
_scheduler_logmessage | String List | message log (read only) |
_scheduler_errormessage | String | Error message details (read only) |
_scheduler_status | String | current status (read only) |
_scheduler_class | String | read only must be set to “org.imixs.workflow.engine.WorkflowScheduler” |
nextTimeout | Date | Timestamp for next timeout (read only) |
timeRemaining | Long | milliseconds until next timeout (read only) |
Selector
The workitems processed by the scheduler are selected by a default selector based on the $TaskID and the $workflowgroup.
($taskid:"[TASKID]" AND $workflowgroup:"[MY-WORKFLOWGROUP]")
The selector can be overwritten by a BPMN event. For example the workflow group can be replaced by the modelversion to select only a subset of process instances:
($taskid:"[TASKID]" AND $modelversion:"1.0.0")
Custom QuerySelector
An application can implement a QuerySelector CDI bean to provide a custom selection of scheduled workitems. The full qualified class name of a QuerySelector can be used instead of a search query.
myapp.selectors.MyCustomSelector
If a QuerySelector is defined, the WorkflowScheduler tries to inject the selector CDI Bean and calls the find method to select the workitems to be scheduled.
Ignored Workitems
The WorkflowSchedulerService processes all kinds of workitems which are assigned to a valid workflow model definition with scheduled events. A workitem is ignored by the WorkflowSchedulerService only in case the workitem type ends with the sufix ‘deleted’
type=workitemdeleted
or the workitem is marked as immutable
$immutable=true
See the DocumentService for details.