Contents
Features by Examples
- Service Task
- Script Task
- Conditional Flow
- Form Input Fields
- Multiple Start Event
- Business Rule Task
- Script Extensions
- Timer Event
- Multi-instances Tasks
- Call Process
- Throwing and Cathcing Messages
- Input and Output Data Handling
- Gateway
- Event Based Gateway
- Boundary Events
- UserTask Assignment
Service Task
In Process definition (.bpmn file), use implementation
attribute to define name of JavaScript/TypeScript Method to perform the Task:
![Using Modeler](./images/bb-service.PNG) |
“`xml “`ts async service1(item,input) { “` |
Script Task
![Using Modeler](images/bb-script.PNG) |
“`xml this.log('testing from <testing> the inside: '+data.loopKey); |
Conditional Flow
![Using Modeler](images/bb-conditional-flow.PNG) |
“`xml <sequenceflow> <conditionexpression xsi:type="bpmn:tFormalExpression" language="JavaScript"> “` |
Form Input Fields
![Using Modeler](images/bb-form.PNG) |
“`xml “` |
Multiple Start Event
![Image description](examples/invoice-start.png) |
When a definition/process has multiple start node, you need to specify the start node when starting the process: From the Web UI: ![Image description](examples/invoice-start-prompt.png) From API: response = await api.engine.start('invoice', |
Business Rule Task
BPMN-Server supports Business Rules implemented through DMN-Engine
Business Rules can be defined as a Decision Table as in this example:
Decision Table is called through
<bpmn2:businessRuleTask id="Task_1lcamp6" name="Vacation" camunda:decisionRef="Vacation">
This will load the file ‘Vacation.json’ form the Processes folder as defined in configuration.js
Script Extensions
Scripts can be added to listen to two events:
- Start before the Task is executed
- End after the task is executed
![Using Modeler](images/bb-event-scripts.PNG) |
In this example we are adding a script to bpmn:startEvent “`xml console.log("This is the start event"); </script> console.log("This is the end event"); </script> “` |
Timer Event
![Using Modeler](images/bb-timer.PNG) |
“`xml |
Multi-instances Tasks
![Using Modeler](images/bb-multi-instance.PNG) |
“`xml |
Call Process
![Using Modeler](images/bb-call.PNG) |
“`xml “` |
Throwing and Cathcing Messages
In this example, we will demonstrate how can two seperate processes communicate through “Messages”
1 Throw a message with data
When a process throw a message, bpmn-server checks if there is another process that can catch this message before dispatching it to AppDelegate.
<bpmn2:intermediateThrowEvent id="throw_msg1" name="msg1">
<bpmn2:messageEventDefinition id="messageEventDef1" messageRef="Msg1" />
<bpmn2:extensionElements>
<camunda:script event="start"><![CDATA[
input.caseId= data.caseId;
this.messageMatchingKey={'data.caseId': data.caseId };
]]></camunda:script>
</bpmn2:extensionElements>
...
</bpmn2:intermediateThrowEvent>
The above will through a messsage as follows:
- Message Id:
Msg1
- Message Output:
caseId: <someValue>
2 Catch a message with data
The second process defines a start event to catch the message Msg1
<bpmn2:startEvent id="StartEvent_1w66wpl" name="msg1">
...
<bpmn2:messageEventDefinition id="messageEventDef4" messageRef="Msg1" />
</bpmn2:startEvent>
Therefore, the system will create a new instance of the second process and assign the Message output data, namely, the caseId
3 Throw a message with data and a Key
In addition, the second process sends a confirmation message Confirm1
to the first process
<bpmn2:intermediateThrowEvent id="throw_confirm1" name="confirm1">
<bpmn2:messageEventDefinition id="messageEventDef2" messageRef="Confirm1" />
<bpmn2:extensionElements>
<camunda:script event="transformOutput"><![CDATA[
this.output.confirm=true;
this.context.messageMatchingKey={'data.caseId': this.token.data.caseId };
]]></camunda:script>
</bpmn2:extensionElements>
...
</bpmn2:intermediateThrowEvent>
Howerver, the challenge here is that make sure the message is sent to the specific instance, that is where the Matching key is used
- Message Id:
Confirm1
- Message Output:
confirm: true
- Message Matching Keyt: ‘data.caseId’: this.token.data.caseId