You are on page 1of 170

Activiti 5.

........................................................................................................................................................................... 1
1.1 ............................................................................................................................................................................ 1
1.2 ............................................................................................................................................................................ 1
1.3 ............................................................................................................................................................................ 1
1.4 ................................................................................................................................................................ 1
1.4.1 JDK 5+ ............................................................................................................................................................... 1
1.4.2 Ant 1.8.1+ ......................................................................................................................................................... 1
1.4.3 Eclipse 3.6.2 ...................................................................................................................................................... 1
1.5 .................................................................................................................................................................... 1
1.6 ............................................................................................................................................................ 1
1.7 ................................................................................................................................................................ 2
........................................................................................................................................................................... 3
2.1 .................................................................................................................................................................... 3
2.2 .................................................................................................................................................................... 3
2.3 workspace ............................................................................................................................... 4
2.4 .................................................................................................................................................................... 4
2.5 Eclipse ................................................................................................................................................................. 5
2.6 ................................................................................................................................................................ 7
2.7 ................................................................................................................................................ 7
........................................................................................................................................................................... 8
3.1 ProcessEngine .................................................................................................................................................... 8
3.2 ProcessEngineConfiguration bean ............................................................................................................................... 9
3.3 ................................................................................................................................................................ 9
3.4 .................................................................................................................................................. 10
3.5 .................................................................................................................................................. 11
3.6 .............................................................................................................................................................. 11
3.7 beans.................................................................................................................... 11
3.8 .......................................................................................................................................................... 11
3.9 .......................................................................................................................................................... 11
3.10 ............................................................................................................................................................ 12
Spring .......................................................................................................................................................... 13
4.1 ProcessEngineFactoryBean ........................................................................................................................................ 13
4.2 .......................................................................................................................................................................... 13
4.3 ...................................................................................................................................................................... 16
4.4 .......................................................................................................................................................... 17
4.5 .................................................................................................................................................................. 17
API............................................................................................................................................................................ 19
5.1 API.................................................................................................................................................................... 19
5.2 .................................................................................................................................................................. 19
5.3 .................................................................................................................................................................. 20
5.4 .......................................................................................................................................................... 21
5.5 web ............................................................................................................................... 23
5.6 PVMAPI ......................................................................................................................................... 24
5.7 ...................................................................................................................................................................... 25
i

......................................................................................................................................................................... 26
6.1 .......................................................................................................................................................... 26
6.1.1 ................................................................................................................................................... 26
6.1.2 ant ................................................................................................................................................ 26
6.1.3 Activiti Explorer ........................................................................................................................... 27
6.2 .................................................................................................................................................................. 27
6.2.1 Java ............................................................................................................................................................ 27
6.2.2 Spring beans ......................................................................................................................... 28
6.2.3 ............................................................................................................................................... 28
6.3 ...................................................................................................................................................... 28
6.4 .............................................................................................................................................................. 29
6.5 .............................................................................................................................................................. 29
BPMN ....................................................................................................................................................................... 31
7.1 BPMN ............................................................................................................................................................ 31
7.2 .......................................................................................................................................................................... 31
7.3 .................................................................................................................................................................. 31
7.4 10 ................................................................................................................................................. 32
7.4.1 ....................................................................................................................................................... 32
7.4.2 ............................................................................................................................................................... 32
7.4.3 ............................................................................................................................................................... 33
7.4.4 ........................................................................................................................................................... 33
7.4.5 XML .................................................................................................................................................... 33
7.4.6 ............................................................................................................................................... 34
7.4.7 ....................................................................................................................................................... 36
7.4.8 ....................................................................................................................................................... 37
7.4.9 ....................................................................................................................................................... 38
7.4.10 ..................................................................................................................................................... 39
7.4.11 ..................................................................................................................................................... 39
7.4.12 ..................................................................................................................................................... 41
7.5 BPMN 2.0 ......................................................................................................................................................... 41
7.5.1 ................................................................................................................................................... 41
7.5.2 ............................................................................................................................................................... 42
......................................................................................................................................... 42
7.5.3 ....................................................................................................................................................... 43
7.5.4 ................................................................................................................................................... 44
................................................................................................................................................................. 44
..................................................................................................................................................... 44
XML ......................................................................................................................................................... 44
7.5.5 ........................................................................................................................................... 44
................................................................................................................................................................. 44
..................................................................................................................................................... 44
XML ......................................................................................................................................................... 45
7.5.6 ....................................................................................................................................................... 45
7.5.7 ................................................................................................................................................... 45
................................................................................................................................................................. 45
..................................................................................................................................................... 45
ii

XML ......................................................................................................................................................... 46
7.5.8 ............................................................................................................................................... 46
................................................................................................................................................................. 46
..................................................................................................................................................... 46
XML ......................................................................................................................................................... 46
7.5.9 ........................................................................................................................................................... 47
................................................................................................................................................................. 47
..................................................................................................................................................... 47
XML ......................................................................................................................................................... 47
7.5.10 ................................................................................................................................................. 47
................................................................................................................................................................. 47
..................................................................................................................................................... 48
XML ......................................................................................................................................................... 48
7.5.11 ................................................................................................................................................. 49
................................................................................................................................................................. 49
..................................................................................................................................................... 49
XML ......................................................................................................................................................... 49
7.5.12 ............................................................................................................................................................. 50
7.5.13 ..................................................................................................................................................... 50
................................................................................................................................................................. 50
..................................................................................................................................................... 51
XML ......................................................................................................................................................... 51
7.5.14 ..................................................................................................................................................... 52
................................................................................................................................................................. 52
..................................................................................................................................................... 52
XML ......................................................................................................................................................... 52
7.5.15 ..................................................................................................................................................... 54
................................................................................................................................................................. 54
..................................................................................................................................................... 55
XML ......................................................................................................................................................... 55
7.5.16 ..................................................................................................................................................... 56
................................................................................................................................................................. 56
..................................................................................................................................................... 57
XML ......................................................................................................................................................... 57
......................................................................................................................................................... 57
..................................................................................................................................................... 57
Activiti ......................................................................................................................... 58
7.5.17 ..................................................................................................................................................... 60
................................................................................................................................................................. 60
..................................................................................................................................................... 60
XML ......................................................................................................................................................... 60
................................................................................................................................................. 61
..................................................................................................................................................... 61
7.5.18 Java .............................................................................................................................................. 61
................................................................................................................................................................. 61
..................................................................................................................................................... 62
iii

XML ......................................................................................................................................................... 62
................................................................................................................................................................. 63
..................................................................................................................................................... 63
............................................................................................................................................. 65
......................................................................................................................................................... 65
7.5.19 WebService .......................................................................................................................................... 66
................................................................................................................................................................. 66
..................................................................................................................................................... 66
XML ......................................................................................................................................................... 66
WebService IO ........................................................................................................................... 67
............................................................................................................................. 68
............................................................................................................................. 68
7.5.20 ............................................................................................................................................. 69
................................................................................................................................................................. 69
..................................................................................................................................................... 69
XML ......................................................................................................................................................... 69
7.5.21 ..................................................................................................................................................... 70
Mail ......................................................................................................................................... 70
................................................................................................................................................. 70
......................................................................................................................................................... 71
7.5.22 Mule ..................................................................................................................................................... 72
Mule ............................................................................................................................................... 72
......................................................................................................................................................... 72
7.5.23 ..................................................................................................................................................... 73
................................................................................................................................................................. 73
..................................................................................................................................................... 73
XML ......................................................................................................................................................... 73
7.5.24 Java .............................................................................................................................................. 73
................................................................................................................................................................. 73
..................................................................................................................................................... 74
XML ......................................................................................................................................................... 74
7.5.25 ................................................................................................................................................. 74
............................................................................................................................. 76
7.5.26 ................................................................................................................................................. 77
7.5.27 for each .................................................................................................................................... 78
................................................................................................................................................................. 78
..................................................................................................................................................... 79
XML ......................................................................................................................................................... 79
......................................................................................................................................... 80
7.5.28 ..................................................................................................................................................... 81
7.5.29 ......................................................................................................................................... 81
................................................................................................................................................................. 81
..................................................................................................................................................... 81
XML ......................................................................................................................................................... 81
............................................................................................................................. 82
7.5.30 ............................................................................................................................................. 83
iv

................................................................................................................................................................. 83
..................................................................................................................................................... 84
XML ......................................................................................................................................................... 84
................................................................................................................................................................. 84
7.5.31 ............................................................................................................................................. 85
7.5.32 ................................................................................................................................. 85
................................................................................................................................................................. 85
..................................................................................................................................................... 85
XML ......................................................................................................................................................... 86
7.5.33 ......................................................................................................................................................... 86
................................................................................................................................................................. 86
..................................................................................................................................................... 86
XML ......................................................................................................................................................... 87
7.5.34 ................................................................................................................................. 88
................................................................................................................................................................. 88
..................................................................................................................................................... 88
XML ......................................................................................................................................................... 88
......................................................................................................................................................... 88
................................................................................................................................................................. 89
7.6 .............................................................................................................................................................. 90
......................................................................................................................................................................... 92
8.1 .................................................................................................................................................................. 92
8.2 ...................................................................................................................................................... 95
JPA............................................................................................................................................................................ 96
9.1 .......................................................................................................................................................................... 96
9.2 .......................................................................................................................................................................... 96
9.3 .......................................................................................................................................................................... 97
9.3.1 ....................................................................................................................................................... 97
9.3.2 JPA ........................................................................................................................................ 99
9.3.3 Spring beans JPA ......................................................................................................... 99
....................................................................................................................................................................... 102
10.1 .............................................................................................................................................................. 102
10.1.1 HistoricProcessInstanceQuery .................................................................................................................... 102
10.1.2 HistoricActivityInstanceQuery .................................................................................................................... 102
10.1.3 HistoricDetailQuery .................................................................................................................................... 103
10.1.4 HistoricTaskInstanceQuery ......................................................................................................................... 104
10.2 .......................................................................................................................................................... 104
10.3 .................................................................................................................................................. 105
Eclipse Designer ................................................................................................................................................. 106
11.1 ...................................................................................................................................................................... 106
11.2 Activiti Designer ............................................................................................................................ 107
11.3 Activiti Designer BPMN ............................................................................................................................ 109
11.4 Activiti Designer ................................................................................................................................ 113
11.5 Activiti Designer........................................................................................................................................... 114
11.5.1 ................................................................................................................................................... 114
11.5.1.1 Eclipse/Maven .................................................................................................... 115
v

11.5.1.2 Activiti Designer ..................................................................................................... 117


11.5.1.3 ............................................................................................................................ 119
11.5.1.4 .................................................................................................................................... 122
11.5.1.5 .................................................................................................................... 125
11.5.2 ................................................................................................... 127
11.5.2.1 ProcessValidator ........................................................................................................... 128
11.5.2.2 ExportMarshaller .......................................................................................................... 129
Activiti Explorer ................................................................................................................................................. 131
12.1 .............................................................................................................................................................. 131
12.2 ...................................................................................................................................................................... 132
12.3 ...................................................................................................................................................... 132
12.4 .............................................................................................................................................................. 132
12.5 ...................................................................................................................................................................... 133
12.6 .......................................................................................................................................................... 135
Activiti ........................................................................................................................................... 136
13.1 Cycle....................................................................................................................................................................... 136
13.2 Signavio Activiti Modeler ........................................................................................................ 136
REST API ............................................................................................................................................................. 137
14.1 ...................................................................................................................................................................... 137
14.1.1 ................................................................................................................................................... 137
14.1.2 ................................................................................................................................................... 138
14.1.3 ........................................................................................................................................... 138
14.1.4 ................................................................................................................................................... 138
14.1.5 ........................................................................................................................................... 139
14.2 ...................................................................................................................................................................... 139
14.2.1 ........................................................................................................................................... 139
14.3 ...................................................................................................................................................................... 140
14.3.1 ........................................................................................................................................... 140
14.3.2 ........................................................................................................................................... 140
14.3.3 ................................................................................................................................... 141
14.3.4 ........................................................................................................................................... 141
14.3.5 ........................................................................................................................................... 142
14.3.6 ....................................................................................................................................... 143
14.4 ...................................................................................................................................................................... 143
14.4.1 ........................................................................................................................................... 143
14.4.2 ................................................................................................................................................... 143
14.4.3 ................................................................................................................................................... 144
14.4.4 ........................................................................................................................................... 145
14.4.5 ........................................................................................................................................... 145
14.4.6 ........................................................................................................................................... 145
14.5 ...................................................................................................................................................................... 146
14.5.1 ........................................................................................................................................................... 146
14.5.2 ................................................................................................................................................... 146
14.5.3 ........................................................................................................................................... 146
14.5.4 ....................................................................................................................................................... 147
14.5.5 ....................................................................................................................................... 147
vi

14.6 ...................................................................................................................................................................... 148


14.6.1 ................................................................................................................................................... 148
14.6.2 ................................................................................................................................................... 149
14.6.3 ................................................................................................................................................... 149
14.6.4 ........................................................................................................................................... 149
14.6.5 ........................................................................................................................................... 150
14.6.6 ....................................................................................................................................... 150
14.6.7 ............................................................................................................................................... 150
Cdi ............................................................................................................................................................. 152
15.1 activiti-cdi .................................................................................................................................................... 152
15.1.1 ........................................................................................................................................... 152
15.1.2 ........................................................................................................................................... 153
15.1.3 ................................................................................................................................................... 154
15.2 Cdi ............................................................................................................... 154
15.2.1 ........................................................................................................................... 154
15.2.2 ................................................................................................................................... 155
15.2.3 Bean .................................................................................................................................. 155
15.2.4 @BusinessProcessScoped bean............................................................................................ 156
15.2.5 ........................................................................................................................................... 156
15.2.6 ........................................................................................................................................... 156
15.2.7 ................................................................................................................................................... 157
15.3 .............................................................................................................................................................. 157
15.4 ...................................................................................................................................................... 158
....................................................................................................................................................................................... 159
ant .......................................................................................................................................... 159
......................................................................................................................................... 160
............................................................................................................................................................................... 161
............................................................................................................................................................................... 162

vii

1.1
Activiti Apache V2
1.2

http://activiti.org/download.html
1.3
jar wiki
1.4

1.4.1 JDK 5+
Activiti 5 JDK Oracle Java SE JDK

java version JDK


1.4.2 Ant 1.8.1+
Ant Ant bin path ant version
Ant Ant
1.4.3 Eclipse 3.6.2
Eclipse Eclipse Classic eclipse eclipse eclipse
eclipse Activiti eclipse designer
1.5

JIRA
1.6
[EXPERIMENTAL]
1

.impl.

1.7
jar .impl.org.activiti.engine.impl.pvm.delegate

2.1
Activiti Activiti zip

Java
Ant

Activiti zip

setup

ant.demo.start enter

Activiti web kermit/kermit

Activiti BPMN 2.0


2.2
setup ant Activiti
Java Ant JAVA_HOME ANT_HOME
ant Ant 1.7.1+
Activiti setup
ant demo.start
ant

* web ${actviti.home}/setup/files/dependencies/libs web


${actviti.home}/setup/files/webapps web ${actviti.home}/setup/files/webapps
web

*${activiti.home}/apps/h2 H2

H2

* H2 Activiti

* Activiti identity

* Activiti

*${downloads.dir} Tomcat Tomcat

*${activiti.home}/apps/apache-tomcat-${tomcat.version} Tomcat

* Activiti jar

* REST tomcat

* Activiti web tomcat

tomcat

* demo.start
H2 Tomcat ant demo.stop
3

ant p

2.1
Id

kermit

kermit

gonzo

gonzo

fozzid

fozzid

web
2.2 web
Web
Activiti Explorer

URL

http://localhost:8080/activit

i-explorer

Activiti

Activiti Activiti Activiti


Activiti jar Java swing TomcatJBossWebSphere
BPM Activiti Java Activiti
2.3 workspace
workspace java

activiti-engine-examples Activiti BPMN


API
Eclipse ant maven pom ant maven pom
ant maven

activiti-spring-examples Spring Activiti

activiti-groovy-examples groovy groovy

activiti-jpa-examples Activiti JPA

activiti-cxf-examples Activiti web

Eclipse eclipse
deno.start libs
demo.start libs setup
ant inflate.examples
activiti-engine-examples activiti-spring-examples libs-runtime libs-test
jars jars
2.4
setup/files/dependencies/libs/
4

setup.build.xml ant libs inflate.example


web
libs
setup/files/dependencies

libs.engine.runtime.txt Activiti
libs.engine.runtime.test.txt libs.engine.runtime.txt
libs.engine.runtime.feature.groovy.txt libs.engine.runtime.txt groovy
libs.engine.runtime.txt libs.engine.runtime.txt JPA
libs.spring.runtime.txt Spring Activiti
libs.engine.runtime.txt

libs.spring.runtime.test.txt libs.engine.runtime.txt Spring

2.5 Eclipse
eclipse
File Import

General Existing Projects into Workspace Next

Browse...${activiti.home}/workspace
Import Finish
ant Window Show View Ant
activiti-engine-examples/build.xml ant

BPMN 2.0 XML BPMN 2.0 XML XML catalog Window


-->Preferences --> XML --> XML Catalog --> Add file system ${activiti.home}/docs/xsd/BPMN20.xsd
${activiti.home}/docs/xsd/activiti-bpmn-extensions-5.4.xsd

11 . Eclipse Designer Activiti Designer Eclipse

2.6
setup Ant
ant h2.console.start
H2 web Ant CTRL + C' JDBC URL
URL Connect
jdbc:h2:tcp://localhost/activiti

Activiti

2.7
Activiti ACT_ API

ACT_RE_*RE repository

ACT_RU_*RU runtime
Activiti

ACT_ID_*ID identity

ACT_HI_*HI history

ACT_GE_*
7

3.1 ProcessEngine
Activiti acitiviti.cfg.xml Spring
ProcessEngine org.activiti.engine.ProcessEngines
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
activiti.cfg.xml

<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<propertyname="jdbcUrl"value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000"/>
<propertyname="jdbcDriver"value="org.h2.Driver"/>
<propertyname="jdbcUsername"value="sa"/>
<propertyname="jdbcPassword"value=""/>
<propertyname="databaseSchemaUpdate"value="true"/>
<propertyname="jobExecutorActivate"value="false"/>
<propertyname="mailServerHost"value="mail.my-corp.com"/>
<propertyname="mailServerPort"value="5025"/>
</bean>
</beans>
xml Spring
Activiti Spring Spring

PrcessEngineConfiguration bean id 3

ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);

ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
ProcessEngineConfiguration.createXXX() ProcessEngineConfiguration
buildProcessEngine() ProcessEngine
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.setJobExecutorActivate(true)
.buildProcessEngine();
3.2 ProcessEngineConfiguration bean
activiti.cfg.xml id processEngineConfiguration bean
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
bean ProcessEngine processEngineConfiguration

org.activiti.engine.impl.cfg.StandaloneProcessEngineConfigurationAcitviti
Activiti

org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfigurationAcitviti
H2
job executor

org.activiti.spring.SpringProcessEngineConfigurationSpring Spring

org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration
[] JTA

3.3
Activiti jdbc

jdbcUrl jdbc url

jdbcDriver

jdbcUsername

jdbcPassword

jdbc datasource MyBatis


MyBatis
9

jdbcMaxActiveConnections 10

jdbcMaxIdleConnections

jdbcMaxCheckoutTime 2000020

jdbcMaxWaitTime

2000020

<propertyname="jdbcUrl"value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000"/>
<propertyname="jdbcDriver"value="org.h2.Driver"/>
<propertyname="jdbcUsername"value="sa"/>
<propertyname="jdbcPassword"value=""/>
javax.sql.DataSource Apache Commons DBCP

<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>
<propertyname="url"value="jdbc:mysql://localhost:3306/activiti"/>
<propertyname="username"value="activiti"/>
<propertyname="password"value="activiti"/>
<propertyname="defaultAutoCommit"value="false"/>
</bean>
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<propertyname="dataSource"ref="dataSource"/>
...
Activiti datasource DBCP
jdbc datasource

databaseType
{h2, mysql, oracle, postgrs, mssql, db2} H2
create/drop

DMLDCL

databaseSchemaUpdate

false

true

create-drop

3.4
JobExecutor

API jobsManagementService.createJobQueryManagementService.executeJob

JobExecutor JobExecutor
10

<propertyname="jobExecutorActivate"value="false"/>
3.5
Activiti SMTP

3.6
history
<propertyname="history"value="audit"/>
3.7 beans
activiti.cfg.xml Spring beans
beans beans ProcessEngineConfiguration beans
map map beans beans
map
3.8
Activti

3.1
Activiti

jdbc url

1.2.132

jdbc:h2:tcp://localhost/activiti

h2

mysql

5.1.11

jdbc:mysql://localhost:3306/activiti?autoReconnect=true

mysql-connetor-java

oracle

10.2.0

jdbc:oracle:thin:@localhost:1521:xe

postpres

8.4

jdbc:postgresql://localhost:5432/activiti

DB2 9.7

db2

db2jcc4

mssql

2008 JDBC
jtds-1.2.4

jdbc:db2://localhost:50000/activiti

[]

jdbc:jtds:sqlserver://localhost:1433/activiti

[]

3.9

Activiti jars classpath


11

Activiti activiti.cfg.xml classpath

DbSchemaCreate main

DDL DDL SQL Activiti jar


activiti-engine-x.jar org/activiti/db/create drop dorp sql
activiti.{db}.{create|drop}.{type}.sql
db type

engine

identity identity

history none

3.10
[]

Activiti web Activiti


Activiti
activiti.cfg.xml
<beans... >
<beanid="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- ... -->
<propertyname="databaseSchemaUpdate"value="true"/>
<!-- ... -->
</bean>
</beans>
classpath Activiti
ActivitidatabaseSchemaUpdate true Activiti

12

Spring

Spring Activiti
4.1 ProcessEngineFactoryBean
Spring bean ProcessEngine org.activiti.spring.ProcessEngineFactoryBean
bean Spring

<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
...
</bean>
<beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
<propertyname="processEngineConfiguration"ref="processEngineConfiguration"/>
</bean>
processEngineConfiguration bean org.activiti.spring.SpringProcessEngineConfiguration
4.2
Srping SpringTransactionIntegrationTest Spring
SpringTransactionIntegrationTest-context.xml
dataSourcetransactionManagerprocessEngine
Activiti
DataSource SpringProcessEngineConfiguration dataSource Activiti
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy DataSource
DataSource SQL Spring
Spring dataSource
SpringProcessEngineConfiguration TransactionAwareDataSourceProxy
Spring TransactionAwareDataSourceProxy Spring
DataSourceTransactionManager JPATransactionManager dataSource
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
13

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<beanid="dataSource"class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<propertyname="driverClass"value="org.h2.Driver"/>
<propertyname="url"value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000"/>
<propertyname="username"value="sa"/>
<propertyname="password"value=""/>
</bean>
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource"ref="dataSource"/>
</bean>
<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="transactionManager"ref="transactionManager"/>
<propertyname="databaseSchemaUpdate"value="true"/>
<propertyname="jobExecutorActivate"value="false"/>
</bean>
<beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
<propertyname="processEngineConfiguration"ref="processEngineConfiguration"/>
</bean>
<beanid="repositoryService"factory-bean="processEngine"factory-method="getRepositoryService"/>
<beanid="runtimeService"factory-bean="processEngine"factory-method="getRuntimeService"/>
<beanid="taskService"factory-bean="processEngine"factory-method="getTaskService"/>
<beanid="historyService"factory-bean="processEngine"factory-method="getHistoryService"/>
<beanid="managementService"factory-bean="processEngine"factory-method="getManagementService"/>
...
Spring beans
<beans>
...
<tx:annotation-driventransaction-manager="transactionManager"/>
<beanid="userBean"class="org.activiti.spring.test.UserBean">
<propertyname="runtimeService"ref="runtimeService"/>
</bean>
<beanid="printer"class="org.activiti.spring.test.Printer"/>
</beans>
Spring Spring XML
14

Spring
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("org/activiti/examples/spring/SpringTransactionIntegrationTest-context.xml");

@ContextConfiguration("classpath:org/activiti/spring/test/transaction/SpringTransactionIntegrationTest-context.xml")
Activiti beansProcessEngineFactoryBean
Activiti Propagation.REQUIRED repositoryService

RepositoryService repositoryService = (RepositoryService) applicationContext.getBean("repositoryService");


String deploymentId = repositoryService
.createDeployment()
.addClasspathResource("org/activiti/spring/test/hello.bpmn20.xml")
.deploy()
.getId();
Spring userBean.hello() Activiti

UserBean userBean = (UserBean) applicationContext.getBean("userBean");


userBean.hello();
UserBean Spring bean userBean repositoryService
publicclass UserBean {
/** Spring */
private RuntimeService runtimeService;
@Transactional
publicvoid hello() {
//
// Activiti RuntimeServicestartProcessInstanceByKey
//
runtimeService.startProcessInstanceByKey("helloProcess");
}
publicvoid setRuntimeService(RuntimeService runtimeService) {
this.runtimeService = runtimeService;
}
}

15

4.3
ProcessEngineFactoryBean BPMN Spring beans
map beans beans beanprinter

printer beans SpringProcessEngineConfiguration beans


beans Spring beans
<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
...
<propertyname="beans">
<map>
<entrykey="printer"value-ref="printer"/>
</map>
</property>
</bean>
<beanid="printer"class="org.activiti.examples.spring.Printer"/>
beans SpringTransactionIntegrationTest hello.bpmn20.xml
UEL Spring bean
<definitionsid="definitions"...>
<processid="helloProcess">
<startEventid="start"/>
<sequenceFlowid="flow1"sourceRef="start"targetRef="print"/>
<serviceTaskid="print"activiti:expression="#{printer.printMessage()}"/>
<sequenceFlowid="flow2"sourceRef="print"targetRef="end"/>
<endEventid="end"/>
</process>
</definitions>
Printer
publicclass Printer {
publicvoid printMessage() {
System.out.println("hello world");
}
}
Spring bean
16

<beans...>
...
<beanid="printer"class="org.activiti.examples.spring.Printer"/>
</beans>
4.4
Spring
Activiti
Spring

<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
...
<propertyname="deploymentResources"value="classpath*:/org/activiti/spring/test/autodeployment/autodeploy.*.bpmn20.xml
"/>
</bean>
<beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
<propertyname="processEngineConfiguration"ref="processEngineConfiguration"/>
</bean>

4.5
Spring Activiti Spring

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:org/activiti/spring/test/junit4/springTypicalUsageTest-context.xml")
publicclass MyBusinessProcessTest {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
@Rule
public ActivitiRule activitiSpringRule;
17

@Test
@Deployment
publicvoid simpleProcessTest() {
runtimeService.startProcessInstanceByKey("simpleProcess");
Task task = taskService.createTaskQuery().singleResult();
assertEquals("My Task", task.getName());
taskService.complete(task.getId());
assertEquals(0, runtimeService.createProcessInstanceQuery().count());
}
}
Spring org.activiti.engine.test.ActivitiRulebean
<beanid="activitiRule"class="org.activiti.engine.test.ActivitiRule">
<propertyname="processEngine"ref="processEngine"/>
</bean>

18

API

5.1 API
API Activiti ProcessEngine
ProcessEngine/BPM ProcessEngine

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();


RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
API javadocs
ProcessEngines.getDefaultProcessEngine()
ProcessEngines.init()ProcessEngines.destroy()
ProcessEngines activiti.cfg.xml activiti-context.xml activiti.cfg.xml Activiti

ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream).buildProcessEngine()
activiti-context.xml Spring spring

5.2
Activiti org.activiti.engine.ActivitiException API javadocs
TaskService
19

/**
*.
* @param taskIdid
* @throws ActivitiException idActivitiException
*/
void complete(String taskId);
id task javadoc
taskId null null ActivitiException

ActivitiWrongDbException Activiti

ActivitiOptimisticLockingException
ActivitiClassLoadingExceptionJavaDelegates,

TaskListeners,

5.3

Activiti Java
Activiti Junit 3 Junit 4 Juint 3 org.activiti.engine.test.ActivitiTestCase
protected ActivitiTestCase

setup() activiti.cfg.xml
getConfigurationResource()

ActivitiTestCase org.activiti.engine.test.Deployment
testClassName.testMethod.bpmn20.xml
Deployment javadocs
Juint 3
publicclass MyBusinessProcessTest extends ActivitiTestCase {
@Deployment
publicvoid testSimpleProcess() {
runtimeService.startProcessInstanceByKey("simpleProcess");
Task task = taskService.createTaskQuery().singleResult();
assertEquals("My Task", task.getName());
taskService.complete(task.getId());
assertEquals(0, runtimeService.createProcessInstanceQuery().count());
}
}
20

Juint 4 org.activiti.engine.test.ActivitiRule
getters ActivitiRule getter
ActivitiTestCase
org.activiti.engine.test.Deploymen

Junit 4 ActivitiRule
publicclass MyBusinessProcessTest {
@Rule
public ActivitiRule activitiRule = new ActivitiRule();
@Test
@Deployment
publicvoid ruleUsageExample() {
RuntimeService runtimeService = activitiRule.getRuntimeService();
runtimeService.startProcessInstanceByKey("ruleUsage");
TaskService taskService = activitiRule.getTaskService();
Task task = taskService.createTaskQuery().singleResult();
assertEquals("My Task", task.getName());
taskService.complete(task.getId());
assertEquals(0, runtimeService.createProcessInstanceQuery().count());
}
}

5.4
H2 Activiti
Eclipse IDE
Eclipse

debug Run asJuint test

21

Activiti Display Window->Show View->Other Display


org.h2.tools.Server.createWebServer("").start()

Display

http://localhost:8082 jdbc url jdbc:h2:mem:activiti

22

Activiti

5.5 web
ProcessEngine web

Servlet ServletContextListener
publicclass ProcessEnginesServletContextListener implements ServletContextListener {
publicvoid contextInitialized(ServletContextEvent servletContextEvent) {
ProcessEngines.init();
}
publicvoid contextDestroyed(ServletContextEvent servletContextEvent) {
ProcessEngines.destroy();
}
}
contextInitialized ProcessEngines.init() activiti.cfg.xml
jars ProcessEngine
id

ProcessEngines.getDefaultProcessEngine();

23

ProcessEngines.getProcessEngine("myName");

context-listener contextDestroyed ProcessEngines.destroy()


5.6 PVMAPI
[] API
API Process Virtual Machine POJO API
Activiti POJO API

PvmProcessDefinition processDefinition = new ProcessDefinitionBuilder()


.createActivity("a")
.initial()
.behavior(new WaitState())
.transition("b")
.endActivity()
.createActivity("b")
.behavior(new WaitState())
.transition("c")
.endActivity()
.createActivity("c")
.behavior(new WaitState())
.endActivity()
.buildProcessDefinition();
PvmProcessInstance processInstance = processDefinition.createProcessInstance();
processInstance.start();
PvmExecution activityInstance = processInstance.findExecution("a");
assertNotNull(activityInstance);
activityInstance.signal(null, null);
activityInstance = processInstance.findExecution("b");
assertNotNull(activityInstance);
activityInstance.signal(null, null);
activityInstance = processInstance.findExecution("c");
assertNotNull(activityInstance);

24

5.7
Activiti UEL UEL Unified Expression Language
JEE6
EE6 UEL JUEL
Java
Activiti

Spring bean Spring

${myVar}
${myBean.myProperty}

${printer.print()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}

beanslists maps

execution DelegateExecution

task DelegateTask

authenticatedUserId id

Spring Java

25

6.1
Activiti
BPMN2.0
.bpmn20.xml BPMN

Java
Java Activiti
6.1.1

String barFileName = "path/to/process-one.bar";


ZipInputStream inputStream = new ZipInputStream(new FileInputStream(barFileName));
repositoryService.createDeployment()
.name("process-one.bar")
.addZipInputStream(inputStream)
.deploy();
javadocs
6.1.2 ant
ant deploy-bar jarActiviti jar
<taskdefname="deploy-bar"classname="org.activiti.engine.impl.ant.DeployBarTask">
<classpath>
<filesetdir="...">
<includename="activiti-cfg.jar"/>
<includename="your-db-driver.jar"/>
</fileset>
<filesetdir="${activiti.home}/lib">
<includename="activiti-engine-${activiti.version}.jar"/>
<includename="ibatis-sqlmap-*.jar"/>
</fileset>
</classpath>
</taskdef>
<deploy-barfile=".../yourprocess.bar"/>
26

6.1.3 Activiti Explorer


Activiti Explorer web web bar bpmn20.xml Management
Deployment

6.2
Activiti Activiti Spring bean
Spring
6.2.1 Java
, Java

ant

jar activiti-rest lib

activiti-engine jar
${activiti.home}/apps/apache-tomcat-6.0.29/webapps/activiti-rest/WEB-INF/lib/
27

6.2.2 Spring beans


Spring beans beans web
Spring Activiti rest
Activiti rest
${activiti.home}/apps/apache-tomcat-6.0.29/webapps/activiti-rest/lib/activiti-cfg.jar activiti.cfg.xml
Spring activiti-context.xml
6.2.3
Activiti rest web
Spring
6.3
BPMN BPMN SVN
Activiti Activiti

keyversionname id

XML id key

XML name name name


id name

key 1 key
1 key

id { processDefinitionKey } : { processDefinitionVersion } : { generated-id }


generated-id id

<definitionsid="myDefinitions">
<processid="myProcess"name="My important process">
...

6.1
id

key

name

version

myProcess : 1 : 676

myProcess

My important process

id

6.2
id

key

name

version

myProcess : 1 : 676

myProcess

My important process

myProcess : 2 : 870

myProcess

My important process

28

runtimeService.startProcessInstanceByKey("myProcess") 2

6.4
Activiti API Activiti Explorer

org/activiti/expenseProcess.bpmn20.xml key expense

BPMN 2.0 xml key


org/activiti/expenseProcess.expense.png(.jpg/ .gif) BMPN 2.0 xml
key

BPMN 2.0 xml


org/activiti/expenseProcess.png BPMN 2.0
BPMN 2.0 xml

repositoryService.createDeployment()
.name("expense-process.bar")
.addClasspathResource("org/activiti/expenseProcess.bpmn20.xml")
.addClasspathResource("org/activiti/expenseProcess.png")
.deploy();
API
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("expense")
.singleResult();
String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),
diagramResourceName);
6.5
Activiti
Activiti Modeler Activiti Eclipse Designer

29

30

BPMN

7.1 BPMN
BPMN 2.0 FAQ

7.2
BPMN 2.0 Activiti workspace/activiti-x-examples

7.3
BPMN 2.0 Eclipse
XML New->Other->XML-XML File

.bpmn20.xml

BPMN 2.0 definition

xmlns
31

targetNamespace targetNamespace
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="Examples">
<processid="myProcess"name="My First Process">
..
</process>
</definitions>
BPMN 2.0 xsd schemaLocation Eclipse XML catalog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd
process

id Activti ProcessDefinition key id RuntimeService


startProcessInstanceByKey

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");


startProcessInstanceById id Activiti
processDefinition.getId() id id key:version
64 ActivitiException id key

name ProcessDefinition name

7.4 10
Activiti Activiti API
7.4.1
Activiti Eclipse Activiti
7.4.2
Activiti BPMN2.0 Java SE
Activiti API Activiti
web

32

7.4.3
BPMCorpBPMCorp

Activiti
org.activiti.examples.bpmn.usertask
7.4.4
Activiti Modeler Activiti Designer
XML BPMN 2.0

none start
none end

7.4.5 XML
FinancialReportProcess.bpmn20.xml XML
BPMN 2.0

none start

accountancy
management

none end

sequence flows source target

<definitionsid="definitions"
targetNamespace="http://activiti.org/bpmn20"
xmlns:activiti="http://activiti.org/bpmn"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">
<processid="financialReport"name="Monthly financial report reminder process">
<startEventid="theStart"/>
<sequenceFlowid='flow1'sourceRef='theStart'targetRef='writeReportTask'/>
<userTaskid="writeReportTask"name="Write monthly financial report">
<documentation>
33

Write monthly financial report for publication to shareholders.


</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlowid='flow2'sourceRef='writeReportTask'targetRef='verifyReportTask'/>
<userTaskid="verifyReportTask"name="Verify monthly financial report">
<documentation>
Verify monthly financial report composed by the accountancy department.
This financial report is going to be sent to all the company shareholders.
</documentation>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>management</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
<sequenceFlowid='flow3'sourceRef='verifyReportTask'targetRef='theEnd'/>
<endEventid="theEnd"/>
</process>
</definitions>

7.4.6

Activiti

BPMN 2.0 Activiti API

API Activiti

34

Deployment deployment = repositoryService.createDeployment()


.addClasspathResource("FinancialReportProcess.bpmn20.xml")
.deploy();
id XML
Activiti
id key
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");
start start start

Activiti
Activiti

startProcessInstanceByKey

Java Eclipse Activiti jars


setup/files/dependencies/libs Activiti
ProcessEngine standalone ProcessEngine
demo setup
XML XML Activiti BPMN

publicstaticvoid main(String[] args) {


// Activiti
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration()
.buildProcessEngine();
// Activiti
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
//
repositoryService.createDeployment()
.addClasspathResource("FinancialReportProcess.bpmn20.xml")
.deploy();
//
runtimeService.startProcessInstanceByKey("financialReport");
}
35

7.4.7
taskService
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
accountancy
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>accountancy</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
API
TaskService taskService = processEngine.getTaskService();
List<Task> tasks =taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
ProcessEngine demo setup

Activiti Explorer fozzie/fozzie Processes Actions

kermit

accountancy

36

7.4.8

taskService.claim(task.getId(), "fozzie");

List<Task> tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();


Activiti Explorer UI claim

37

7.4.9

taskService.complete(task.getId());
Activiti

management
demo setup complete Fozzie Activiti
38

Explorer kermit
7.4.10

Activiti Explorer

historySerivce
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();
System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());

7.4.11
Activiti Explorer UI

39

publicclass TenMinuteTutorial {
publicstaticvoid main(String[] args) {
// Activiti
ProcessEngine processEngine = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration()
.buildProcessEngine();
// Activiti
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
//
repositoryService.createDeployment()
.addClasspathResource("FinancialReportProcess.bpmn20.xml")
.deploy();
//
String procId = runtimeService.startProcessInstanceByKey("financialReport").getId();
//
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();
for (Task task : tasks) {
System.out.println("Following task is available for accountancy group: " + task.getName());
//
taskService.claim(task.getId(), "fozzie");
}
// Fozzie
tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();
for (Task task : tasks) {
System.out.println("Task for fozzie: " + task.getName());
//
taskService.complete(task.getId());
}
System.out.println("Number of tasks for fozzie: "
+ taskService.createTaskQuery().taskAssignee("fozzie").count());
//
tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
40

for (Task task : tasks) {


System.out.println("Following task is available for accountancy group: " + task.getName());
taskService.claim(task.getId(), "kermit");
}
//
for (Task task : tasks) {
taskService.complete(task.getId());
}
//
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();
System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());
}
}

7.4.12
Activiti BPMN 2.0

7.5 BPMN 2.0

7.5.1
BPMN 2.0 end-users
Activiti
BPMN 2.0 Activiti

BPMN 2.0 XML Activiti


Activiti BPMN extensions
BPMN 2.0
BPMN 2.0

Activiti
41

XML activiti:

BPMN BPMN

/
7.5.2
BPMN 2.0

XML

XML

timeData ISO 8601

<timerEventDefinition>
<timeDate>2011-03-11T12:13:14</timeDate>
</timerEventDefinition>

timeDurationtimeDuration timerEventDuration
ISO 8601 BPMN 2.0 10
<timerEventDefinition>
<timeDuration>P10D</timeDuration>
</timerEventDefinition>

timeCycle
ISO
8601 3 10
<timerEventDefinition>
<timeCycle>R3/PT10H</timeCycle>
</timerEventDefinition>
cron 5 starting at full hour
0 0/5 * * * ?
cron
42

Unix cron

cron timer start events

ISO 8601 cron

<boundaryEventid="escalationTimer"cancelActivity="true"attachedToRef="firstLineSupport">
<timerEventDefinition>
<timeDuration>${duration}</timeDuration>
</timerEventDefinition>
</boundaryEvent>

activiti.cfg.xml jobExecutorActivat true


job executor
7.5.3

XML

Activiti

formKey
<startEventid="request"activiti:formKey="org/activiti/examples/taskforms/request.form"/>

initiator id
<startEventid="request"activiti:initiator="initiator"/>
tye-finally IdentityService.setAuthenticatedUserId(String)
try {
identityService.setAuthenticatedUserId("bono");
runtimeService.startProcessInstanceByKey("someProcessKey");
} finally {
identityService.setAuthenticatedUserId(null);
}
Activiti Explorer

43

7.5.4

startProcessInstanceByXXX
ProcessInstance processInstance = runtimeService.startProcessInstanceByXXX();

XML
XML

<startEventid="start"name="my start event"/>

7.5.5

44

XML
XML
2011 3 11 12:13 4 5
<startEventid="theStart">
<timerEventDefinition>
<timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle>
</timerEventDefinition>
</startEvent>

<startEventid="theStart">
<timerEventDefinition>
<timeDate>2011-03-11T12:13:14</timeDate>
</timerEventDefinition>
</startEvent>
7.5.6

XML
7.5.7

45

XML
XML
<endEventid="end"name="my end event"/>
7.5.8

BPMN Java BPMN


Java

XML
errorEventDefinition
<endEventid="myErrorEndEvent">
<errorEventDefinitionerrorRef="myError"/>
</endEvent>
errorRef error
<errorid="myError"errorCode="123"/>
...
<processid="myProcess">
...
error errorCode errorRef
errorRef errorCode Activiti
<errorid="myError"errorCode="error123" />
46

...
<processid="myProcess">
...
<endEventid="myErrorEndEvent">
<errorEventDefinitionerrorRef="myError"/>
</endEvent>
...

<endEventid="myErrorEndEvent">
<errorEventDefinitionerrorRef="error123"/>
</endEvent>
errorRef BPMN 2.0 QName
7.5.9

BPMN 2.0

XML
id
<sequenceFlowid="flow1"sourceRef="theStart"targetRef="theTask"/>

7.5.10

BPMN 2.0

BPMN 2.0
47

XML
XML conditionExpression tFormatExpressions
xsi:type=
<sequenceFlowid="flow"sourceRef="theStart"targetRef="theTask">
<conditionExpressionxsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>
</sequenceFlow>
conditionExpression UEL

JavaBean getters
<conditionExpressionxsi:type="tFormalExpression">
<![CDATA[${order.price > 100 && order.price < 250}]]>
</conditionExpression>

<conditionExpressionxsi:type="tFormalExpression">
<![CDATA[${order.isStandardOrder()}]]>
</conditionExpression>

Activiti org.activiti.examples.bpmn.expression

48

7.5.11

BPMN 2.0

XML
default XML flow2
conditionA conditionB false
<exclusiveGatewayid="exclusiveGw"name="Exclusive Gateway"default="flow2"/>
<sequenceFlowid="flow1"sourceRef="exclusiveGw"targetRef="task1">
<conditionExpressionxsi:type="tFormalExpression">${conditionA}</conditionExpression>
</sequenceFlow>
<sequenceFlowid="flow2"sourceRef="exclusiveGw"targetRef="task2"/>
<sequenceFlowid="flow3"sourceRef="exclusiveGw"targetRef="task3">
<conditionExpressionxsi:type="tFormalExpression">${conditionB}</conditionExpression>
49

</sequenceFlow>

7.5.12
gateway
gateway BPMN 2.0
gateway gateway

7.5.13

XOR exclusive data-based gateway


true
true
BPMN 2.0 true
50

true
XML

X XOR
BPMN 2.0 X X

XML
XML

XML
<exclusiveGatewayid="exclusiveGw"name="Exclusive Gateway"/>
<sequenceFlowid="flow2"sourceRef="exclusiveGw"targetRef="theTask1">
<conditionExpressionxsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>
<sequenceFlowid="flow3"sourceRef="exclusiveGw"targetRef="theTask2">
<conditionExpressionxsi:type="tFormalExpression">${input == 2}</conditionExpression>
51

</sequenceFlow>
<sequenceFlowid="flow4"sourceRef="exclusiveGw"targetRef="theTask3">
<conditionExpressionxsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>
7.5.14

fork

join

fork join

XML
XML

52

<parallelGatewayid="myParallelGateway"/>
forkjoin
XML
<startEventid="theStart"/>
<sequenceFlowid="flow1"sourceRef="theStart"targetRef="fork"/>
<parallelGatewayid="fork"/>
<sequenceFlowsourceRef="fork"targetRef="receivePayment"/>
<sequenceFlowsourceRef="fork"targetRef="shipOrder"/>
<userTaskid="receivePayment"name="Receive Payment"/>
<sequenceFlowsourceRef="receivePayment"targetRef="join"/>
<userTaskid="shipOrder"name="Ship Order"/>
<sequenceFlowsourceRef="shipOrder"targetRef="join"/>
<parallelGatewayid="join"/>
<sequenceFlowsourceRef="join"targetRef="archiveOrder"/>
<userTaskid="archiveOrder"name="Archive Order"/>
<sequenceFlowsourceRef="archiveOrder"targetRef="theEnd"/>
<endEventid="theEnd"/>

ProcessInstance pi = runtimeService.startProcessInstanceByKey("forkJoin");
TaskQuery query = taskService.createTaskQuery()
.processInstanceId(pi.getId())
.orderByTaskName()
.asc();
List<Task> tasks = query.list();
assertEquals(2, tasks.size());
Task task1 = tasks.get(0);
assertEquals("Receive Payment", task1.getName());
Task task2 = tasks.get(1);
assertEquals("Ship Order", task2.getName());

Archive Order
53

/
BPMN
2.0

7.5.15

fork true

join
join
join
{ a a}{
b b}{ c c} a,b c a,b c
a,b,c

fork join
true

54

XML
XML
<inclusiveGatewayid="myInclusiveGateway"/>
forkjoin
XML
<startEventid="theStart"/>
<sequenceFlowid="flow1"sourceRef="theStart"targetRef="fork"/>
<inclusiveGatewayid="fork"/>
<sequenceFlowsourceRef="fork"targetRef="receivePayment">
<conditionExpressionxsi:type="tFormalExpression">${paymentReceived == false}</conditionExpression>
</sequenceFlow>
<sequenceFlowsourceRef="fork"targetRef="shipOrder">
<conditionExpressionxsi:type="tFormalExpression">${shipOrder == true}</conditionExpression>
</sequenceFlow>
<userTaskid="receivePayment"name="Receive Payment"/>
55

<sequenceFlowsourceRef="receivePayment"targetRef="join"/>
<userTaskid="shipOrder"name="Ship Order"/>
<sequenceFlowsourceRef="shipOrder"targetRef="join"/>
<inclusiveGatewayid="join"/>
<sequenceFlowsourceRef="join"targetRef="archiveOrder"/>
<userTaskid="archiveOrder"name="Archive Order"/>
<sequenceFlowsourceRef="archiveOrder"targetRef="theEnd"/>
<endEventid="theEnd"/>
paymentReceived == false shipOrder == true
true true
ship order
HashMap<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("receivedPayment", true);
variableMap.put("shipOrder", true);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("forkJoin");
TaskQuery query = taskService.createTaskQuery()
.processInstanceId(pi.getId())
.orderByTaskName()
.asc();
List<Task> tasks = query.list();
assertEquals(1, tasks.size());
Task task = tasks.get(0);
assertEquals("Ship Order", task.getName());

Archive Order

7.5.16

56

XML
XML id name
<userTaskid="theTask"name="Important task"/>
BPMN 2.0 documentation
<userTaskid="theTask"name="Schedule meeting">
<documentation>
Schedule an engineering meeting for next week with the new hire.
</documentation>
java
task.getDescription()

Query API
Activity
java.util.Date null Service Task
<userTaskid="theTask"name="Important task"activiti:dueDate="${dateVariable}"/>
TaskService DelegateTask

humanPerformer humanPerformer
resourceAssignmentExpression formalExpressions
<process... >
...
<userTaskid='theTask'name='important task'>
<humanPerformer>
<resourceAssignmentExpression>
57

<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>
Activiti

TaskService
List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list();
potentialOwner humanPerformer
formal

<process... >
...
<userTaskid='theTask'name='important task'>
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
</userTask>
potential owner TaskQuery

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit");


kermit formal user(kermit) kermit
group(management) kermit identity
IdentityService
group(accountancy)

<formalExpression>accountancy</formalExpression>

Activiti

assignee
<userTaskid="theTask"name="my task"activiti:assignee="kermit"/>
humanPerformer
58

candidateUsers

<userTaskid="theTask"name="my task"activiti:candidateUsers="kermit, gonzo"/>


potentialOwner potential owner user(kermit)

candidateGroups

<userTaskid="theTask"name="my task"activiti:candidateGroups="management, accountancy"/>


potentialOwner potential owner group(management)

candidateUsers candidateGroups

create
<userTaskid="task1"name="My task">
<extensionElements>
<activiti:taskListenerevent="create"class="org.activiti.MyAssignmentHandler"/>
</extensionElements>
</userTask>
DelegateTask /
publicclass MyAssignmentHandler implements TaskListener {
publicvoid notify(DelegateTask delegateTask) {
//
//
delegateTask.setAssignee("kermit");
delegateTask.addCandidateUser("fozzie");
delegateTask.addCandidateGroup("management");
...
}
}
Spring create
Spring bean ldapServiceSpring bean findManagerOfEmployee
emp
<userTaskid="task"name="My Task"activiti:assignee="${ldapService.findManagerForEmployee(emp)}"/>

<userTaskid="task"name="My Task"activiti:candidateUsers="${ldapService.findAllSales()}"/>
String Collection<String>

59

publicclass FakeLdapService {
public String findManagerForEmployee(String employee) {
return"Kermit The Frog";
}
public List<String> findAllSales() {
return Arrays.asList("kermit", "gonzo", "fozzie");
}
}

7.5.17

BPMN 2.0

XML
script scriptFormat
<scriptTaskid="theScriptTask"name="Execute script"scriptFormat="groovy">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
scriptFormat JSR-223Java scripting for the Java plateform Groovy jar
Activiti JSR-223 jar
60

inputArray

<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
sum
Groovy defdef sum = 0

execution execution
<script>
def scriptVar = "test123"
execution.setVariable("myVar", scriptVar)
</script>
outout:printlang:importcontextelcontext

activity:resultVariable

<scriptTaskid="theScriptTask"name="Execute script"scriptFormat="juel"activiti:resultVariable="myVar">
<script>#{echo}</script>
</scriptTask>
#{echo}myVar
7.5.18 Java

Java Java

61

XML
4 Java

JavaDelegate ActivitiBehavior

activity:class
<serviceTaskid="javaService"
name="My Java Service Task"
activiti:class="org.activiti.MyJavaDelegate"/>

activiti:class
<serviceTaskid="serviceTask"activiti:delegateExpression="${delegateExpressionBean}"/>
delegateExpressionBean Spring JavaDelegate bean
activiti:expression UEL
<serviceTaskid="javaService"
name="My Java Service Task"
activiti:expression="#{printer.printMessage()}"/>
printer printMessage

<serviceTaskid="javaService"
name="My Java Service Task"
activiti:expression="#{printer.printMessage(execution, myVar)}"/>
printer printMessage DelegateException execution
execution myVar
activiti:expression UEL
<serviceTaskid="javaService"
62

name="My Java Service Task"


activiti:expression="#{split.ready}"/>
split bean ready getter getReady

Spring

org.activiti.engine.delegate.JavaDelegate execute
BPMN 2.0
Java
org.activiti.engine.delegate.JavaDelegate execute(DelegateExecution)
DelegateExcution
Javadoc
publicclass ToUppercase implements JavaDelegate {
publicvoid execute(DelegateExecution execution) throws Exception {
String var = (String) execution.getVariable("input");
var = var.toUpperCase();
execution.setVariable("input", var);
}
}
serviceTask java execute(DelegateExecution)

activiti:class
ActivitiException
ant Activiti Explorer
[] org.activiti.engine.impl.pvm.delegate.ActivityBehavior
ActivityExecution
ActivityBehavior

Java Bean firstName setter setFirstName()


public setter setter private
SecurityManagers private public setter
setter private org.activiti.engine.delegate.Expression
63

class
extensionElements XML BPMN 2.0 XML
<serviceTaskid="javaService"
name="Java service invocation"
activiti:class="org.activiti.examples.bpmn.servicetask.ToUpperCaseFieldInjected">
<extensionElements>
<activiti:fieldname="text"stringValue="Hello World"/>
</extensionElements>
</serviceTask>
ToUpperCaseFieldInjected org.activiti.engine.delegate.Expressiontext text
text.getValue(execution)Hello world
e-mail
activiti:string
<serviceTaskid="javaService"
name="Java service invocation"
activiti:class="org.activiti.examples.bpmn.servicetask.ToUpperCaseFieldInjected">
<extensionElements>
<activiti:fieldname="text">
<activiti:string>
Hello World
</activiti:string>
</activiti:field>
</extensionElements>
</serviceTask>
Spring bean Spring

Java
org.activiti.engine.delegate.Expression execute
DelegateExecution org.activiti.engine.delegate.Expression /
<serviceTaskid="javaService"name="Java service invocation"
activiti:class="org.activiti.examples.bpmn.servicetask.ReverseStringsFieldInjected">
<extensionElements>
<activiti:fieldname="text1">
<activiti:expression>${genderBean.getGenderString(gender)}</activiti:expression>
</activiti:field>
<activiti:fieldname="text2">
<activiti:expression>
Hello ${gender == 'male' ? 'Mr.' : 'Mrs.'} ${name}
</activiti:expression>
</activiti:field>
</extensionElements>
</serviceTask>
64

DelegateExecution
org.activiti.examples.bpmn.servicetask.JavaServiceTaskTest.testExpressionFieldInjection
publicclass ReverseStringsFieldInjected implements JavaDelegate {
private Expression text1;
private Expression text2;
publicvoid execute(DelegateExecution execution) {
String value1 = (String) text1.getValue(execution);
execution.setVariable("var1", new StringBuffer(value1).reverse().toString());
String value2 = (String) text2.getValue(execution);
execution.setVariable("var2", new StringBuffer(value2).reverse().toString());
}
}
XML
<activiti:fieldname="text1"expression="${genderBean.getGenderString(gender)}"/>
<activiti:fieldname="text1"expression="Hello ${gender == 'male' ? 'Mr.' : 'Mrs.'} ${name}"/>
java serviceTask

activiti:resultVariable

<serviceTaskid="aMethodExpressionServiceTask"
activiti:expression="#{myService.doSomething()}"
activiti:resultVariable="myVar"/>
Spring bean myService
doSomething()myVar

<serviceTaskid="javaService"
name="Java service invocation"
activiti:class="org.activiti.ThrowsExceptionBehavior">
</serviceTask>
65

<sequenceFlowid="no-exception"sourceRef="javaService"targetRef="theEnd"/>
<sequenceFlowid="exception"sourceRef="javaService"targetRef="fixException"/>
exception no-exception id
publicclass ThrowsExceptionBehavior implements ActivityBehavior {
publicvoid execute(ActivityExecution execution) throws Exception {
String var = (String) execution.getVariable("var");
PvmTransition transition = null;
try {
executeLogic(var);
transition = execution.getActivity().findOutgoingTransition("no-exception");
} catch (Exception e) {
transition = execution.getActivity().findOutgoingTransition("exception");
}
execution.take(transition);
}
}
7.5.19 WebService
[]

WebService web

WebService Java

XML
WebService WebService WSDL import

<import importType="http://schemas.xmlsoap.org/wsdl/"
location="http://localhost:63081/counter?wsdl"
66

namespace="http://webservice.activiti.org/"/>
Activiti prottyPrint

<messageid="prettyPrintCountRequestMessage"itemRef="tns:prettyPrintCountRequestItem"/>
<messageid="prettyPrintCountResponseMessage"itemRef="tns:prettyPrintCountResponseItem"/>
<itemDefinitionid="prettyPrintCountRequestItem"structureRef="counter:prettyPrintCount"/>
<itemDefinitionid="prettyPrintCountResponseItem"structureRef="counter:prettyPrintCountResponse"/>
BPMN WebService interface
operations
operation messages
counter
prettyPrintCountOperation
<interfacename="Counter Interface"implementationRef="counter:Counter">
<operation id="prettyPrintCountOperation"name="prettyPrintCount Operation"
implementationRef="counter:prettyPrintCount">
<inMessageRef>tns:prettyPrintCountRequestMessage</inMessageRef>
<outMessageRef>tns:prettyPrintCountResponseMessage</outMessageRef>
</operation>
</interface>
##WebService implementation WebService WebService

<serviceTaskid="webService"
name="Web service invocation"
implementation="##WebService"
operationRef="tns:prettyPrintCountOperation">

WebService IO

WebService IO
BPMN 2.0 prettyPrint
item definitions input output
<ioSpecification>
<dataInputitemSubjectRef="tns:prettyPrintCountRequestItem"id="dataInputOfServiceTask"/>
<dataOutputitemSubjectRef="tns:prettyPrintCountResponseItem"id="dataOutputOfServiceTask"/>
<inputSet>
<dataInputRefs>dataInputOfServiceTask</dataInputRefs>
</inputSet>
<outputSet>
<dataOutputRefs>dataOutputOfServiceTask</dataOutputRefs>
</outputSet>
</ioSpecification>

67

source target
prefix suffix
<dataInputAssociation>
<sourceRef>dataInputOfProcess</sourceRef>
<targetRef>dataInputOfServiceTask</targetRef>
<assignment>
<from>${dataInputOfProcess.prefix}</from>
<to>${dataInputOfServiceTask.prefix}</to>
</assignment>
<assignment>
<from>${dataInputOfProcess.suffix}</from>
<to>${dataInputOfServiceTask.suffix}</to>
</assignment>
</dataInputAssociation>
sourceRef Activiti targetRef
PrefixVariableprefixSuffixVariablesuffix
<dataInputAssociation>
<sourceRef>PrefixVariable</sourceRef>
<targetRef>prefix</targetRef>
</dataInputAssociation>
<dataInputAssociation>
<sourceRef>SuffixVariable</sourceRef>
<targetRef>suffix</targetRef>
</dataInputAssociation>

target source

<dataOutputAssociation>
<targetRef>dataOutputOfProcess</targetRef>
<transformation>${dataOutputOfServiceTask.prettyPrint}</transformation>
</dataOutputAssociation>
68

sourceReftargetRef Activiti

<dataOutputAssociation>
<sourceRef>prettyPrint</sourceRef>
<targetRef>OutputVariable</targetRef>
</dataOutputAssociation>
7.5.20
[]

Activiti Drools Expert Drool


.drl
.drl BAR Drool Expert
Jboss Drools Drools

XML
BAR

org.activiti.engine.rules.OUPUT

<processid="simpleBusinessRuleProcess">
<startEventid="theStart"/>
<sequenceFlowsourceRef="theStart"targetRef="businessRuleTask"/>
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:resultVariable="rulesOutput"/>
<sequenceFlowsourceRef="businessRuleTask"targetRef="theEnd"/>
69

<endEventid="theEnd"/>
</process>
.drl
<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"/>
rule1 role2

<businessRuleTaskid="businessRuleTask"activiti:ruleVariablesInput="${order}"
activiti:rules="rule1, rule2"exclude="true"/>
BAR rule1 rule2
7.5.21
Activiti cc, bcc, html e-mail
BPMN 2.0 Activiti

Mail
Activiti SMTP
activiti.cfg.xml
7.1

mailServerHost

mail.mycorp.com
localhost

mailServerPort

SMTP 25

mailServerDefaultFrom

e-mails e-mail
activiti@activiti.org

mailServerUsername

e-mails

mailServerPassword

e-mails

mail
<serviceTaskid="sendMail"activiti:type="mail">

EL
70

7.2

to

e-mail

form

e-mail

subject

e-mail

cc

e-mail cc

bcc

e-mail bcc

charset

html

e-mail HTML

text

e-mail e-mail e-mail


html

XML
<serviceTaskid="sendMail"activiti:type="mail">
<extensionElements>
<activiti:fieldname="from"stringValue="order-shipping@thecompany.com"/>
<activiti:fieldname="to"expression="${recipient}"/>
<activiti:fieldname="subject"expression="Your order ${orderId} has been shipped"/>
<activiti:fieldname="html">
<activiti:expression>
<![CDATA[
<html>
<body>
Hello ${male ? 'Mr.' : 'Mrs.' } ${recipientName},<br/><br/>
As of ${now}, your order has been <b>processed and shipped</b>.<br/><br/>
Kind regards,<br/>
TheCompany.
</body>
</html>
]]>
</activiti:expression>
</activiti:field>
</extensionElements>
</serviceTask>

71

7.5.22 Mule
Mule Mule Activiti Mule BPMN 2.0

Activiti Mule
Mule
Mule mule
<serviceTaskid="sendMule"activiti:type="mule">
Mule EL
7.3Mule

endpointUrl

Mule

language

payloadExpression

payloadExpression

An expression that will be the message's payload.

resultVariable

XML Mule
<extensionElements>
72

<activiti:fieldname="endpointUrl">
<activiti:string>vm://in</activiti:string>
</activiti:field>
<activiti:fieldname="language">
<activiti:string>juel</activiti:string>
</activiti:field>
<activiti:fieldname="payloadExpression">
<activiti:string>"hi"</activiti:string>
</activiti:field>
<activiti:fieldname="resultVariable">
<activiti:string>theVariable</activiti:string>
</activiti:field>
</extensionElements>

7.5.23

BPM UI

XML
<manualTaskid="myManualTask"name="Call client for more information"/>

7.5.24 Java

Java

73

XML
<receiveTaskid="waitState"name="wait"/>
id
runtimeService.signal(executionId)
ProcessInstance pi = runtimeService.startProcessInstanceByKey("receiveTask");
Execution execution = runtimeService.createExecutionQuery()
.processInstanceId(pi.getId())
.activityId("wait")
.singleResult();
assertNotNull(execution);
runtimeService.signal(execution.getId());

7.5.25
5.3 api
org.activiti.engine.impl... implorg.activiti.engine.impl.pvm.delegate.ExecutionListener
org.activiti.engine.impl.pvm.delegate.TaskListener org.activiti.engine.impl.pvm.el.Expression
org.activiti.engine.delegate.ExecutionListenerorg.activiti.engine.delegate.TaskListener
org.activiti.engine.delegate.Expression API ExecutionListenerExecution.getEventSource()
API .impl.
Java

Taking a transition UML

3
74

<processid="executionListenersProcess">
<extensionElements>
<activiti:executionListenerclass="org.activiti.examples.bpmn.executionlistener.ExampleExecutionListenerOne"event="start"/
>
</extensionElements>
<startEventid="theStart"/>
<sequenceFlowsourceRef="theStart"targetRef="firstTask"/>
<userTaskid="firstTask"/>
<sequenceFlowsourceRef="firstTask"targetRef="secondTask">
<extensionElements>
<activiti:executionListenerclass="org.activiti.examples.bpmn.executionListener.ExampleExecutionListenerTwo"/>
</extensionElements>
</sequenceFlow>
<userTaskid="secondTask">
<extensionElements>
<activiti:executionListenerexpression="${myPojo.myMethod(execution.event)}"event="end"/>
</extensionElements>
</userTask>
<sequenceFlowsourceRef="secondTask"targetRef="thirdTask"/>
<userTaskid="thirdTask"/>
<sequenceFlowsourceRef="thirdTask"targetRef="theEnd"/>
<endEventid="theEnd"/>
</process>
Java ExampleExecutionListenerOne

org.activiti.engine.delegate.ExecutionListener
notify(ExecutionListenerExecution execution)
publicclass ExampleExecutionListenerOne implementsExecutionListener {
publicvoid notify(ExecutionListenerExecution execution) throws Exception {
execution.setVariable("variableSetInExecutionListener", "firstValue");
execution.setVariable("eventReceived", execution.getEventName());
}
}
org.activiti.engine.delegate.JavaDelegate
serviceTask

75

event
secondTask
/
<activiti:executionListenerexpression="${myPojo.myMethod(execution.eventName)}"event="end"/>
execution execution
execution.eventName
delegateExpression
<activiti:executionListenerevent="start"delegateExpression="${myExecutionListenerBean}"/>

class

<processid="executionListenersProcess">
<extensionElements>
<activiti:executionListenerclass="org.activiti.examples.bpmn.executionListener.ExampleFieldInjectedExecutionListener"event
="start">
<activiti:fieldname="fixedValue"stringValue="Yes, I am "/>
<activiti:fieldname="dynamicValue"expression="${myVar}"/>
</activiti:executionListener>
</extensionElements>
<startEventid="theStart"/>
<sequenceFlowsourceRef="theStart"targetRef="firstTask"/>
<userTaskid="firstTask"/>
<sequenceFlowsourceRef="firstTask"targetRef="theEnd"/>
<endEventid="theEnd"/>
</process>

publicclass ExampleFieldInjectedExecutionListener implements ExecutionListener {


private Expression fixedValue;
private Expression dynamicValue;
publicvoid notify(ExecutionListenerExecution execution) throws Exception {
76

execution.setVariable("var", fixedValue.getValue(execution).toString() + dynamicValue.getValue(execution).toString());


}
}
ExampleFieldInjectedExecutionListener 2

var
@Deployment(resources =
{"org/activiti/examples/bpmn/executionListener/ExecutionListenersFieldInjectionProcess.bpmn20.xml"})
publicvoid testExecutionListenerFieldInjection() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("myVar", "listening!");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("executionListenersProcess", variables);
Object varSetByListener = runtimeService.getVariable(processInstance.getId(), "var");
assertNotNull(varSetByListener);
assertTrue(varSetByListener instanceof String);
//
assertEquals("Yes, I am listening!", varSetByListener);
}
7.5.26

Java
BPMN 2.0 extensionElements
activiti Activiti
<userTaskid="myTask"name="My Task">
<extensionElements>
<activiti:taskListenerevent="create"class="org.activiti.MyTaskCreateListener"/>
</extensionElements>
</userTask>

event

create

assignment userTask create


assignment create

complete

class org.activiti.engine.impl.pvm.delegate.TaskListener

publicclass MyTaskCreateListener implements TaskListener {

77

publicvoid notify(DelegateTask delegateTask) {


//
}
}
execution Activiti

expression class DelegateTask


task.eventName
<activiti:taskListenerevent="create"expression="${myObject.callMethod(task, task.eventName)}"/>

delegateExpression TaskListener
<activiti:taskListenerevent="create"delegateExpression="${myTaskListenerBean}"/>

7.5.27 for each

Java

Web

nrOfInstances

nrOfActiveInstances 1

nrOfCompleteInstances

execution.getVariable(x)
78

loopConter for-each

3 3

XML
xml multiInstanceLoopCharacteristics
<multiInstanceLoopCharacteristicsisSequential="false|true">
...
</multiInstanceLoopCharacteristics>
isSequential
loopCardinality
<multiInstanceLoopCharacteristicsisSequential="false|true">
<loopCardinality>5</loopCardinality>
</multiInstanceLoopCharacteristics>

<multiInstanceLoopCharacteristicsisSequential="false|true">
<loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality>
</multiInstanceLoopCharacteristics>
loopDataInputRef
inputDataItem
XML
<userTaskid="miTasks"name="My Task ${loopCounter}"activiti:assignee="${assignee}">
<multiInstanceLoopCharacteristicsisSequential="false">
<loopDataInputRef>assigneeList</loopDataInputRef>
<inputDataItemname="assignee"/>
</multiInstanceLoopCharacteristics>
</userTask>
assigneeList [kermit, gonzo, foziee] 3
79

assignee
loopDataInputRef inputDataItem 1)2) BPMN 2.0 Activiti
multiInstanceCharacteristics collection elementVariable
<userTaskid="miTasks"name="My Task"activiti:assignee="${assignee}">
<multiInstanceLoopCharacteristicsisSequential="true"
activiti:collection="${myService.resolveUsersForTask()}"activiti:elementVariable="assignee">
</multiInstanceLoopCharacteristics>
</userTask>

true
completionCondition
<userTaskid="miTasks"name="My Task"activiti:assignee="${assignee}">
<multiInstanceLoopCharacteristicsisSequential="false"
activiti:collection="assigneeList"activiti:elementVariable="assignee">
<completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
assigneeList 60%

80

7.5.28

<boundaryEventid="myBoundaryEvent"attachedToRef="theActivity">
<XXXEventDefinition/>
</boundaryEvent>

attachedToRef

XXXEventDefinition XML TimerEventDefinitionErrorEventDefinition

7.5.29

XML
timerEventDefinition
81

<boundaryEventid="escalationTimer"cancelActivity="true"attachedToRef="firstLineSupport">
<timerEventDefinition>
<timeDuration>PT4H</timeDuration>
</timerEventDefinition>
</boundaryEvent>

activiti.cfg.xml jobExecutorActivate true

ACT-47
gateway

82

7.5.30

83

XML

<boundaryEventid="catchError"attachedToRef="mySubProcess">
<errorEventDefinitionerrorRef="myError"/>
</boundaryEvent>

errorRef error
<errorid="myError"errorCode="123"/>
...
<processid="myProcess">
...

errorCode errors

errorRef error error error errorCode

errorRef error errors

errorRef BPMN 2.0 error errorRef errorCode


error end

error end Review profitability


error errorReview sales leadReview
customer ratingProvide additional details

84

demo setup org.activiti.examples.bpmn.event.error XML

7.5.31

<intermediateCatchEventid="myIntermediateCatchEvent">
<XXXEventDefinition/>
</intermediateCatchEvent>

XXXEventDefinition XML TimerEventDefinition

7.5.32

85

XML
timerEventDefinition
<intermediateCatchEventid="timer">
<timerEventDefinition>
<timeDuration>PT5M</timeDuration>
</timerEventDefinition>
</intermediateCatchEvent>

7.5.33

none start start event end


BPMN 2.0 Activiti

86

/
Level 2 support

XML
subprocess
<subProcessid="subProcess">
<startEventid="subProcessStart"/>
... ...
87

<endEventid="subProcessEnd"/>
</subProcess>

7.5.34

BPMN 2.0

XML
calledElement key
calledElement id
<callActivityid="callCheckCreditProcess"name="Check credit"calledElement="checkCreditProcess"/>

88

<callActivityid="callSubProcess"calledElement="checkCreditProcess">
<extensionElements>
<activiti:insource="someVariableInMainProcess"target="nameOfVariableInSubProcess"/>
<activiti:outsource="someVariableInSubProcss"target="nameOfVariableInMainProcess"/>
</extensionElements>
</callActivity>
Activiti BPMN dataInputAssociation dataOutputAssociation BPMN 2.0

<callActivityid="callSubProcess"calledElement="checkCreditProcess">
<extensionElements>
<activiti:insourceExpression="${x+5}""target="y"/>
<activiti:outsource="${y+5}"target="z"/>
</extensionElements>
</callActivity>
z = y+5 = x+5+5

check credit

<startEventid="theStart"/>
<sequenceFlowid="flow1"sourceRef="theStart"targetRef="receiveOrder"/>
<manualTaskid="receiveOrder"name="Receive Order"/>
<sequenceFlowid="flow2"sourceRef="receiveOrder"targetRef="callCheckCreditProcess"/>
<callActivityid="callCheckCreditProcess"name="Check credit"calledElement="checkCreditProcess"/>
<sequenceFlowid="flow3"sourceRef="callCheckCreditProcess"targetRef="prepareAndShipTask"/>
<userTaskid="prepareAndShipTask"name="Prepare and Ship"/>
<sequenceFlowid="flow4"sourceRef="prepareAndShipTask"targetRef="end"/>
<endEventid="end"/>
89

7.6
Activiti Activiti
Activiti
Acitivit

Activiti
Activiti

BPMN

Activiti (1)
90

Activiti (2)
Activiti (3)

Activiti (1)
Activiti

generate invoice
Activiti message

activiti:async="true"
<serviceTaskid="service1"name="Generate Invoice"activiti:class="my.custom.Delegate" activiti:async="true" />

activiti:async bpmn

91

Activiti

8.1
Activiti Java
JPA XML
UI
Java Map<String, String>
Map Map

Activiti API UI
FormData
StartFormData FormService.getStartFormData(String processDefinitionId)

TaskFormdata FormService.getTaskFormData(String taskId)


1 1

<startEventid="start"/>
start
formService.getStartFormData(String processDefinitionId).getFormProperties()

Address JPA
UI StreetName #{address.street}

UEL
#{address.street}
formProperty

92

<userTaskid="task">
<extensionElements>
<activiti:formPropertyid="room"/>
<activiti:formPropertyid="duration"type="long"/>
<activiti:formPropertyid="speaker"variable="SpeakerName"writable="false"/>
<activiti:formPropertyid="street"expression="#{address.street}"required="true"/>
</extensionElements>
</userTask>

room String room

duration java.lang.Long duration

speaker SpeakerName TaskFormData speaker


ActivitiException readable="false" FormData

street address String Java bean street required=true

FormData FormData StartFormData FormService.getStartFormData(String


processDefinitionId) TaskFormdata FormService.getTaskFormData(String taskId)

stringorg.activiti.engine.impl.form.StringFormType

longorg.activiti.engine.impl.form.LongFormType

enumorg.activiti.engine.impl.form.EnumFormType

dateorg.activiti.engine.impl.form.DateFormType

boolean (org.activiti.engine.impl.form.BooleqnFormType)

FormProperty List<FormProperty> formService.getStartFormData(String


processDefinitionId).getFormProperties() List<FormProperty> formService.getTaskFormData(String taskId).getFormProperties()

publicinterface FormProperty {
/** {@link FormService#submitStartFormData(String, java.util.Map)}
* {@link FormService#submitTaskFormData(String, java.util.Map)}*/
String getId();
/** */
String getName();
/** {@link #TYPE_STRING} */
FormType getType();
/** */
String getValue();
/**
* {@link FormService#getStartFormData(String)}{@link FormService#getTaskFormData(String)} */
boolean isReadable();
93

/** */
boolean isWritable();
/** */
boolean isRequired();
}

<startEventid="start">
<extensionElements>
<activiti:formPropertyid="speaker"
name="Speaker"
variable="SpeakerName"
type="string"/>
<activiti:formPropertyid="start"
type="date"
datePattern="dd-MMM-yyyy"/>
<activiti:formPropertyid="direction"type="enum">
<activiti:valueid="left"name="Go Left"/>
<activiti:valueid="right"name="Go Right"/>
<activiti:valueid="up"name="Go Up"/>
<activiti:valueid="down"name="Go Down"/>
</activiti:formProperty>
</extensionElements>
</startEvent>
API formProperty.getType().getName()
formProperty.getType().getInformation("datePattern")
formProperty.getType().getInformation("values")

Activity Explorer xml


<startEvent... >
<extensionElements>
<activiti:formPropertyid="numberOfDays"name="Number of days"value="${numberOfDays}"type="long"required="true"/>
<activiti:formPropertyid="startDate"name="First day of holiday (dd-MM-yyy)"value="${startDate}"datePattern="dd-MM-yyyy
hh:mm"type="date"required="true"/>
<activiti:formPropertyid="vacationMotivation"name="Motivation"value="${vacationMotivation}"type="string"/>
</extensionElements>
</userTask>
Activiti Explorer

94

8.2
API Activiti
StartFormData
FormService.getStartFormData(String processDefinitionId) TaskFormdata FormService.getTaskFormData(String taskId)
ProcessInstance FormService.submitStartFormData(String processDefinitionId, Map<String,String> properties) void
FormService.submitStartFormData(String taskId, Map<String,String> properties)

String ProcessDefinition.getDeploymentId() InputStream


RepositoryService.getResourceAsStream(String deploymentId, String resourceName)
/

<userTask activiti:formKey= API String FormService.getStartFormData(String


processDefinitionId).getFormKey() String FormService.getTaskFormData(String taskId).getFormKey()
org/activiti/example/form/my-custom-form.xml

key
web
IM email

95

JPA

JPA

JPA

9.1

JPA

@Id @EmbeddedId @IdClass


Id / JPA
boolean StringBigIntegerBigDecimal
java.util.Date java.sql.Date

9.2
JPA EntityManagerFactory
JPA
jpaPersistenceUnitName
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<!-- Database configurations -->
<propertyname="databaseSchemaUpdate"value="true"/>
<propertyname="jdbcUrl"value="jdbc:h2:mem:JpaVariableTest;DB_CLOSE_DELAY=1000"/>
<propertyname="jpaPersistenceUnitName"value="activiti-jpa-pu"/>
<propertyname="jpaHandleTransaction"value="true"/>
<propertyname="jpaCloseEntityManager"value="true"/>
<!-- job executor configurations -->
<propertyname="jobExecutorActivate"value="false"/>
<!-- mail server configurations -->
<propertyname="mailServerPort"value="5025"/>
</bean>
EntityManagerFactory open-jpa

beans beans open-jpa


actviti-spring-examples /activiti-spring/src/test/java/org/activiti/spring/test/jpa/JPASpringTest.java
96

<beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<propertyname="persistenceUnitManager"ref="pum"/>
<propertyname="jpaVendorAdapter">
<beanclass="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
<propertyname="databasePlatform"value="org.apache.openjpa.jdbc.sql.H2Dictionary"/>
</bean>
</property>
</bean>
<beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="transactionManager"ref="transactionManager"/>
<propertyname="databaseSchemaUpdate"value="true"/>
<propertyname="jpaEntityManagerFactory"ref="entityManagerFactory"/>
<propertyname="jpaHandleTransaction"value="true"/>
<propertyname="jpaCloseEntityManager"value="true"/>
<propertyname="jobExecutorActivate"value="false"/>
</bean>

ProcessEngine processEngine = ProcessEngineConfiguration


.createProcessEngineConfigurationFromResourceDefault()
.setJpaPersistenceUnitName("activiti-pu")
.buildProcessEngine();

jpaPersistenceUnitName
jpa

jpaEntityManagerFactory javax.persistence.EntityManagerFactory bean

/META-INF/persistence.xml
jpaEntityManagerFactory jpaPersistenceUnitName
jpaEntityManagerFactory jpaPersistenceUnitName

jpaHandleTransaction EntityManager /
Java APIJTA false

jpaCloseEntityManager
EntityManagerFactory EntityManager
EntityManager false

9.3

9.3.1
JPA JPAVariableTest JPAVariableTest.testUpdateJPAEntityValues
META-INF/persistence.xml EntityManagerFactory

97

id String value

@Entity(name = "JPA_ENTITY_FIELD")
publicclass FieldAccessJPAEntity {
@Id
@Column(name = "ID_")
private Long id;
private String value;
public FieldAccessJPAEntity() {
// JPA
}
public Long getId() {
returnid;
}
publicvoid setId(Long id) {
this.id = id;
}
public String getValue() {
returnvalue;
}
publicvoid setValue(String value) {
this.value = value;
}
}

Id EntityManaer
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("entityToUpdate", entityToUpdate);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("UpdateJPAValuesProcess", variables);
entityToUpdate setValue
JPA EntityManager
<serviceTaskid='theTask'name='updateJPAEntityTask'activiti:expression="${entityToUpdate.setValue('updatedValue')}"/>
98

EntityManager entityToUpdate value


value updateValue
//'UpdateJPAValuesProcess'entityToUpdate
Object updatedEntity = runtimeService.getVariable(processInstance.getId(), "entityToUpdate");
assertTrue(updatedEntity instanceof FieldAccessJPAEntity);
assertEquals("updatedValue", ((FieldAccessJPAEntity)updatedEntity).getValue());

9.3.2 JPA
JPA ProcessInstances ExecutionsProcessInstanceQuery ExecutionQuery
variableValueEquals(name, entity) JPA variableValueNotEqualsvariableValueGreaterThan
variableValueGreaterThanOrEqualvariableValueLessThan variableValueLessThanOrEqual JPA
ActivitiException
ProcessInstance result = runtimeService.createProcessInstanceQuery().variableValueEquals("entityToQuery",
entityToQuery).singleResult();

9.3.3 Spring beans JPA


JPASpringTest activiti-spring-examples

JPA Spring bean

Activiti bean

LoanRequestBean
LoanRequest activiti:resultVariable

/ boolean approvedByManager

approved

99

<?xml version="1.0"encoding="UTF-8"?>
<definitionsid="taskAssigneeExample"
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:activiti="http://activiti.org/bpmn"
targetNamespace="org.activiti.examples">
<processid="LoanRequestProcess"name="Process creating and handling loan request">
<startEventid='theStart'/>
<sequenceFlowid='flow1'sourceRef='theStart'targetRef='createLoanRequest'/>
<serviceTaskid='createLoanRequest'name='Create loan request'
activiti:expression="${loanRequestBean.newLoanRequest(customerName, amount)}"
activiti:resultVariable="loanRequest"/>
<sequenceFlowid='flow2'sourceRef='createLoanRequest'targetRef='approveTask'/>
<userTaskid="approveTask"name="Approve request"/>
<sequenceFlowid='flow3'sourceRef='approveTask'targetRef='approveOrDissaprove'/>
<serviceTaskid='approveOrDissaprove'name='Store decision'
activiti:expression="${loanRequest.setApproved(approvedByManager)}"/>
<sequenceFlowid='flow4'sourceRef='approveOrDissaprove'targetRef='exclusiveGw'/>
<exclusiveGatewayid="exclusiveGw"name="Exclusive Gateway approval"/>
<sequenceFlowid="endFlow1"sourceRef="exclusiveGw"targetRef="theEnd">
<conditionExpressionxsi:type="tFormalExpression">${loanRequest.approved}</conditionExpression>
</sequenceFlow>
<sequenceFlowid="endFlow2"sourceRef="exclusiveGw"targetRef="sendRejectionLetter">
<conditionExpressionxsi:type="tFormalExpression">${!loanRequest.approved}</conditionExpression>
</sequenceFlow>
<userTaskid="sendRejectionLetter"name="Send rejection letter"/>
<sequenceFlowid='flow5'sourceRef='sendRejectionLetter'targetRef='theOtherEnd'/>
100

<endEventid='theEnd'/>
<endEventid='theOtherEnd'/>
</process>
</definitions>
Spring JPA java
Spring bean

101

HistoricProcessInstances

HistoricActivityInstances

HistoricTaskInstances

HistoricDetails

Activiti Explore
10.1
API 4 HistoryService createHistoricProcessInstanceQuery()
createHistoricActivityInstanceQuery()createHistoricDetailQuery() createHistoricTaskInstanceQuery()
API javadocs org.activiti.engine.history

10.1.1 HistoricProcessInstanceQuery
XXX 10
HistoricProcessInstances
historyService.createHistoricProcessInstanceQuery()
.finished()
.processDefinitionId("XXX")
.orderByProcessInstanceDuration().desc()
.listPage(0, 10);

10.1.2 HistoricActivityInstanceQuery
serviceTask id XXX HistoricActivitiInstance
historyService.createHistoricActivityInstanceQuery()
.activityType("serviceTask")
.processDefinitionId("XXX")
102

.finished()
.orderByHistoricActivityInstanceEndTime().desc()
.listPage(0, 1);

10.1.3 HistoricDetailQuery
id 123 HistoricVariableUpdates
HistoricVariableUpdate orderByTime
orderByVariableRevision
historyService.createHistoricDetailQuery()
.variableUpdates()
.processInstanceId("123")
.orderByVariableName().asc()
.list()
id 123 HistoricFormProperties
historyService.createHistoricDetailQuery()
.formProperties()
.processInstanceId("123")
.orderByVariableName().asc()
.list()
id 123
HistoricVariableUpdates
historyService.createHistoricDetailQuery()
.variableUpdates()
.taskId("123")
.orderByVariableName().asc()
.list()
TaskService TaskLinstener DelegateTask
taskService.setVariableLocal("123", "myVariable", "Variable value");
publicvoid notify(DelegateTask delegateTask) {
delegateTask.setVariableLocal("myVariable", "Variable value");
}

103

10.1.4 HistoricTaskInstanceQuery
10 HistoricTaskInstances
historyService.createHistoricTaskInstanceQuery()
.finished()
.orderByHistoricTaskInstanceDuration().desc()
.listPage(0, 10);
invalidkermit HistoricTaskInstances
historyService.createHistoricTaskInstanceQuery()
.finished()
.taskDeleteReasonLike("%invalid%")
.taskAssignee("kermit")
.listPage(0, 10);

10.2
ProcessEngineConfiguration HISTORY_*
ProcessEngine processEngine = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.setHistory(ProcessEngineConfiguration.HISTORY_AUDIT)
.buildProcessEngine();
activiti.cfg.xml Spring
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<propertyname="history"value="audit"/>
...
</bean>

none

acitivity

audit

full audit

104

10.3
audit FormService.submitStartFormData(String processDefinitionId, Map<String,
String> properties) FormService.submitTaskFormData(String taskId, Map<String, String> properties)

[] Activiti Explorer submitStartFormData submitTaskFormData


Activiti Explorer full
ACT-294
API
historyService
.createHistoricDetailQuery()
.onlyFormProperties()
...
.list();
HistoricFormProperty
IdentityService.setAuthenticatedUserId(String)
HistoricProcessInstance.getStartUserId() HistoricActivityInstance.getAssignee()

105

Eclipse Designer

Activiti Eclipse Activiti Eclipse Designer BPMN 2.0 Activiti


Actiti Modeler Activiti Designer /
Activiti Modeler Activiti Modeler
Activiti Designer Java Activiti Designer

11.1
Eclipse Indigo Helios
HelpInstall New Software Add

NameActiviti BPMN 2.0 designer

Locationhttp://activiti.org/designer/update/

Contact all updates sites.. Eclipse

106

11.2 Activiti Designer

Activiti

Activiti BPMN 2.0 XML Eclipse preference


Activiti

BPMN 2.0 XML Activiti Designer BPMN 2.0


XML package exporler Activiti Import BPMN 2.0 file
BPMN 2.0 XML BPMN 2.0 XML
src/main/resources/diagrams .bpmn20.xml
BPMN
2.0 XML Activiti Designer BPMN 2.0 XML BPMN DI
BPMN 2.0 XML
BPMN DI BPMN 2.0 XML
107

BAR JAR package exporler Activiti


Create deployment artifacts Activiti Designer Designer

package explorer BPMN 2.0 XML generate unit test

H2 Activiti

BPMN 2.0 XML Activiti XML 2 XSDs BPMN


2.0 XSD Activiti XSD XSDs

108

Activiti errors Eclipse problem

Activiti Maven mvn eclipse:eclipse Maven


Maven

11.3 Activiti Designer BPMN

start end
error
109

110

Java Java

111

Activiti Designer

Activiti

Activiti

112

11.4 Activiti Designer


Activiti BAR BPMN 2.0 XML
Activiti Explorer Activiti Designer BAR
package explorer Activiti Create deployment artifacts

113

deployment BAR Activiti Java JAR

Activiti Explorer Activiti


Java Activiti Designer Create deployment artifacts
JAR JAR Activiti Tomcat activiti-XXX/WEB-INF/lib
Activiti
11.5 Activiti Designer
[] Activiti Designer
Activiti
Designer Acitiviti Designer

Activiti Designer Java Maven


EclipseOSGIEclipse SWT
11.5.1

Activiti Designer

114

Activiti Designer BPMN 2.0

JAR Activiti Designer


JAR Activiti Designer

Activiti Designer Activiti projects/designer


examples/money-tasks

JAR
Eclipse HeliosMaven3.x
11.5.1.1 Eclipse/Maven
EclipseGalileo Helios 3.x Apache Maven 2.x Maven
Eclipse Java
Eclipse Maven Maven
Eclipse pom.xml Maven
src/main/java src/main/resources Maven Java pom.xml

<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.acme</groupId>
<artifactId>money-tasks</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>Acme Corporation Money Tasks</name>
...
</pom>
groupIdartifactId version pom.xml
money
pom.xml
<dependencies>
115

<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-designer-integration</artifactId>
<version>0.7.0</version><!-- Current Activiti Designer Version -->
<scope>compile</scope>
</dependency>
</dependencies>
...
<repositories>
<repository>
<id>Activiti</id>
<url>http://maven.alfresco.com/nexus/content/repositories/activiti/</url>
</repository>
</repositories>
pom.xml maven-compiler-plugin Java 1.5

Maven JAR MANIFEST.MF


Designer Designer
pom.xml
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<optimize>true</optimize>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>false</addClasspath>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<ActivitiDesigner-Extension-Name>Acme Money</ActivitiDesigner-Extension-Name>
</manifestEntries>
116

</archive>
</configuration>
</plugin>
</plugins>
</build>
ActivitiDesigner-Extension-Name Eclipse pom.xml
Eclipse Maven
mvn eclipse:eclipse

Refreshsrc/main/java src/main/resources
Eclipse

m2eclipse Maven
MavenUpdate project configuration
Activiti Designer
11.5.1.2 Activiti Designer
Activiti Designer

JAR Maven mvn

Activiti Designer

Activiti Designer Window Preferences

preferences user Java Eclipse User Libraries

User Libraries Activiti Designer


Eclipse

117

Activiti Designer Extensions Add JARs


Activiti Designer Extensions preference

OK preferences Activiti Designer Extensions Activiti


Navigator Package Explorer
Activiti

118

11.5.1.3
JAR
Activiti Activiti Designer
Activiti JavaDelegate
Java
CustomServiceTask
AbstractCustomServiceTask
Javadoc

/**
* @author John Doe
* @version 1
* @since 1.0.0
*/
publicclass AcmeMoneyTask extends AbstractCustomServiceTask {
...
}
getName()
AbstractCustomServiceTask JAR src/main/resources
16x16 JPEG PNG
@Property
@Property(type = PropertyType.TEXT, displayName = "Account Number")
@Help(displayHelpShort = "Provide an account number", displayHelpLong = HELP_ACCOUNT_NUMBER_LONG)
private String accountNumber;
PropertyType required true

property @Property order


@Help @Help

MoneyTask comments
/**
119

* @author John Doe


* @version 1
* @since 1.0.0
*/
@Runtime(delegationClass = "org.acme.runtime.AcmeMoneyJavaDelegation")
@Help(displayHelpShort = "Creates a new account", displayHelpLong = "Creates a new account using the account number
specified")
publicclass AcmeMoneyTask extends AbstractCustomServiceTask {
privatestaticfinal String HELP_ACCOUNT_NUMBER_LONG = "Provide a number that is suitable as an account number.";
@Property(type = PropertyType.TEXT, displayName = "Account Number", required = true)
@Help(displayHelpShort = "Provide an account number", displayHelpLong = HELP_ACCOUNT_NUMBER_LONG)
private String accountNumber;
@Property(type = PropertyType.MULTILINE_TEXT, displayName = "Comments")
@Help(displayHelpShort = "Provide comments", displayHelpLong = "You can add comments to the node to provide a brief
description.")
private String comments;
/*
* (non-Javadoc)
*
* @see org.activiti.designer.integration.servicetask.AbstractCustomServiceTask #contributeToPaletteDrawer()
*/
@Override
public String contributeToPaletteDrawer() {
return"Acme Corporation";
}
@Override
public String getName() {
return"Money node";
}
/*
* (non-Javadoc)
*
* @see org.activiti.designer.integration.servicetask.AbstractCustomServiceTask #getSmallIconPath()
*/
@Override
public String getSmallIconPath() {
return"icons/coins.png";
}
}
120

Activiti Designer

money accountNumber

Activiti @Runtime
delegationClass JAR
Activiti
@Runtime(delegationClass = "org.acme.runtime.AcmeMoneyJavaDelegation")

121

11.5.1.4
type PropertyType
PropertyType.TEXT

PropertyType.MULTILINE_TEXT
80

PropertyType.PERIOD

0 1

1y 2mo 3w 4d 5h 6m 7s 1 2 3 4 5
6 7 0

PropertyType.BOOLEAN_CHOICE
Property required
java.lang.Boolean.toString(boolean)true
false

122

PropertyType.RADIO_CHOICE

@PropertyItems

@Property(type = PropertyType.RADIO_CHOICE, displayName = "Withdrawl limit", required = true)


@Help(displayHelpShort = "The maximum daily withdrawl amount ", displayHelpLong = "Choose the maximum daily amount
that can be withdrawn from the account.")
@PropertyItems({ LIMIT_LOW_LABEL, LIMIT_LOW_VALUE, LIMIT_MEDIUM_LABEL, LIMIT_MEDIUM_VALUE, LIMIT_HIGH_LABEL,
LIMIT_HIGH_VALUE })
private String withdrawlLimit;

PropertyType.COMBOBOX_CHOICE

@PropertyItems

@Property(type = PropertyType.COMBOBOX_CHOICE, displayName = "Account type", required = true)


@Help(displayHelpShort = "The type of account", displayHelpLong = "Choose a type of account from the list of options")
@PropertyItems({ ACCOUNT_TYPE_SAVINGS_LABEL, ACCOUNT_TYPE_SAVINGS_VALUE, ACCOUNT_TYPE_JUNIOR_LABEL,
ACCOUNT_TYPE_JUNIOR_VALUE, ACCOUNT_TYPE_JOINT_LABEL,
ACCOUNT_TYPE_JOINT_VALUE, ACCOUNT_TYPE_TRANSACTIONAL_LABEL, ACCOUNT_TYPE_TRANSACTIONAL_VALUE,
ACCOUNT_TYPE_STUDENT_LABEL, ACCOUNT_TYPE_STUDENT_VALUE,
ACCOUNT_TYPE_SENIOR_LABEL, ACCOUNT_TYPE_SENIOR_VALUE })
private String accountType;

123

PropertyType.DATE_PICKER

@DatePickerProperty

DatePickerProperty dateTimePattern SimpleDateFormat


swtStyle SWT DateTime

@Property(type = PropertyType.DATE_PICKER, displayName = "Expiry date", required = true)


@Help(displayHelpShort = "The date the account expires ", displayHelpLong = "Choose the date when the account will expire if
no extended before the date.")
@DatePickerProperty(dateTimePattern = "MM-dd-yyyy", swtStyle = 32)
private String expiryDate;

PropertyType.DATA_GRID

@DataGridProperty

itemClass Activiti Designer List


itemClass
GroceryListItem CustomServiceTask
@Property(type = PropertyType.DATA_GRID, displayName = "Grocery List")
@DataGridProperty(itemClass = GroceryListItem.class)
private List<GroceryListItem>groceryList;
itemClass CustomServiceTask
TEXTMULTILINE_TEXT PERIOD PropertyType
PERIOD PropertyType

124

MULTILINE_TEXT PERIOD PropertyType OK

TEXT

orderable true

11.5.1.5
DefaultPaletteCustomizer
AbstractDefaultPaletteCustomizer DefaultPaletteCustomizer

AbstractDefaultPaletteCustomizer disablePaletteEntries()
PaletteEntry
PaletteEntry

PaletteEntry.ALL
publicclass MyPaletteCustomizer extends AbstractDefaultPaletteCustomizer {
/*
* (non-Javadoc)
*
* @see org.activiti.designer.integration.palette.DefaultPaletteCustomizer#disablePaletteEntries()
*/
@Override
public List<PaletteEntry> disablePaletteEntries() {
List<PaletteEntry> result = new ArrayList<PaletteEntry>();
result.add(PaletteEntry.MANUAL_TASK);
result.add(PaletteEntry.SCRIPT_TASK);
return result;
}
}

125

publicclass MyPaletteCustomizer extends AbstractDefaultPaletteCustomizer {


/*
* (non-Javadoc)
*
* @see org.activiti.designer.integration.palette.DefaultPaletteCustomizer#disablePaletteEntries()
*/
@Override
public List<PaletteEntry> disablePaletteEntries() {
List<PaletteEntry> result = new ArrayList<PaletteEntry>();
result.add(PaletteEntry.ALL);
return result;
}
}

126

11.5.2
Activiti Designer Eclipse

Activiti Designer BPMN


CustomServiceTasks
Activiti Designer
Activiti Designer Eclipse
BPMN 2.0 BPMN 2.0 Activiti Designer

ProcessValidator ExportMarshaller CustomSerivceTask


ProcessValidator ExportMarshller
Activiti Designer
ProcessValidator ExportMarshaller
API Eclipse Eclipse Eclipse
PDE
Eclipse Eclipse
Activiti Designer

ProcessValidators ExportMarshallers AbstractDiagramWorker


Eclipse problems
127

AbstractDiagramWorker Resources InputStreams


clearMarkers() ProcessValidators ExportMarshallers

//
clearMarkers(getResource(diagram.eResource().getURI()));
/
Eclipse
11.5.2.1 ProcessValidator
plugin.xml org.activiti.designer.eclipse.extension.validation.ProcessValidator
AbstractProcessValidator
<?eclipse version="3.6"?>
<plugin>
<extension
point="org.activiti.designer.eclipse.extension.validation.ProcessValidator">
<ProcessValidator
class="org.acme.validation.AcmeProcessValidator">
</ProcessValidator>
</extension>
</plugin>
publicclass AcmeProcessValidator extends AbstractProcessValidator {
}
getValidatorId() ID ExportMarshaller
ExportMarshaller getValidatorName()
getFormatName()
validateDiagram()

final EList<EObject> contents = getResourceForDiagram(diagram).getContents();


for (final EObject object : contents) {
if (object instanceof StartEvent ) {
// StartEvents
}
//
}
addProblemToDiagram()/ addWarningToDiagram()
128

ExportMarshaller
11.5.2.2 ExportMarshaller
plugin.xml org.activiti.designer.eclipse.extension.export.ExportMarshaller
AbstractExportMarshaller

<?eclipse version="3.6"?>
<plugin>
<extensionpoint="org.activiti.designer.eclipse.extension.export.ExportMarshaller">
<ExportMarshallerclass="org.acme.export.AcmeExportMarshaller">
</ExportMarshaller>
</extension>
</plugin>
publicclass AcmeExportMarshaller extends AbstractExportMarshaller {
}
getMarshllerName() getFormatName()

marshallDiagram(Diagram diagram, IProgressMonitor monitor) diagram


BPMN

finalboolean validDiagram = invokeValidator(AcmeConstants.ACME_VALIDATOR_ID, diagram, monitor);


if (!validDiagram) {
addProblemToDiagram(diagram, "Marshalling to " + getFormatName() + " format was skipped because validation of the
diagram failed.", null);
} else {
//
}
false

ProcessValidators ExportMarshallers
saveResource()
ExportMarshaller saveResource()
AbstractDiagramWorker
129

<original-filename>_<my-format-name>.xml Javadocs

privatestaticfinal String FILENAME_PATTERN = ExportMarshaller.PLACEHOLDER_ORIGINAL_FILENAME + ".acme.axml";


...
saveResource(getRelativeURIForDiagram(diagram, FILENAME_PATTERN), bais, this.monitor);

ExportMarshaller.PLACEHOLDER_ORIGINAL_FILENAME
marshallDiagram() getRelativeURIForDiagram()

saveResource() InputStream

130

Activiti Explorer

Activiti Explorer web 3

Cases
Explorer casestasksExplorer
Activiti Explorer

Process

Manage Activiti

12.1

131

12.2

Inbox

My Cases

Queued

Involved

Archived

12.3
Process definition Activiti

12.4
My instances

132

12.5
admin Manager

Database

Deployments

133

deployment bpmn20.xml

Jobs

134

User and Groups

12.6
Explorer
apps/apache-timcat-6.x/webapps/activiti-explorer/WEB-INF/classes/db.properties
Tomcat apps/apache-timcat-6.x/webapps/activiti-explorer/WEB-INF/lib/

135

Activiti

13.1 Cycle
Activiti Cycle camunda fox BPM Cycle web BPM
IT . Activiti Modeler Subversion

Cycle

Cycle Business-IT-Alignment Application Lifecycle Management (ALM)


Cycle camunda camunda fox
13.2 Signavio Activiti Modeler
Signavio BPMN web Google Signavio
core components
wiki How to build Activiti Modeler from Signavio Activiti

136

REST API

<> REST
Activiti REST APIREST API JSON
http://www.json.org
Spring Webscripthttp://www.springsurf.org
REST API REST API

HTTP kermit REST API

API REST API GET POST PUT


DELETE
POST POST HTTP DELETE
DELETE POST
PUT
application/json"multipart/form-data"
REST URL http://localhost:8080/activiti-rest/service/
http://localhost:8080/activiti-rest/service/process-engine
REST API API REST API API

14.1

14.1.1
html enctype=multipart/form-data.bpmn20.xml.bar .zip
json success/failure
success=alertalert(); js alert();failure=alert
"alert('Some error message if any');"deployment

POST /deployment
success={success}&failure={success}&deployment={file}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRepositoryService().createDeployment().name(fi
leName).deploymentBuilder.deploy()

<html>
<scripttype="text/javascript">
alert();
137

</script>
</html>

14.1.2
idnamedeploymentTime

GET /deployments?start={start=0}&size={size=10}&sort={sort=id}&order={order=asc}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRepositoryService().createDeploymentQuery().li
stPage()

{
"data": [
{
"id": "10",
"name": "activiti-examples.bar",
"deploymentTime": "2010-10-13T14:54:26.750+02:00"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}

14.1.3
/deployment/10/resource/org/activiti/examples/bpmn/usertask/FinancialReportProcess.bpmn20.xml

GET /deployment/{deploymentId}/resource/{resourceName}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRepositoryService().getResourceAsStream(deplo
ymentId, resourceName)

.bpmn20.xml

14.1.4

DELETE /deployment/{deploymentId}?cascade={cascade?}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRepositoryService().deleteDeployment(deploym
138

entId)

{
"success": true
}

14.1.5

POST /deployments?cascade={cascade?}
{
"deploymentIds": [ "10", "11" ]
}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRepositoryService().deleteDeployment(deploym
entId)

{
"success": true
}

14.2

14.2.1
exception

GET /process-engine

APIProcessEngines.getProcessEngine(configuredProcessEngineName)

{
"name": "default",
"resourceUrl": "jar:file:\//<path-to-deployment>\/activiti-cfg.jar!\/activiti.properties",
"exception": null,
"version": "5.8"
}

139

14.3

14.3.1
idnameversiondeploymentTimeBPMN2.0 XML
resourceNamedeploymentId REST API
startFormResourceKey
REST API

GET /process-definitions?start={start=0}&size={size=10}&sort={sort=id}&order={order=asc}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getProcessService().createProcessDefinitionQuery()
.listPage()

{
"data": [
{
"id": "financialReport:1",
"key": "financialReport",
"version": 1,
"name": "Monthly financial report",
"resourceName": "org/activiti/examples/bpmn/usertask/FinancialReportProcess.bpmn20.xml",
"deploymentId": "10",
"startFormResourceKey": null
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}

14.3.2

GET /process-definition/{processDefinitionId}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getProcessService().createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId)

{
"id": "financialReport:1",
"key": "financialReport",
140

"version": 1,
"name": "Monthly financial report",
"resourceName": "org/activiti/examples/bpmn/usertask/FinancialReportProcess.bpmn20.xml",
"deploymentId": "10",
"startFormResourceKey": null
}

14.3.3

GET /process-definition/{processDefinitionId}/form[?format=html|json]

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().getRenderedStartFormById(proces
sDefinitionId)

<user-defined-response>

14.3.4
body
processDefinitionId
numberOfDays_typeInteger
2numberOfDays
numberOfDays_requiredtrue
Boolean
truetrue

123 123
_

HTML HTML
JSON
HTML

Activiti

POST /process-instance
{
"processDefinitionId":"financialReport:1:1700",
"businessKey":"order-4711"
}
141

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getRuntimeService().startProcessInstanceById(proc
essDefinitionId[, businessKey][, variables])

{
"id": "217",
"processDefinitionId": "financialReport:1:1700",
"activityNames": ["writeReportTask"],
"ended": true
}

processDefinitionKey Id POST /process-instance


{
"processDefinitionKey":"financialReport:1",
"businessKey":"order-4711"
}

14.3.5
idstartTimebusinessKeyprocessDefinition
processDefinitionIdbusinessKey

GET
/process-instances?start={start=0}&size={size=10}&sort={sort=id}&order={order=asc}&businessKey={businessKey}&pr
ocessDefinitionId={processDefinitionId}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getHistoryService().createHistoricProcessInstanceQ
uery().xxx.listPages()

{
"data": [
{
"id": 2,
"processDefinitionId": "financialReport:1",
"businessKey": 55,
"startTime": "12-03-2011",
"startUserId": "kermit"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}
142

14.3.6
png DI 404.

GET /processInstance/{processInstanceId}/diagram

APIProcessDiagramGenerator.generateDiagram(pde, "png",
getRuntimeService().getActiveActivityIds(processInstanceId));

png

14.4

14.4.1

GET /tasks-summary?user={userId}

API

ProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().createTaskQuery().xxx().coun
t()

{
"assigned": {
"total": 0
},
"unassigned": {
"total": 1,
"groups":
{
"accountancy": 1,
"sales": 0,
"engineering": 0,
"management": 0
}
}
}

14.4.2
"id", "name", "description", "priority", "assignee", "executionId""processInstanceId"

143

"formResourceKey"
REST API

GET
/tasks?[assignee={userId}|candidate={userId}|candidate-group={groupId}]&start={start=0}&size={size=10}&sort={sort
=id}&order={order=asc}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().createTaskQuery().xxx().listPage()

{
"data": [
{
"id": 127,
"name": "Handle vacation request",
"description": "Vacation request by Kermit",
"priority": 50,
"assignee": null,
"executionId": 118,
"formResourceKey": "org/activiti/examples/taskforms/approve.form"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}

14.4.3
id

GET /task/{taskId}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().createTaskQuery().taskId(taskId).si
ngleResult()

{
"id": 127,
"name": "Handle vacation request",
"description": "Vacation request by Kermit",
"priority": 50,
"assignee": null,
"executionId": 118,
"formResourceKey": "org/activiti/examples/taskforms/approve.form"
144

14.4.4

GET /task/{taskId}/form

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().getRenderedTaskForm(taskId)

<user-defined-response>

14.4.5

PUT /task/{taskId}/[claim|complete]
{}

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getTaskService().xxx(taskId ...)

{
"success": true
}

14.4.6

GET /form/{taskId}/properties

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getFormService().getTaskFormData(taskId).getForm
Properties()

{
"data": [
{
"id": "userName",
"name": "User",
"value": "foobar",
"type": "string",
"required": "true",
"readable": "true",
"writable": "true"
}
145

]
}

14.5

14.5.1
403 200

POST /login
{
"userId": "kermit",
"password": "kermit"
}

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getIdentityService().checkPassword(userId,
password)

{
"success": true
}

14.5.2

GET /user/{userId}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getIdentityService().createUserQuery().userId(userI
d).singleResult();

{
"id": "kermit",
"firstName": "Kermit",
"lastName": "the Frog",
"email": "kermit@server.com"
}

14.5.3
"id", "name""type"type

GET
/user/{userId}/groups[?type=groupType]?start={start=0}&size={size=10}&sort={sort=id}&order={order=asc}
146

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getIdentityService().xxx(userId[, groupType])

{
data: [
{
"id": "admin",
"name": "System administrator",
"type": "security-role"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}

14.5.4

GET /group/{groupId}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getIdentityService().createGroupQuery().groupId(gr
oupId).singleResult();

{
"id": "admin",
"name": "System administrator",
"type": "security-role"
}

14.5.5
"id", "firstName", "lastName""email"

GET /groups/{groupId}/users

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getIdentityService().createUserQuery().memberOfG
roup(groupId).list()

{
data: [
{
"id": "kermit",
147

"firstName": "Kermit",
"lastName": "the Frog",
"email": "kermit@server.com"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
}

14.6

14.6.1
"id", "process-instance-id", "execution-id", "due-date", "retries" id
id

GET
/management/jobs?process-instance={processInstanceId?}&with-retries-left={withRetriesLeft=false}&executable={axe
cutable=false}&only-timers={onlyTimers=false}&only-messages={onlyMessage=false}&duedate-lt={iso8601Date}&due
date-ltoe={iso8601Date}&duedate-ht={iso8601Date}&duedate-htoe={iso8601Date}&start={start=0}&size={size=10}&s
ort={sort=id}&order={order=asc}

APIProcessEngines.getProcessEngine(configuredProcessEngineName).createJobQuery().xxx().listPage()

{
"data": [
{
"id": "212",
"executionId": "211",
"retries": -1,
"processInstanceId": "210",
"dueDate": null,
"assignee": null,
"exceptionMessage": "Can\'t find scripting engine for \'groovy\'"
}
],
"total": 1,
"start": 0,
"sort": "id",
"order": "asc",
"size": 1
148

14.6.2

GET /management/job({jobId}

APIProcessEngines.getProcessEngine(configuredProcessEngineName).createJobQuery().id(jobId).singleResult()

{
"id": "212",
"executionId": "211",
"retries": -1,
"processInstanceId": "210",
"dueDate": null,
"assignee": null,
"exceptionMessage": "Can\'t find scripting engine for \'groovy\'",
"stacktrace": "org.activiti.engine.ActivitiException: Can't find scripting engine for 'groovy'\n\tat ..."
}

14.6.3

PUT /management/job/{jobId}/execute

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getManagementService().executeJob(jobId)

{
"success": true
}

14.6.4

POST /management/jobs/execute
{
"jobIds": [ "212" ]
}

API

ProcessEngines.getProcessEngine(configuredProcessEngineName).getManagementService().executeJob(jobId)

{
149

"success": true
}

14.6.5

GET /management/tables

APIProcessEngines.getProcessEngine(configuredProcessEngineName).getManagementService().getTableCount()

{
"data": [
{
"tableName": "ACT_GE_PROPERTY",
"noOfResults": 2
}
]
}

14.6.6

GET /management/table/{tableName}

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getManagementService().getTableMetaData(tableN
ame))

{
"tableName": "ACT_GE_PROPERTY",
"columnNames": ["REV_","NAME_","VALUE_"],
"columnNames": ["class java.lang.Integer", "class java.lang.String", "class java.lang.String"]
}

14.6.7

GET /management/table/{tableName}/data

API
ProcessEngines.getProcessEngine(configuredProcessEngineName).getManagementService().createTablePageQuery().t
ableName(tableName).start(start).size(size).orderXXX(sort).singleResult();

{
150

"data": [
{
"NAME_": "schema.version",
"REV_": "1",
"VALUE_": "5.4"
},
{
"NAME_": "next.dbid",
"REV_": "4",
"VALUE_": "310"
}
],
"total": 2,
"start": 0,
"sort": "NAME_",
"order": "asc",
"size": 2
}
REST <>

151

Cdi

Activiti-cdi Activiti cdi Activiti-cdi

@BusinessProcessScoped beansCdi beans

Cdi beans EJBs EI

Activiti cdi

Java EE Java SE Spring

Activiti-cdi Activiti <> Activiti-cdi maven maven

<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-cdi</artifactId>
<version>5.x</version>
</dependency>
x Activiti >=5.6 Activiti Spring
15.1 activiti-cdi
Activiti cdi
15.1.1
Cdi ProcessEngine org.activiti.cdi.impl.ProcessEngineLookup
Cdi @Alternative beans.xml

org.activiti.cdi.impl.LocalProcessEngineLookup ProcessEngines ProcessEngine


ProcessEngines.NAME_DEFAULT ProcessEngine
ProcessEngine activiti.cfg.xml

org.activiti.cdi.impl.JndiProcessEngineLookup InitialContext Jndi ProcessEngine


"activiti/default" ProcessEngine jndi

org.activiti.cdi.test.ProcessEngineLookupForTestsuite
ProcessEngine Cdi beans

"beans.xml" LocalProcessEngineLookup
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>org.activiti.cdi.impl.LocalProcessEngineLookup</class>
</alternatives>
152

</beans>

15.1.2
ProcessEngine LocalProcessEngineLookup
Spring activiti.cfg.xml
Activiti ProcessEngineConfiguration Activiti-cdi
Spring Cdi
ProcessEngineConfiguration

org.activiti.cdi.CdiJtaProcessEngineConfigurationActiviti JtaProcessEngineConfiguration Activiti


Jta

org.activiti.cdi.CdiStandaloneProcessEngineConfigurationActiviti StandaloneProcessEngineConfiguration
activiti Jdbc

activiti.cfg.xml Jta Jboss


<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- JTA -->
<beanid="transactionManager"class="org.springframework.jndi.JndiObjectFactoryBean">
<propertyname="jndiName"value="java:/TransactionManager"></property>
<propertyname="resourceRef"value="true"/>
</bean>
<!-- -->
<beanid="processEngineConfiguration"class="org.activiti.cdi.CdiJtaProcessEngineConfiguration">
<!-- lookup the default Jboss datasource -->
<propertyname="dataSourceJndiName"value="java:/DefaultDS"/>
<propertyname="databaseType"value="h2"/>
<propertyname="transactionManager"ref="transactionManager"/>
<!-- using externally managed transactions -->
<propertyname="transactionsExternallyManaged"value="true"/>
<propertyname="databaseSchemaUpdate"value="true"/>
</bean>
</beans>

"spring-context"
Java SE
"CdiStandaloneProcessEngineConfiguration""StandaloneProcessEngineConfiguration"
153

15.1.3
Activiti api(RepositoryService)Activiti-cdi processes.xml

<?xml version="1.0"encoding="utf-8"?>
<!-- -->
<processes>
<processresource="diagrams/myProcess.bpmn20.xml"/>
<processresource="diagrams/myOtherProcess.bpmn20.xml"/>
</processes>

15.2 Cdi
Activiti cdi bpmn
Activiti-cdi
cdi

15.2.1
@BusinessProcessScoped beans Activiti cdi
Activiti-cdi org.activiti.cdi.BusinessProcess bean

startProcessBy*(...) Activiti RuntimeService

resumeProcessById(String processInstanceId) id

resumeTaskById(String taskId) id

completeTask()/
Activiti
BusinessProcess bean @Named bean Jsf
Jsf2 id
pageName.jsf?processId=XX
<f:viewParamname="processId"/>
<f:eventtype="preRenderView"listener="#{javax.enterprise.context.conversation.begin()}"/>
<f:eventtype="preRenderView"listener="#{businessProcess.resumeProcessById(processId)}"/>

154

15.2.2
Activiti-cdi @org.activiti.cdi.annotation.StartProcess key
name

@StartProcess("authorizeBusinessTripRequest")
public String submitRequest(BusinessTripRequest request) {
//
return"success";
}
Activiti
@org.activiti.cdi.annotation.CompleteTask
@CompleteTask(endConversation = false)
public String authorizeBusinessTrip() {
//
return"success";
}
@CompleteTask Activiti

15.2.3 Bean
Activiti-cdi Activiti EI cdi beans bean
<userTaskid="authorizeBusinessTrip"name="Authorize Business Trip"
activiti:assignee="#{authorizingManager.account.username}"/>
"authorizingManager"
@Inject @ProcessVariable Object businessTripRequesterUsername;
@Produces
@Named
public Employee authorizingManager() {
TypedQuery<Employee> query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.account.username='"
+ businessTripRequesterUsername + "'", Employee.class);
Employee employee = query.getSingleResult();
return employee.getManager();
}
activiti:expression="myEjb.method()" EJB MyEjb
@Named
155

15.2.4 @BusinessProcessScoped bean


Activiti-cdibean
BusinessProcessContextBusinessProcessScoped beans BusinessProcessScoped
beans bean
@Named
@BusinessProcessScoped
publicclass BusinessTripRequest implements Serializable {
privatestaticfinallongserialVersionUID = 1L;
private String startDate;
private String endDate;
// ...
}
beans
BusinessProcessScoped beans

bean
15.2.5
Activiti-cdi

@BusinessProcessScoped bean @Inject []

@ProcessVariable(name?)
@Inject @ProcessVariable Object accountNumber;
@Inject @ProcessVariable("accountNumber") Object account

EL

@Named @BusinessProcessScoped beans

ProcessVariables bean
#{processVariables.get('variableName')}

15.2.6
Activiti cdi cdi cdi Activiti

<propertyname="customPostBPMNParseListeners">
<list>
<beanclass="org.activiti.cdi.impl.event.CdiEventSupportBpmnParseListener"/>
</list>
</property>

156

Activiti cdi cdi beans cdi


@Observes
org.activiti.cdi.BusinessProcessEvent
publicvoid onProcessEvent(@Observes BusinessProcessEvent businessProcessEvent) {
//
}

@BusinessProcess@Observes @BusinessProcess("billingProcess")
BusinessProcessEvent evt

@StartActivity@Observes @StartActivity("shipGoods") BusinessProcessEvent


evt id "shipGoods"

@EndActivity@Observes @EndActivity("shipGoods") BusinessProcessEvent


evt id "shipGoods"

@TakeTransition

"shipmentProcess""shipGoods"

publicvoid beforeShippingGoods(
@Observes @BusinessProcess("shippingProcess") @EndActivity("shipGoods") BusinessProcessEvent evt) {
//
}
cdi JavaEE/EJB

publicvoid onShipmentSuceeded(
@Observes(during = TransactionPhase.AFTER_SUCCESS) @BusinessProcess("shippingProcess")
@EndActivity("shipGoods") BusinessProcessEvent evt) {
//
}

15.2.7

ProcessEngine @Inject ProcessEngine, RepositoryService, TaskService, ...

@Inject ProcessInstance, Task,

key @Inject @BusinessKey String businessKey,

id @Inject @ProcessInstanceId String pid,

15.3
Activiti-cdi org.activiti.cdi.test.CdiActivitiTestCase PluggableActivitiTestCase
157

Weld SE maven Activiti-cdi

maven Weld-SE test <dependencies ... /> javaee-api

src/test/resources/META-INF
beans.xml
ProcessEngineLookupForTestsuite alternative
bean
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>org.activiti.cdi.test.ProcessEngineLookupForTestsuite</class>
</alternatives>
</beans>

cdi Activiti
publicclass BusinessProcessBeanTest extends CdiActivitiTestCase {
@Deployment
publicvoid test() throws Exception {
// ...
}
}
beans getBeanInstance(Class clazz) getBeanInstance(String name)
begin/endRequest() begin/endConversation()/
15.4
Activiti-cdi <>

Activiti cdi Java SE Java EE

EL cdi

Activiti cdi SPI


Weld

158

ant
1.

ant demo.start

2.

ant cfg.create build.properties


setup/build/activiti-cfg activiti-cfg.jar

3.

ant demo.stop

4.

ant demo.stop demo.clean demo.start

5.

ant demo.clean demo.start

6.

ant inflate.examples

7.

ant h2.console.start H2 web

8.

ant.cfg.creata setup build.*.properties

ant

159

160

1.

161

Activiti 5.4 5.4


5.8
Activiti

http://blog.163.com/java_123@yeah/

2012 4 9

162

You might also like