Chapter 27. Activities, Tasks and Sub-Processes

27.1. Activity

"An Activity is work that is performed within a Business Process." [7]

This is opposed to the execution semantics of other elements that defined the process logic.

An activity can be:

  • A sub-process; compound, can be broken down into multiple process elements.
  • A task; atomic, represents a single unit of work.

An activity in Red Hat JBoss BPM Suite expects one incoming and one outgoing flow. If you want to design an activity with multiple incoming and multiple outgoing flows, set the system property jbpm.enable.multi.con to true. For more information about system properties, see chapter System Properties of the Red Hat JBoss BPM Suite Administration and Configuration Guide.

Activities share properties ID and Name. Note that activities, that is all tasks and sub-processes, have additional properties specific for the given activity or task type.

27.2. Activity Mechanisms

27.2.1. Multiple Instances

You can run activities in multiple instances during execution. Individual instances are executed in a sequence. The instances are run based on a collection of elements. For every element in the collection, a new activity instance is created.

Every multiple-instance activity has the Collection Expression attribute that maps the input collection of elements to a single element. The multiple-instance activity then iterates through all the elements of the collection.

27.2.2. Activity Types

27.2.2.1. Call Activity

“A Call Activity identifies a point in the Process where a global Process or a Global Task is used. The Call Activity acts as a 'wrapper' for the invocation of a global Process or Global Task within the execution. The activation of a call Activity results in the transfer of control to the called global Process or Global Task. [8]

A call activity, that is a Reusable sub-process, represents an invocation of a process from within a process. The activity must have one incoming and one outgoing flow.

When the execution flow reaches the activity, the activity creates an instance of a process with the defined ID.

Attributes
Called Element
The ID of the process to be called and instantiated by the activity.

27.3. Tasks

A task is the smallest unit of work in a process flow. Red Hat JBoss BPM Suite uses the BPMN guidelines to separate tasks based on the types of inherent behavior that the tasks represent. This section defines all task types available in Red Hat JBoss BPM Suite except for the User Task. For more information about the User Task, see Section 27.5, “User Task”.

27.3.1. None Task

"Abstract Task: Upon activation, the Abstract Task completes. This is a conceptual model only; an Abstract Task is never actually executed by an IT system." [9]

27.3.2. Send Task

"Send Task: Upon activation, the data in the associated Message is assigned from the data in the Data Input of the Send Task. The Message is sent and the Send Task completes." [10]

Attributes

MessageRef
The ID of the generated message object.
Note

In Red Hat JBoss BPM Suite 6.x, the Send Task is not supported. A custom WorkItemHandler implementation is needed to use the Send task.

27.3.3. Receive Task

"Upon activation, the Receive Task begins waiting for the associated Message. When the Message arrives, the data in the Data Output of the Receive Task is assigned from the data in the Message, and Receive Task completes." [11]

Attributes

MessageRef
ID of the associated message object.

27.3.4. Manual Task

"Upon activation, the Manual Task is distributed to the assigned person or group of people. When the work has been done, the Manual Task completes. This is a conceptual model only; a Manual Task is never actually executed by an IT system." [12]

27.3.5. Service Task

Use a Service Task to invoke web services and Java methods.

Table 27.1. Service Task Attributes

AttributeDescription

Implementation

The underlying technology used for implementing the task. Possible values are WebService, which is the default value, and unspecified.

OperationRef

Specifies the operation that is invoked by the task: typically a particular method of a Java class or a web service method.

27.3.5.1. Using Service Task to Invoke Web Service

Important

The preferred way of invoking web services is to use a WS Task, as opposed to a generic Service Task. For more information, see Chapter 31, WS Task.

The default implementation of a Service Task in the BPMN2 specification is a web service. The web service support is based on the Apache CXF dynamic client, which provides a dedicated Service Task handler that implements the WorkItemHandler interface:

org.jbpm.process.workitem.bpmn2.ServiceTaskHandler

As a part of the process definition, you must first configure the web service:

  1. Open the process in Process Editor.
  2. Open the Properties panel on the right and click the Value field next to the Imports property. Click the arrow that appears on the right to open the Editor for Imports window.
  3. Click Add Import to import the required WSDL (Web Services Description Language) values. For example:

  4. Drag a Service Task (TasksService) from the Object Library into the canvas.
  5. Click the task, and in the Properties panel on the right, set the following:

    • Service Implementation: Webservice
    • Service Interface: SimpleService
    • Service Operation: hello
  6. In the Core Properties section, click the Value field next to the Assignments property. Click the arrow that appears on the right to open the Data I/O window and do the following:

    1. Provide a data input named Parameter.
    2. Optionally, provide a data output named Result.

    For an example setting in the Service Task Data I/O window, see the image below:

    service task assignments

To use a request or a response object of the service as a variable, the objects must all implement the java.io.Serializable interface to use persistence properly. To add the interface while generating classes from WSDL, configure the JAXB API:

  1. Create an XML binding file with the following contents.

    <?xml version="1.0" encoding="UTF-8"?>
    <bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd" version="2.1">
      <globalBindings>
        <serializable uid="1" />
      </globalBindings>
    </bindings>
  2. Add the Apache CXF Maven plug-in (cxf-codegen-plugin) to the pom.xml file of the project:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-codegen-plugin</artifactId>
          <version>CXF_VERSION</version>
          ...
        </plugin>
      </plugins>
    <build>

27.3.5.2. Using Service Task to Invoke Java Method

You can use a Service Task to invoke a method of a particular Java class. The method can have only one parameter and returns a single value. If the invoked Java class is not a part of the project, add all the required dependencies to the pom.xml file of the project.

The following procedures use an example class WeatherService with a method int getTemperature(String location). The method has one parameter (String location) and returns a single value (int temperature).

Invoking Java Method in Red Hat JBoss Developer Studio

  1. In Red Hat JBoss Developer Studio, open the business process that you want to add a Service Task to, or create a new process with a start and an end event.
  2. Select WindowShow ViewProperties, and click Interfaces in the lower-right corner of the Properties panel.
  3. Click the Import icon ( ds import icon ) to open the Browse for a Java type to Import window. To find the Java type, start typing WeatherService in the Type field. In the Available Methods list box below, select the int getTemperature(String) method. Click OK.

    Note that it is also possible to select the Create Process Variables check box to automatically import process variables with generated names. In this procedure, the process variables are created manually.

  4. In the Properties panel, click Data Items. Click the Add icon ( ds add icon ) to create a local process variable:

    1. Enter the process variable details:

      • Name: location
      • Data Type: java.lang.String
    2. Create a second process variable:

      • Name: temperature
      • Data Type: java.lang.Integer
  5. Add a Service Task to the process:

    1. Drag a Service Task (TasksService Task) from the Palette panel on the right to the canvas.
    2. Double-click the Service Task on the canvas to open the Edit Service Task window. Click Service Task and set the following properties:

      • Implementation: Java
      • Operation: WeatherService/getTemperature
      • Source: location
      • Target: temperature
    3. Click OK and save the process.
  6. The Java application that starts the business process must be available. If you created a new business process and do not have the application, create a new jBPM project with an example application:

    1. Click FileNewOtherjBPMjBPM project. Click Next.
    2. Select the second option and click Next to create a project and populate it with some example files to help you get started quickly.
    3. Enter a project name and select the Maven radio button. Click Finish.
  7. Register work item handlers. In the src/main/resources/META-INF/ directory, create a file named kie-deployment-descriptor.xml with the following contents:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <deployment-descriptor xsi:schemaLocation="http://www.jboss.org/jbpm deployment-descriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <persistence-unit>org.jbpm.domain</persistence-unit>
      <audit-persistence-unit>org.jbpm.domain</audit-persistence-unit>
      <audit-mode>JPA</audit-mode>
      <persistence-mode>JPA</persistence-mode>
      <runtime-strategy>SINGLETON</runtime-strategy>
      <marshalling-strategies/>
      <event-listeners/>
      <task-event-listeners/>
      <globals/>
      <work-item-handlers>
        <work-item-handler>
          <resolver>mvel</resolver>
          <identifier>new org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler()</identifier>
          <parameters/>
          <name>Log</name>
        </work-item-handler>
        <work-item-handler>
          <resolver>mvel</resolver>
          <identifier>new org.jbpm.process.workitem.bpmn2.ServiceTaskHandler(ksession, classLoader)</identifier>
          <parameters/>
          <name>Service Task</name>
        </work-item-handler>
        <work-item-handler>
          <resolver>mvel</resolver>
          <identifier>new org.jbpm.process.workitem.webservice.WebServiceWorkItemHandler(ksession, classLoader)</identifier>
          <parameters/>
          <name>WebService</name>
        </work-item-handler>
        <work-item-handler>
          <resolver>mvel</resolver>
          <identifier>new org.jbpm.process.workitem.rest.RESTWorkItemHandler(classLoader)</identifier>
          <parameters/>
          <name>Rest</name>
        </work-item-handler>
      </work-item-handlers>
      <environment-entries/>
      <configurations/>
      <required-roles/>
      <remoteable-classes/>
      <limit-serialization-classes>true</limit-serialization-classes>
    </deployment-descriptor>
  8. Open the ProcessMain.java file that is located in the src/main/java directory, and modify the code of the application that starts the business process:

    1. Initialize the process variables:

      Map<String, Object> arguments = new HashMap<>();
      arguments.put("location", "Brno");
      arguments.put("temperature", -1);
    2. Start the process:

      ksession.startProcess("demo-package.demo-service-task", arguments);

Invoking Java Method in Business Central

  1. The invoked Java class must be available either on the class path or in the dependencies of the project. To add the class to the dependencies of the project:

    1. In Business Central, click AuthoringArtifact Repository.
    2. Click Upload to open the Artifact upload window.
    3. Choose the .jar file, and click upload button .
    4. Click AuthoringProject Authoring, and find or create the project you want to use.
    5. Click Open Project Editor and then Project Settings: Project General SettingsDependencies.
    6. Click Add from repository, locate the uploaded .jar file, and click Select.
    7. Save the project.
  2. Open or create the business process to which you want to add a Service Task.
  3. In Process Editor, open the Properties panel on the right and click the Value field next to the Imports property. Click the arrow that appears to open the Editor for Imports window. In the window:

    1. Click Add Import and specify the following values:

      • Import Type: default
      • Custom Class Name: fully qualified name of the invoked Java class, for example org.jboss.weather.WeatherService
    2. Click Ok.
  4. Create process variables:

    1. In the Properties panel, click the Value field next to the Variable Definitions property. Click the arrow that appears to open the Editor for Variable Definitions window.
    2. Click Add Variable to add the following two process variables:

      • Name: temperature, Defined Types: Integer (or Custom Type: java.lang.Integer)
      • Name: location, Defined Types: String (or Custom Type: java.lang.String)
    3. Click Ok.
  5. To add a Service Task into the process, drag and drop a Service Task (TasksService) from the Object Library panel on the left into the canvas.
  6. Click the Service Task on the canvas to open its properties on the right, and set the following properties:

    • Service Interface: org.jboss.weather.WeatherService
    • Service Operation: getTemperature
  7. Click the Value field next to the Assignments property. Click the arrow that appears to open the Data I/O window and do the following:

    1. Click Add next to Data Inputs and Assignments and add the following:

      • Name: Parameter, Data Type: String, Source: location
      • Name: ParameterType, Data Type: String, Source: java.lang.String (to add this value, click Constant …​ and type it manually)
    2. Click Add next to Data Outputs and Assignments and add the following:

      • Name: Result, Data Type: Integer, Target: temperature
    3. Click Save.

27.3.6. Business Rule Task

“A Business Rule Task provides a mechanism for the Process to provide input to a Business Rules Engine and to get the output of calculations that the Business Rules Engine might provide. [13]

The task defines a set of rules that need to be evaluated and fired on task execution. Any rule defined as part of the ruleflow group in a rule resource is fired.

When a Business Rule Task is reached in the process, the engine starts executing the rules with the defined ruleflow group. When there are no more active rules with the ruleflow group, the execution continues to the next element. During the ruleflow group execution, new activations belonging to the active ruleflow group can be added to the agenda as these are changed by the other rules. Note that the process continues immediately to the next element if there are no active rules of the ruleflow group.

If the ruleflow group was already active, the ruleflow group remains active and the execution continues if all active rules of the ruleflow group have been completed.

Attributes

Ruleflow Group
The name of the ruleflow group that includes the set of rules to be evaluated by the task. This attribute refers to the ruleflow-group keyword in your DRL file.

27.3.7. Script Task

A Script Task represents a script to be executed during the process execution.

The associated Script can access process variables and global variables. When using a Script Task:

  • Avoid low-level implementation details in the process. A Script Task could be used to manipulate variables, but consider using a Service Task when modelling more complex operations.
  • The script should be executed immediately. If there is the possibility that the execution could take some time, use an asynchronous Service Task.
  • Avoid contacting external services through a Script Task. It would be interacting with external services without notifying the engine, which can be problematic. Model communication with an external service using a Service Task.
  • Scripts should not throw exceptions. Runtime exceptions should be caught and managed, for example, inside the script or transformed into signals or errors that can then be handled inside the process.

When a Script Task is reached during execution, the script is executed and the outgoing flow is taken.

Attributes

Script
The script to be executed.
Script Language
The language in which the script is written.

From Red Hat JBoss BPM Suite 6.2 onwards, JavaScript is supported as a dialect in Script Tasks. To define a Script Task in Business Central and JBoss Developer Studio using the process design tool:

  1. Select a Script Task object from the Object Library menu on the left hand side and add it to the process design tool.
  2. In the Properties panel on the right hand side, open the Script property.
  3. Write the script to be executed in the Expression Editor window and click Ok.

Example 27.1. Script Task in Business Central using JavaScript

Script Task JavaScript

27.4. Sub-Process

“A Sub-Process is an Activity whose internal details have been modeled using Activities, Gateways, Events, and Sequence Flows. A Sub-Process is a graphical object within a Process, but it also can be 'opened up’to show a lower-level Process. [14]

You can understand a sub-process as a compound activity or a process in a process. When reached during execution, the element context is instantiated and the encapsulated process triggered. Note that, if you use a Terminating End Event inside a sub-process, the entire process instance that contains the sub-process is terminated, not just the sub-process. A sub-process ends when there are no more active elements in it.

The following sub-process types are supported:

  • Ad-Hoc sub-process, which has no strict element execution order.
  • Embedded sub-process, which is a part of the parent process execution and shares its data.
  • Reusable sub-process, which is independent from its parent process.
  • Event sub-process, which is only triggered on a start event or a timer.

Note that any sub-process type can be a multi-instance sub-process.

27.4.1. Embedded Sub-Process

An embedded sub-process encapsulates a part of the process.

It must contain a start event and at least one end event. Note that the element allows you to define local sub-process variables, that are accessible to all elements inside this container.

27.4.2. AdHoc Sub-Process

“An Ad-Hoc Sub-Process is a specialized type of Sub-Process that is a group of Activities that have no REQUIRED sequence relationships. A set of Activities can be defined for the Process, but the sequence and number of performances for the Activities is determined by the performers of the Activities. [15]

“An Ad-Hoc Sub-Process or Process contains a number of embedded inner Activities and is intended to be executed with a more flexible ordering compared to the typical routing of Processes. Unlike regular Processes, it does not contain a complete, structured BPMN diagram description--€”i.e., from Start Event to End Event. Instead the Ad-Hoc Sub-Process contains only Activities, Sequence Flows, Gateways, and Intermediate Events. An Ad-Hoc Sub-Process MAY also contain Data Objects and Data Associations. The Activities within the Ad-Hoc Sub- Process are not REQUIRED to have incoming and outgoing Sequence Flows. However, it is possible to specify Sequence Flows between some of the contained Activities. When used, Sequence Flows will provide the same ordering constraints as in a regular Process. To have any meaning, Intermediate Events will have outgoing Sequence Flows and they can be triggered multiple times while the Ad-Hoc Sub-Process is active.[16]

Attributes

AdHocCompletionCondition
When this condition evaluates to true, the execution finishes.
AdHocOrdering
Enables you to choose paralel or sequential execution of elements inside of the sub-process.
Variable Definitions
Enables you to define process variables available only for elements of the sub-process.

27.4.3. Multi-instance Sub-Process

A Multiple Instances Sub-Process is instantiated multiple times when its execution is triggered. The instances are created in a sequential manner, that means a new sub-process instance is created only after the previous instance has finished.

A Multiple Instances Sub-Process has one incoming connection and one outgoing connection.

Attributes

MI collection input
A collection to be iterated through. It is used to create individual instances of given activity. The sub-process will be run with each element of this collection.
MI collection output
A collection of the sub-process execution results.
MI completion condition
An MVEL expression evaluated at the end of every instance. When evaluated as true, the sub-process is evaluated as finished and the sub-process’s outgoing flow is taken. Possible remaining sub-process instances are cancelled.
MI data input
A variable name for each element from the collection that will be used in the process.
MI data output
An optional variable name for the collection of the results.

27.4.4. Event Sub-Process

An event sub-process becomes active when its start event gets triggered. It can interrupt the parent process context or run in parallel to it.

With no outgoing or incoming connections, only an event or a timer can trigger the sub-process. The sub-process is not part of the regular control flow. Although self-contained, it is executed in the context of the bounding sub-process.

Use an event sub-process within a process flow to handle events that happen outside of the main process flow. For example, while booking a flight, two events may occur:

  • Cancel booking (interrupting).
  • Check booking status (non-interrupting).

Both these events can be modeled using the event sub-process.

27.5. User Task

"A User Task is a typical 'workflow' Task where a human performer performs the Task with the assistance of a software application and is scheduled through a task list manager of some sort." [17]

The User Task cannot be performed automatically by the system and therefore requires an intervention of a human user, the actor. The User Task is atomic.

On execution, the User Task element is instantiated as a task that appears in the list of tasks of one or multiple actors.

If a User Task element defines the Groups attribute, it is displayed in task lists of all users that are members of the group. Any of the users can claim the task. Once claimed, the task disappears from the task list of the other users.

Note that User Task is implemented as a domain-specific task and serves as a base for your custom tasks. For further information, see Section 4.14.1, “Work Item Definition”.

Attributes

Actors
A comma-separated list of users who can perform the generated task.
Content
The data associated with this task. This attribute does not affect TaskService behavior.
CreatedBy
The name of the user or ID of the process that created the task.
Groups
A comma-separated list of groups who can perform the generated task.
Locale
The locale for which the element is defined. This property is not used by the Red Hat JBoss BPM Suite engine at the moment.
Notifications
A definition of notification applied to the User Task. For further information, see Section 27.5.3, “Notification”.
Priority
An integer value defining the User Task priority. The value influences the User Task ordering in the user Task list and the simulation outcome.
Reassignment
The definition of escalation applied to the User Task. For further information, see Section 27.5.2, “Reassignment”.
ScriptLanguage
The language of the script. Choose between Java, MVEL, or Javascript.
Skippable
A Boolean value that defines if the User Task can be skipped. If true, the actor of the User Task can decide not to complete it and the User Task is never executed.
Task Name
Name of the User Task generated during runtime. It is displayed in the task list in Business Central.

Note that any other displayed attributes are used by features not restricted to the User Task element and are described in the chapters dealing with the particular mechanism.

27.5.1. User Task lifecycle

When a User Task element is triggered during process execution, a User Task instance is created. The User Task instance execution is preformed by the User Task service of the Task Execution Engine. For further information about the Task Execution Engine, see the Red Hat JBoss BPM Suite Administration and Configuration Guide. The Process instance continues the execution only when the associated User Task has been completed or aborted.

See the User Task lifecycle:

  • When the process instance enters the User Task element, the User Task is the Created stage.
  • This is usually a transient state and the User Task enters the Ready state immediately. The task appears in the task list of all the actors that are allowed to execute the task.
  • When one of the actors claims the User Task, the User Task becomes Reserved. If a User Task has only one potential actor, it is automatically assigned to that actor upon creation.
  • When the user who has claimed the User Task starts the execution, the User Task status changes to InProgress.
  • On completion, the status changes to Completed or Failed depending on the execution outcome.

Note that the User Task lifecycle can include other statuses if the User Task is reassigned (delegated or escalated), revoked, suspended, stopped, or skipped. For further details, on the User Task lifecycle see the Web Services Human Task specification.

27.5.2. Reassignment

The reassignment mechanism implements the escalation and delegation capabilities for User Tasks, that is, automatic reassignment of a User Task to another actor or group after a User Task has remained inactive for a certain amount of time.

A reassignment can start if a User Task is in one of the following states for a defined amount of time:

  • When not started: READY or RESERVED.
  • When not completed: IN_PROGRESS.

When the conditions defined in the reassignment are met, the User Task is reassigned to the users or groups defined in the reassignment. If the actual owner is included in the new users or groups definition, the User Task is set to the READY state.

Reassignment is defined in the Reassignment property of User Task elements. The property can take an arbitrary number of reassignment definitions with the following parameters:

  • Users: A comma-separated list of user IDs that are reassigned to the task on escalation. It can be a String or an expression, such as #{user-id}.
  • Groups: A comma separated list of group IDs that are reassigned to the task on escalation. It can be a String or an expression, such as #{user-id}.
  • Expires At: A time definition when escalation is triggered. It can be a String or an expression, such as #{expiresAt}. For further information about time format, see Chapter 24, Timing.
  • Type: A state in which the task needs to be at the given Expires At time so that the escalation is triggered.

27.5.3. Notification

The notification mechanism provides the capability to send an e-mail notification if a User Task is in one of the following states for the specified time:

  • When not started: READY or RESERVED.
  • When not completed: IN_PROGRESS.

A notification is defined in the Notification property of User Task elements. The property accepts an arbitrary number of notification definitions with the following parameters:

  • Type: The state in which the User Task needs to be at the given Expires At time so that the notification is triggered.
  • Expires At: A time definition when notification is triggered. It can be a String value or expression, such as #{expiresAt}. For information about time format, see Chapter 24, Timing.
  • From: The user or group ID of users used in the From field of the email notification message. It can be a String or expression.
  • To Users: A comma-separated list of user IDs to which the notification is sent. It can be a String or expression, such as #{user-id}.
  • To Groups: A comma separated list of group IDs to which the notification is be sent. It can be a String or expression, such as #{group-id}.
  • Reply To: A user or group ID that receives any replies to the notification. It can be a String or expression, such as #{group-id}.
  • Subject: The subject of the email notification. It can be a String or an expression.
  • Body: The body of the email notification. It can be a String or an expression.
Available variables

A notification can reference process variables by using the #{processVariable} syntax. Similarly, task variables use the ${taskVariable} syntax.

In addition to custom task variables, the notification mechanism can use the following local task variables:

  • taskId: The internal ID of the User Task instance.
  • processInstanceId: The internal ID of task’s parent process instance.
  • workItemId: The internal ID of a work item that created the User Task.
  • processSessionId: The knowledge session ID of the parent process instance.
  • owners: A list of users and groups that are potential owners of the User Task.
  • doc: A map that contains task variables.

Example 27.2. Body of notification with variables

<html>
	<body>
		<b>${owners[0].id} you have been assigned to a task (task-id ${taskId})</b><br>
		You can access it in your task
		<a href="http://localhost:8080/jbpm-console/app.html#errai_ToolSet_Tasks;Group_Tasks.3">inbox</a><br/>
		Important technical information that can be of use when working on it<br/>
		- process instance id - ${processInstanceId}<br/>
		- work item id - ${workItemId}<br/>

		<hr/>

		Here are some task variables available
		<ul>
			<li>ActorId = ${doc['ActorId']}</li>
			<li>GroupId = ${doc['GroupId']}</li>
			<li>Comment = ${doc['Comment']}</li>
		</ul>
		<hr/>
		Here are all potential owners for this task
		<ul>
		$foreach{orgEntity : owners}
			<li>Potential owner = ${orgEntity.id}</li>
		$end{}
		</ul>

		<i>Regards from jBPM team</i>
	</body>
</html>


[7] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[8] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[9] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[10] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[11] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[12] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[13] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[14] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[15] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[16] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0
[17] Business Process Model and Notation (BPMN). Version 2.0, OMG Document Number: formal/2011-01-03 http://www.omg.org/spec/BPMN/2.0