рдПрдХреНрдЯрд┐рд╡рд┐рдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЬрд╛рд╡рд╛) - рдПрдХреНрд╕рдПрдордПрд▓ рдЯрд╛рд╕реНрдХ рдлреНрд▓реЛ (рдмреАрдкреАрдПрдо) рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рд╡рд┐рд╡рд░рдгред рдпрд╣рд╛рдВ рдореИрдВ рдореВрд▓ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рд░рд▓ рд╡реНрдпрд╛рдкрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рдПрдХреНрдЯрд┐рд╡рд┐рдЯрд┐рдЯреА рдХреА рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдкреНрд░рд╡рд╛рд╣ рдФрд░ рд╢рд╛рдЦрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд╕реНрдкрд░ рдЬреБрдбрд╝реЗ рд╕рднреА рдХрд╛рд░реНрдп рд╣реИрдВред
рдореИрдВ рдРрд╕реЗ рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЫреВрдКрдВрдЧрд╛:
- - рдЕрдкрдиреЗ рд╢реБрджреНрдзрддрдо рд░реВрдк рдореЗрдВ рд╕рдХреНрд░рд┐рдпрддрд╛
- - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рд░реЛрд▓реНрд╕
- - рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
- - рдЕрдиреНрдп рдПрдкреАрдЖрдИ
- - рдиреМрдХрд░реА рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐
рдлреНрд▓реЛ рдХрд╛ рдореВрд╡рдореЗрдВрдЯ рдЯрд╛рд╕реНрдХ рд╕реЗ рдЯрд╛рд╕реНрдХ рддрдХ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрдк рдХреЛ рдЗрдирдкреБрдЯ рдФрд░ рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рднреА рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдПрдХреНрд╢рди рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрд╣рд╛рдВ, рдХреНрдпрд╛ рд▓реЗрдирд╛ рд╣реИ, рдореИрдВ рдиреАрдЪреЗ рдЗрдВрдЧрд┐рдд рдХрд░реВрдВрдЧрд╛ред рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ - рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЦрди рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдиреАрдЪреЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд░реЗрдЦ рд╣реИред

рдпрд╣ рд╕рдм рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдЖрдИрдбреА, рдирд╛рдо рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред

рдпрд╣ рд╣реИ:
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд, рджреЛ рдХрд╛рд░реНрдп "рд╡рд┐рдХрд╕рд┐рдд" рдФрд░ "рдЯреЗрд╕реНрдЯ", рдПрдХ рд╢рд╛рдЦрд╛ (рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░) рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдВрддред рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрддрд╛ рд╣реИ:
- рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдмреАрдкреАрдПрдо рд╡рд┐рд╡рд░рдг
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
- рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж, рд╣рдо рддреБрд░рдВрдд рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдп рдореЗрдВ рдЖрддреЗ рд╣реИрдВ
- рдбреЗрд╡рд▓рдк рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд▓реМрдЯ рдЖрддреА рд╣реИред
рдПрдХреНрдЯреАрд╡рд┐рдЯреА рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ
рдпрд╣рд╛рдБ рдореБрдЦреНрдп рд╣реИрдВ:
- рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реЗрд╡рд╛: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ
- RuntimeService: рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
- рдХрд╛рд░реНрдп рд╕реЗрд╡рд╛: рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
- рдлрд╝реЙрд░реНрдо рд╕реЗрд╡рд╛: рдХрд╛рд░реНрдп рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ
- рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗрд╡рд╛: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрддрд┐рд╣рд╛рд╕ рддрдХ рдкрд╣реБрдБрдЪ
- IdentityService: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рднреВрдорд┐рдХрд╛рдПрдБ
рдЕрдкрдиреЗ рд╢реБрджреНрдзрддрдо рд░реВрдк рдореЗрдВ рд╕рдХреНрд░рд┐рдпрддрд╛
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ - Activiti.cfg.xmlред
рдЗрд╕рд╕реЗ
ProcessEngineConfiguration cfg = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml");
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Activiti рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ H2 рдореЗрдореЛрд░реА рдореЗрдВ рд╣реА рддреИрдирд╛рдд рдХрд░реЗрдЧрд╛, рдпрд╣ рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдкреНрд░рд┐рдп рдУрд░реЗрдХрд▓ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ
activiti.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="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"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="jdbcDriver" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUsername" value="BPM" /> <property name="jdbcPassword" value="1" /> <property name="databaseSchemaUpdate" value="false" /> <property name="asyncExecutorActivate" value="false" /> <property name="mailServerPort" value="5025" /> </bean> </beans>
рд╣рдо "рдЧреБрдг рдирд╛рдо = jdbc *" рдореЗрдВ рдорд╛рди рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛

рдкреЛрдо <?xml version="1.0" encoding="UTF-8"?> <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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>DemoActiviti</groupId> <artifactId>DemoActiviti</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.activiti</groupId> <version>6.0.0</version> <artifactId>activiti-spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.DemoActiviti</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
рдкреАрдУрдПрдо рдореЗрдВ рдкреНрд▓рдЧрдЗрди "рдорд╛рд╡реЗрди-рдЕрд╕реЗрдВрдмрд▓реА-рдкреНрд▓рдЧрдЗрди" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ рдПрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ (рдЬрд╛рд░) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд░рди -
java -jar DemoActiviti-1.0-SNAPSHOT-jar-with-dependencies.jar
Oracle рдХреЗ рд▓рд┐рдП jdbc рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдорд╛рд╡реЗрди рднрдВрдбрд╛рд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
mvn install:install-file -Dfile={Path/to/your/ojdbc6.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar
log4j log4j.rootLogger=WARN, ACT log4j.appender.ACT=org.apache.log4j.ConsoleAppender log4j.appender.ACT.layout=org.apache.log4j.PatternLayout log4j.appender.ACT.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо 4 рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдмреАрдкреАрдПрдо рд▓реЛрдбрд┐рдВрдЧ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рд░рдВрдн, рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдгред рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдЧрд╛: рдкрд░рд┐рдирд┐рдпреЛрдЬрди, рдкреНрд░рд╛рд░рдВрдн, рд╡рд┐рдХрд╛рд╕, рдкрд░реАрдХреНрд╖рдгред
рд╣рдо рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрддреЗ рд╣реИрдВ
activiti-рдорд┐рд▓-рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░ \ Activiti-6.0.0 \ Activiti-6.0.0 \ database \ create - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реИ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рд░реЛрд▓реНрд╕
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рднреВрдорд┐рдХрд╛рдПрдБ рддреИрдпрд╛рд░ рдХрд░реЗрдВ:
рдкрд╣рдЪрд╛рди public class DemoActiviti { private static final String DEV_PROCESS = "devProcess"; public static void main(String[] args) { Locale.setDefault(Locale.ENGLISH); ProcessEngineConfiguration cfg = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = cfg.buildProcessEngine(); createIdentity(processEngine, "programmer", "programmers"); createIdentity(processEngine, "tester", "testers"); } public static void createIdentity(ProcessEngine processEngine, String userName, String userGroup) { IdentityService identityService = processEngine.getIdentityService(); String userId = userName + "Id"; if (identityService.createUserQuery().userId(userId).count() == 0) { User user = identityService.newUser(userName); user.setId(userId); user.setEmail(userName + "@gmail.com"); identityService.saveUser(user); System.out.println("user created success fully"); } String groupId = userGroup + "Id"; if (identityService.createGroupQuery().groupId(groupId).count() == 0) { Group group = identityService.newGroup(userGroup); group.setName(userGroup); group.setId(groupId); identityService.saveGroup(group); System.out.println("group created success fully"); } if (identityService.createGroupQuery().groupId(groupId).list().size() > 0) { identityService.createMembership(userId, groupId); System.out.println("user to group success fully"); } } }
рдХреНрд░рдорд╢рдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рдореВрд╣, рдбреЗрд╡рд▓рдкрд░ рдФрд░ рдкрд░реАрдХреНрд╖рдХ рдмрдирд╛рдПрдВред
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рд╣реЛрддреЗ рд╣реИрдВ
ACT_RE_ *: рд░рд┐рдкреЙрдЬрд┐рдЯрд░реАред
ACT_RU_ *: рд░рдирдЯрд╛рдЗрдоред
ACT_ID_ *: рдкрд╣рдЪрд╛рдиред
ACT_HI _ *: рдЗрддрд┐рд╣рд╛рд╕
рдФрд░ рдЖрдЧреЗ
рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдореВрд╣реЛрдВ (рдХреИрдВрдбрд┐рдбреЗрдЯрдЧреНрд░реБрдк) рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдореВрд╣ рдХреЛ рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдп - рдкреНрд░реЛрдЧреНрд░рд╛рдорд░

рдФрд░ рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ "MyProcess.bpmn" рдореЗрдВ рд╣реЛрддреА рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ
рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрдорд╛рдВрдб рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ
java -jar DemoActiviti-1.0-SNAPSHOT-jar-with-dependencies.jar deploy
рдЕрдЧрд▓рд╛, рдкреНрд░рд╛рд░рдВрдн рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
java -jar DemoActiviti-1.0-SNAPSHOT-jar-with-dependencies.jar start
рдбреЗрд▓рдкреЙрдп рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред
рдХреЛрд╖

рд░рдирдЯрд╛рдЗрдо рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╣реИ

рдЬрд┐рд╕реЗ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ

рдХреЛрдб рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдкреВрд░реНрдг рдХреЛрдб рдиреАрдЪреЗ рд╣реЛрдЧрд╛):
рддреИрдирд╛рддреА deployment = repositoryService.createDeployment() .addClasspathResource("processes/MyProcess.bpmn").deploy()
рдкреНрд░рд╛рд░рдВрдн ProcessInstance myProcess = runtimeService.startProcessInstanceByKey(DEV_PROCESS);
рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
java -jar DemoActiviti-1.0-SNAPSHOT-jar-with-dependencies.jar develop
// tasks = taskService.createTaskQuery().taskCandidateGroup("programmers").list();
рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдп рдореЗрдВ, рдПрдХ "рд╕рдорд╕реНрдпрд╛" рдЪрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

FormService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рд░реНрдп рдЪрд▓рддрд╛ рд╣реИ
for (Task task : tasks) { System.out.println("Task:" + task.getTaskDefinitionKey() + ", id=" + task.getId()); FormData formData = formService.getTaskFormData(task.getId()); Map<String, Object> variables = new HashMap<String, Object>();

рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЪрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрдк рдХрд╛рд░реНрдп, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд░ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рдХрд╕рд┐рдд рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕ рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреА, рд░рд╛рдЬреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд▓реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
tasks = taskService.createTaskQuery().taskCandidateGroup("...").list();
рдЪрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
Map<String, Object> variables = new HashMap<String, Object>(); ... variables.put("var_1", value);
рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрди
taskService.complete(task.getId(), variables);
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрдд рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstance.getId()).singleResult(); if (processInstance != null && !processInstance.isEnded())
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЪрд░ "devResult" рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ - рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рдгрд╛рдо (рдпрд╣ рдХрд╛рдлреА рд╕рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрд░рд┐рдгрд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ), рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдУрдХреЗ) рдпрд╛ рд╡рд┐рдХрд╛рд╕ рдлрд┐рд░ рд╕реЗ (рдирд╣реАрдВ), рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрд░реЗрдЦ рджреЗрдЦреЗрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рдХрд╛рд╕, рдЖрджрд┐ред рдпрджрд┐ рдЖрдк рдЕрдм рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП - рдирд╣реАрдВред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб package com.example; import org.activiti.engine.*; import org.activiti.engine.form.FormData; import org.activiti.engine.form.FormProperty; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.apache.commons.lang3.StringUtils; import java.util.*; public class DemoActiviti { private static final String DEV_PROCESS = "devProcess"; public static void main(String[] args) { Locale.setDefault(Locale.ENGLISH); ProcessEngineConfiguration cfg = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = cfg.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); String mode = StringUtils.EMPTY; if (args.length > 0) { mode = args[0]; } System.out.println("Processes mode: " + mode); Deployment deployment; if ("deploy".equals(mode)) { deployment = repositoryService.createDeployment() .addClasspathResource("processes/MyProcess.bpmn").deploy(); System.out.println("deploy process success"); System.exit(0); } else { List<Deployment> myProcesses = repositoryService.createDeploymentQuery() .processDefinitionKey(DEV_PROCESS).list(); deployment = myProcesses.get(myProcesses.size()-1); System.out.println("get process success:" + deployment.getId()); }
рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
рд╣рдо рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдкреАрдУрдПрдо рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ
рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдХреЗ рд╕рд╛рде рдкреЛрдо <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.1.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <version>6.0.0</version> <artifactId>activiti-spring-boot-starter-integration</artifactId> </dependency> ....
DemoActiviti рд╡рд░реНрдЧ рдЕрдм рдРрд╕рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
DemoActiviti - рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдПрдкрд┐рд▓реЗрд╢рди @SpringBootApplication @ImportResource("classpath:activiti.cfg.xml") public class DemoActiviti { public static void main(String[] args) { Locale.setDefault(Locale.ENGLISH); SpringApplication.run(DemoActiviti.class, args); } }
рдореИрдВ рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдЬрдм рд╕реЗрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ xml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (@ImportResource ("classpath: activiti.cfg.xml")) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
activiti.cfg.xml - рд╡рд╕рдВрдд <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="username" value="BPM" /> <property name="password" value="1" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="asyncExecutorActivate" value="false" /> </bean> </beans>
рдЕрдм рд╡рд╕рдВрдд рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЗрд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"
рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝реЗрдВ
рдкрд╛рд░реНрдЯрд┐рд╢рди рдореМрдЬреВрдж @Component public class CommandLine implements CommandLineRunner { @Autowired private DemoService demoService; public void run(String... args) { if ("test".equals(args[0])) { demoService.startTest(); } else if ("develop".equals(args[0])) { demoService.startDevelop(); } } }
рдЬреЛ рдЙрди рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдореИрдВ рджреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛: рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рдХрд╛рд╕ред рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдЬреЛрдбрд╝реЗрдВ
DemoService @Service public class DemoService { @Autowired private TaskService taskService; @Autowired private FormService formService; public void startTest() { List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("testers").list(); if (tasks.isEmpty()) { System.out.println(" "); return; } processTasks(tasks); } public void startDevelop() { List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("develop").list(); if (tasks.isEmpty()) { System.out.println(" "); return; } processTasks(tasks); } private void processTasks(List<Task> tasks) { Scanner scanner = new Scanner(System.in); for (Task task : tasks) { ...... , }
рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдШрдЯрдХ рдСрдЯреЛрд╡рд╛рдпрд░ рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдбреЗрдореЛ рд╕рд░реНрд╡рд┐рд╕ рд╕реЗрд╡рд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдХреНрдЯреАрд╡рд┐рдЯреА рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ
@Autowired private TaskService taskService;
рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдЪрд▓рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рд╡реЗрдм рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ REST API рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
рдЕрдиреНрдп рдПрдкреАрдЖрдИ
рд╕реНрдкреНрд░рд┐рдВрдЧрдмреВрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдЯреЙрдордХреИрдЯ рд╕рд░реНрд╡рд░ рдФрд░ рдлрд┐рд░ рдПрдХ рддрдХрдиреАрдХреА рдорд╛рдорд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
рдкреАрдУрдПрдо рдореЗрдВ, рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рд╡рд╕рдВрдд рд╡реЗрдм рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
рд╣рдо рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдШрдЯрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдЕрдм рд╕рдм рдХреБрдЫ рдпреВрдЖрд░рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдЪрдЯреАрдЯреАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдПрдЧрд╛ред RestController рдЬреЛрдбрд╝реЗрдВ:
RestController @RestController public class DemoRestController { @Autowired private DemoService demoService; @RequestMapping(value="/test", method= RequestMethod.GET, produces= {MediaType.APPLICATION_JSON_VALUE}) public List<String> startTest(@RequestParam String devResult) { List<String> strings = demoService.startTest(devResult); return strings; } @RequestMapping(value="/develop", method= RequestMethod.GET, produces= MediaType.APPLICATION_JSON_VALUE) public List<String> startDevelop(@RequestParam String issue) { List<String> strings = demoService.startDevelop(issue); return strings; } @RequestMapping(value="/start", method= RequestMethod.GET, produces= MediaType.APPLICATION_JSON_VALUE) public List<String> startProcess() { List<String> strings = demoService.startDevProcess(); return strings; } }
рд╣рдо рдЙрд╕реА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдиреЗ рдбреЗрдореЛ рд╕рд░реНрд╡рд┐рд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдСрдЯреЛрд╡реЗрдпрд░ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╣реИред
DemoService @Service public class DemoService { @Autowired private TaskService taskService; @Autowired private FormService formService; @Autowired private RuntimeService runtimeService; public List<String> startTest(String devResult) { List<String> results = new ArrayList<>(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("testers").list(); if (tasks.isEmpty()) { results.add("The tasks for testing are not"); return results; } Object issue = runtimeService.getVariables(tasks.get(0).getProcessInstanceId()).get("issue"); processTasks(tasks, devResult); results.add("Task N " + issue + " - tested, result=" + devResult); return results; } public List<String> startDevelop(String issue) { List<String> results = new ArrayList<>(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("programmers").list(); if (tasks.isEmpty()) { results.add("There are no development tasks"); return results; } processTasks(tasks, issue); Object mIssue = runtimeService.getVariables(tasks.get(0).getProcessInstanceId()).get("issue"); results.add("Task N " + mIssue + " - taken in the develop"); return results; } public List<String> startDevProcess() { List<String> results = new ArrayList<>(); ProcessInstance myProcess = runtimeService.startProcessInstanceByKey("devProcess"); results.add("The process is started #"+myProcess.getId()); return results; } private void processTasks(List<Task> tasks, String param) { for (Task task : tasks) { FormData formData = formService.getTaskFormData(task.getId()); Map<String, Object> variables = new HashMap<>();
рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд░реАрдХреНрд╖рдг, рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рдореИрдВрдиреЗ Application.properties рдореЗрдВ рдЯреЙрдордХреИрдЯ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ 8081 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛
server.port = 8081
рдПрдХреНрдЯрд┐рд╡рд┐рдЯрд┐ рдХреА рдиреМрдХрд░реА
рдПрдХреНрдЯреАрд╡рд┐рдЯреА рдХреЗ рдХрдИ рдбрд┐рдЬрд╛рдЗрди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд╕реВрдЪрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ "рдЯрд┐рдорд░рд╕реНрдЯрд╛рд░реНрдЯрд╡реЗрдВрдЯ" рд╣реИред рдиреМрдХрд░реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
property name="asyncExecutorActivate" value="true"
(
property name="asyncExecutorActivate" value="true"
рджреЗрдЦреЗрдВ), рдлрд┐рд░ java рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд▓реВ рд░рд╣реЗрдЧреА рдФрд░ рд╢реЗрдбреНрдпреВрд▓ рдФрд░ рд░рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреАред
рдореИрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓реМрдЯреВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдПрдХреНрдЯреАрд╡рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╢реБрджреНрдзрддрдо рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
DemoActiviti рд╡рд░реНрдЧ рдореЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рджреЛ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛: рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдФрд░ рдкреНрд░рд╛рд░рдВрдн рдореИрдВ рдПрдХ рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдКрдВрдЧрд╛

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╡рд╣ рдЯрд╛рдЗрдорд░ рдкрд░ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЕрдиреБрд╕реВрдЪреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдбреЗрд╡рд▓рдк" рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред рдЯрд╛рдЗрдорд░ рдХрд╛ рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рд╣реЛрдЧрд╛ - рд╣рд░ 10 рд╕реЗрдХрдВрдб, рдХреНрд░реЛрди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди - "0/10 * * * * *?"ред

рдЖрдЗрдП рдирдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдлрд┐рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ (рд╢реБрд░реВ рдХрд░реЗрдВ)ред рд╕рднреА - рдХрд╛рд░реНрдп рд╣рд░ 10 рд╕реЗрдХрдВрдб рдЪрд▓рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХреНрдЯреАрд╡рд┐рдЯреА рдШрдЯрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - ServiceTask, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдк рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрд▓рд╛рд╕ рдбреЗрдореЛрдбреЗрдЧреЗрдЯ public class DemoDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { Date now = new Date(); execution.setVariable("issue", now.toString()); System.out.println("job start="+now); } }
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ (ACT_RU_TIMER_JOB t рд╕реЗ рдЪрдпрди рдХрд░реЗрдВ) рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдиреМрдХрд░реА рдЧрддрд┐рд╡рд┐рдзрд┐, DUEDATE_ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЕрдЧрд▓реА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдордп рд╣реЛрдЧрд╛ред
рдбреЗрд▓реАрдЧреЗрдЯ рдХрд╛ "рдЕрдВрдХ" рдЪрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
select * from ACT_HI_VARINST t

DemoActiviti c рдЬреЙрдм рдХреЗ рд▓рд┐рдП рдХреЛрдб public class DemoActiviti { private static final String DEV_PROCESS = "devProcessJob"; public static void main(String[] args) { Locale.setDefault(Locale.ENGLISH); ProcessEngineConfiguration cfg = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = cfg.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); String mode = StringUtils.EMPTY; if (args.length > 0) { mode = args[0]; } System.out.println("Processes mode: " + mode); Deployment deployment; if ("deploy".equals(mode)) { deployment = repositoryService.createDeployment() .addClasspathResource("processes/MyProcessJob.bpmn").deploy(); System.out.println("deploy process success"); System.exit(0); } else { List<Deployment> myProcesses = repositoryService.createDeploymentQuery() .processDefinitionKey(DEV_PROCESS).list(); deployment = myProcesses.get(myProcesses.size()-1); System.out.println("get process success:" + deployment.getId()); }
рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рдмрд╛рдХреА рд╣реИ: рдИрд╡реЗрдВрдЯ, рд╢реНрд░реЛрддрд╛, рдЬреЗрдкреАрдП, рдЖрджрд┐, рд╢рд╛рдпрдж рдореИрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖрдКрдВрдЧрд╛ред
рд╕рд╛рдордЧреНрд░реА
activitiрдЧреНрд░рд╣рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдбрд┐рдЬрд╛рдЗрдирд░DevProcess bpmn <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="devProcess" name="Dev process" isExecutable="true"> <startEvent id="startevent1" name="Start" activiti:initiator="programmerId"></startEvent> <userTask id="develop" name="Develop" activiti:candidateGroups="programmers"> <extensionElements> <activiti:formProperty id="issue" name="issue" type="string" required="true"></activiti:formProperty> </extensionElements> </userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="develop"></sequenceFlow> <userTask id="test" name="Test" activiti:candidateGroups="testers"> <extensionElements> <activiti:formProperty id="devResult" name="devResult" type="string" default="No" required="true"></activiti:formProperty> </extensionElements> </userTask> <sequenceFlow id="flow2" sourceRef="develop" targetRef="test"></sequenceFlow> <exclusiveGateway id="gateway" name="Exclusive Gateway" default="flowNo"></exclusiveGateway> <sequenceFlow id="flow3" sourceRef="test" targetRef="gateway"></sequenceFlow> <sequenceFlow id="flowOk" name="Ok" sourceRef="gateway" targetRef="endevent1"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${devResult == "Ok"}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flowNo" name="No" sourceRef="gateway" targetRef="develop"></sequenceFlow> <endEvent id="endevent1" name="End"></endEvent> </process> </definitions>
devProcessJob bpmn <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="devProcessJob" name="Dev process Job" isExecutable="true"> <startEvent id="startevent" name="Start" activiti:initiator="programmerId"></startEvent> <sequenceFlow id="flow1" sourceRef="startevent" targetRef="timerstartevent"></sequenceFlow> <endEvent id="endevent" name="End"></endEvent> <startEvent id="timerstartevent" name="Timer start"> <extensionElements> <activiti:formProperty id="issue" name="issue" type="string"></activiti:formProperty> </extensionElements> <timerEventDefinition> <timeCycle>0/10 * * * * ?</timeCycle> </timerEventDefinition> </startEvent> <sequenceFlow id="flow2" sourceRef="timerstartevent" targetRef="servicetask1"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="servicetask1" targetRef="endevent"></sequenceFlow> <serviceTask id="servicetask1" name="Develop" activiti:class="com.example.DemoDelegate"></serviceTask> </process> </definitions>