- 浏览: 3445816 次
- 性别:
- 来自: 珠海
-
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
第一个JBPM5的人工任务例子:
1.启动任务任务的服务端
2.启动人工任务
3.访问和操作人工任务
说明:源码有两个人工任务,下面的这些代码,是server工程的,client工程包含另一个人工任务。
pom.xml
log4j.properties
# log4jdbc
log4j.logger.jdbc.sqlonly=INFO
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy-MM-dd HH:mm} %5p %c{1}:%L - %m%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.logfile.File=c:/deimos.log
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yy-MM-dd HH:mm} %5p %c{1}:%L - %m%n
log4j.rootLogger=info, stdout, logfile
log4j.logger.com.mosso=debug
log4j.logger.org.springframework.batch=DEBUG
log4j.logger.org.springframework.transaction=INFO
log4j.logger.org.springframework=error
log4j.category.org.springframework.beans.factory=DEBUG
Server:
src/main/resources/org/jbpm/LoadUsers.mvel
src/main/resources/org/jbpm/LoadGroups.mvel
src/main/resources/org/jbpm/jbpm.usergroup.callback.properties
jbpm.usergroup.callback=org.jbpm.task.service.DefaultUserGroupCallbackImpl
src/main/resources/META-INF/persistence.xml
DemoTaskService.java
Client:
src/main/resources/Evaluation.bpmn
启动任务:StartProcess.java
执行任务:TestProcess.java
输出:
@客户端理解服务器[127.0.0.1:9123]
@tony获得任务列表, tony属于第?级节点
-------@>tony 执行
tony 执行 Task Performance Evaluation Self
@休息 2 秒钟
@tony处理完成任务
休息 1 秒钟
@john获得任务列表, john属于第二级节点,PM
-------@>john 执行
john 执行 Task Performance Evaluation PM
@休息 2 秒钟
@john处理完成任务
@mary获得任务列表, mary属于第二级节点,HR
-------@>mary 执行
mary 执行 Task Performance Evaluation HR
@休息 2 秒钟
@mary处理完成......
......Task被处理完成......
1.启动任务任务的服务端
2.启动人工任务
3.访问和操作人工任务
说明:源码有两个人工任务,下面的这些代码,是server工程的,client工程包含另一个人工任务。
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>com</groupId> <artifactId>JBPM5Server</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>JBPM5Server Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.8.2</junit.version> <spring.version>3.0.5.RELEASE</spring.version> <jbpm.version>5.2.0.Final</jbpm.version> <drools.version>5.3.1.Final</drools.version> <slf4j.version>1.6.1</slf4j.version> <mysql.version>5.1.10</mysql.version> <jstl.version>1.1.2</jstl.version> <servlet.version>2.5</servlet.version> <javaee-api.version>6.0</javaee-api.version> <jsp-api.version>2.1</jsp-api.version> <jboss.netty.version>3.2.0.Final</jboss.netty.version> <codehaus.btm.version>2.1.1</codehaus.btm.version> <thoughtworks.xstream.version>1.3.1</thoughtworks.xstream.version> <aspectj.version>1.6.2</aspectj.version> <cglib.version>2.2</cglib.version> <jsp.version>2.0</jsp.version> <log4j.version>1.2.16</log4j.version> </properties> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId> <version>0.2.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>${cglib.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${jstl.version}</version> </dependency> <!-- <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> --> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-human-task</artifactId> <version>${jbpm.version}</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>${jboss.netty.version}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-flow</artifactId> <version>${jbpm.version}</version> </dependency> <dependency> <groupId>org.codehaus.btm</groupId> <artifactId>btm</artifactId> <version>${codehaus.btm.version}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-bpmn2</artifactId> <version>${jbpm.version}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-persistence-jpa</artifactId> <version>${jbpm.version}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-flow-builder</artifactId> <version>${jbpm.version}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-bam</artifactId> <version>${jbpm.version}</version> </dependency> <!-- <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> --> <!-- <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> --> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>${thoughtworks.xstream.version}</version> <type>jar</type> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-asm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <optional>true</optional> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.3</version> <exclusions> <exclusion> <artifactId>maven-cobertura-plugin</artifactId> <groupId>maven-plugins</groupId> </exclusion> <exclusion> <artifactId>maven-findbugs-plugin</artifactId> <groupId>maven-plugins</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> </dependencies> <build> <finalName>JBPM5Server</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.5</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <archive> <manifest> <!--<addClasspath>true</addClasspath> --> </manifest> <manifestEntries> <Built-By>org-builder</Built-By> <Build-Jdk>${java.version}</Build-Jdk> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.20</version> <configuration> <contextPath>/JBPM5Server</contextPath> <!--<webDefaultXml>webdefault.xml</webDefaultXml> --> <scanIntervalSeconds>0</scanIntervalSeconds> <scanTargetPatterns> <scanTargetPattern> <directory>src/main/webapp/WEB-INF</directory> <excludes> <exclude>**/*.jsp</exclude> </excludes> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </scanTargetPattern> </scanTargetPatterns> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.0.2</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> </manifest> <manifestEntries> <Implementation-Build>${buildNumber}</Implementation-Build> </manifestEntries> </archive> <dependentWarExcludes> **/jdbc.properties,**/web.xml,WEB-INF/classes/META-INF/** </dependentWarExcludes> </configuration> </plugin> </plugins> </build> </project>
log4j.properties
# log4jdbc
log4j.logger.jdbc.sqlonly=INFO
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy-MM-dd HH:mm} %5p %c{1}:%L - %m%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.logfile.File=c:/deimos.log
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yy-MM-dd HH:mm} %5p %c{1}:%L - %m%n
log4j.rootLogger=info, stdout, logfile
log4j.logger.com.mosso=debug
log4j.logger.org.springframework.batch=DEBUG
log4j.logger.org.springframework.transaction=INFO
log4j.logger.org.springframework=error
log4j.category.org.springframework.beans.factory=DEBUG
Server:
src/main/resources/org/jbpm/LoadUsers.mvel
users = [ 'darth' : new User('Darth Vader'), 'bobba' : new User( 'Bobba Fet'), 'jabba' : new User('Jabba Hutt'), 'dalai' : new User('Dalai Lama'), 'christoper' : new User('Christoper Columbus'), 'stuart' : new User('Stuart Little'), 'jane' : new User('Jane Austin'), 'peter' : new User('Peter Parker'), 'steve' : new User('Steve Rogers'), 'sly' : new User('Sly Stalone'), 'liz' : new User('Elizabeth Windsor'), 'bruce' : new User('Bruce Wayne' ), 'tony' : new User('Tony Stark'), 'luke' : new User('Luke Cage'), 'admin' : new User('Administrator'), 'krisv' : new User('krisv'), 'john' : new User('john'), 'mary' : new User('mary'), 'sales' : new User('sales-rep') ]; return users;
src/main/resources/org/jbpm/LoadGroups.mvel
groups = [ 'knightsTempler' : new Group( "Knights Templer" ), 'crusaders' : new Group( "Crusaders" ), 'HR' : new Group( "HR" ), 'PM' : new Group( "PM" ), 'sales' : new Group( "sales" ) ]; return groups;
src/main/resources/org/jbpm/jbpm.usergroup.callback.properties
jbpm.usergroup.callback=org.jbpm.task.service.DefaultUserGroupCallbackImpl
src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="org.jbpm.task"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <mapping-file>META-INF/Taskorm.xml</mapping-file> <class>org.jbpm.task.Attachment</class> <class>org.jbpm.task.Content</class> <class>org.jbpm.task.BooleanExpression</class> <class>org.jbpm.task.Comment</class> <class>org.jbpm.task.Deadline</class> <class>org.jbpm.task.Comment</class> <class>org.jbpm.task.Deadline</class> <class>org.jbpm.task.Delegation</class> <class>org.jbpm.task.Escalation</class> <class>org.jbpm.task.Group</class> <class>org.jbpm.task.I18NText</class> <class>org.jbpm.task.Notification</class> <class>org.jbpm.task.EmailNotification</class> <class>org.jbpm.task.EmailNotificationHeader</class> <class>org.jbpm.task.PeopleAssignments</class> <class>org.jbpm.task.Reassignment</class> <class>org.jbpm.task.Status</class> <class>org.jbpm.task.Task</class> <class>org.jbpm.task.TaskData</class> <class>org.jbpm.task.SubTasksStrategy</class> <class>org.jbpm.task.OnParentAbortAllSubTasksEndStrategy</class> <class>org.jbpm.task.OnAllSubTasksEndParentEndStrategy</class> <class>org.jbpm.task.User</class> <!-- <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.connection.driver_class" value="org.h2.Driver"/> <property name="hibernate.connection.url" value="jdbc:h2:mem:mydb" /> <property name="hibernate.connection.username" value="sa"/> <property name="hibernate.connection.password" value="sasa"/> <property name="hibernate.connection.autocommit" value="false" /> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="create" /> <property name="hibernate.show_sql" value="false" /> </properties> --> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jbpmtest?createDatabaseIfNotExist=true" /> <property name="hibernate.connection.username" value="root" /> <property name="hibernate.connection.password" value="root" /> <property name="hibernate.connection.autocommit" value="false" /> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="false" /> </properties> </persistence-unit> </persistence>
DemoTaskService.java
package org.jbpm; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.jbpm.task.AccessType; import org.jbpm.task.AllowedToDelegate; import org.jbpm.task.Attachment; import org.jbpm.task.BooleanExpression; import org.jbpm.task.Comment; import org.jbpm.task.Deadline; import org.jbpm.task.Deadlines; import org.jbpm.task.Delegation; import org.jbpm.task.Escalation; import org.jbpm.task.Group; import org.jbpm.task.I18NText; import org.jbpm.task.Notification; import org.jbpm.task.OrganizationalEntity; import org.jbpm.task.PeopleAssignments; import org.jbpm.task.Reassignment; import org.jbpm.task.Status; import org.jbpm.task.Task; import org.jbpm.task.TaskData; import org.jbpm.task.User; import org.jbpm.task.query.TaskSummary; import org.jbpm.task.service.TaskService; import org.jbpm.task.service.TaskServiceSession; import org.jbpm.task.service.UserGroupCallbackManager; import org.jbpm.task.service.mina.MinaTaskServer; import org.drools.SystemEventListenerFactory; import org.mvel2.MVEL; import org.mvel2.ParserContext; import org.mvel2.compiler.ExpressionCompiler; /** * * @author pandy * 第一次运行不能注释掉Line63,72,它会插入数据库, 第二次运行,必须注释掉Line63,72, * */ public class DemoTaskService { @SuppressWarnings("rawtypes") public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.task"); TaskService taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener()); TaskServiceSession taskSession = taskService.createSession(); // Add users Map vars = new HashMap(); InputStream usersin = DemoTaskService.class.getResourceAsStream( "LoadUsers.mvel" ); if(usersin != null) { Reader reader = new InputStreamReader( usersin ); @SuppressWarnings("unchecked") Map<String, User> users = ( Map<String, User> ) eval( reader, vars ); for ( User user : users.values() ) { taskSession.addUser( user );//第二次运行,必须注释,否则提示重复User异常 } } InputStream groupsin = DemoTaskService.class.getResourceAsStream( "LoadGroups.mvel" ); if(groupsin != null) { Reader reader = new InputStreamReader( groupsin ); @SuppressWarnings("unchecked") Map<String, Group> groups = ( Map<String, Group> ) eval( reader, vars ); for ( Group group : groups.values() ) { taskSession.addGroup( group );//第二次运行,必须注释,否则提示重复Group异常 } } // try to get the usergroup callback properties InputStream usergroupsin = DemoTaskService.class.getResourceAsStream( "jbpm.usergroup.callback.properties" ); if(usergroupsin != null) { Reader reader = new InputStreamReader( usergroupsin ); Properties callbackproperties = new Properties(); try { callbackproperties.load(reader); UserGroupCallbackManager.getInstance().setCallbackFromProperties(callbackproperties); System.out.println("@Task service registered usergroup callback ..."); } catch (Exception e) { System.out.println("@Task service unable to register usergroup callback ..."); } } // start server MinaTaskServer server = new MinaTaskServer(taskService); Thread thread = new Thread(server); thread.start(); taskSession.dispose(); System.out.println("@正确启动: Task Server"); System.out.println("@服务已经运行中: Task Service."); } public static Object eval(Reader reader, Map vars) { try { return eval( readerToString( reader ), vars ); } catch ( IOException e ) { throw new RuntimeException( "Exception Thrown", e ); } } public static String readerToString(Reader reader) throws IOException { int charValue = 0; StringBuffer sb = new StringBuffer( 1024 ); while ( (charValue = reader.read()) != -1 ) { //result = result + (char) charValue; sb.append( (char) charValue ); } return sb.toString(); } @SuppressWarnings("deprecation") public static Object eval(String str, Map vars) { ExpressionCompiler compiler = new ExpressionCompiler( str.trim() ); ParserContext context = new ParserContext(); context.addPackageImport( "org.jbpm.task" ); context.addPackageImport( "java.util" ); context.addImport( "AccessType", AccessType.class ); context.addImport( "AllowedToDelegate", AllowedToDelegate.class ); context.addImport( "Attachment", Attachment.class ); context.addImport( "BooleanExpression", BooleanExpression.class ); context.addImport( "Comment", Comment.class ); context.addImport( "Deadline", Deadline.class ); context.addImport( "Deadlines", Deadlines.class ); context.addImport( "Delegation", Delegation.class ); context.addImport( "Escalation", Escalation.class ); context.addImport( "Group", Group.class ); context.addImport( "I18NText", I18NText.class ); context.addImport( "Notification", Notification.class ); context.addImport( "OrganizationalEntity", OrganizationalEntity.class ); context.addImport( "PeopleAssignments", PeopleAssignments.class ); context.addImport( "Reassignment", Reassignment.class ); context.addImport( "Status", Status.class ); context.addImport( "Task", Task.class ); context.addImport( "TaskData", TaskData.class ); context.addImport( "TaskSummary", TaskSummary.class ); context.addImport( "User", User.class ); return MVEL.executeExpression( compiler.compile( context ), vars ); } }
Client:
src/main/resources/Evaluation.bpmn
<?xml version="1.0" encoding="UTF-8"?> <definitions id="Definition" targetNamespace="http://www.jboss.org/drools" typeLanguage="http://www.java.com/javaTypes" expressionLanguage="http://www.mvel.org/2.0" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" xmlns:g="http://www.jboss.org/drools/flow/gpd" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.jboss.org/drools"> <itemDefinition id="_employeeItem" /> <itemDefinition id="_reasonItem" /> <itemDefinition id="_performanceItem" /> <itemDefinition id="_contentItem" /> <itemDefinition id="_2-employeeItem" /> <itemDefinition id="_2-reasonItem" /> <itemDefinition id="_2-performanceItem" /> <itemDefinition id="_2-contentItem" /> <itemDefinition id="_3-employeeItem" /> <itemDefinition id="_3-reasonItem" /> <itemDefinition id="_3-performanceItem" /> <itemDefinition id="_3-contentItem" /> <itemDefinition id="_4-employeeItem" /> <itemDefinition id="_4-reasonItem" /> <itemDefinition id="_4-performanceItem" /> <itemDefinition id="_4-contentItem" /> <process processType="Private" isExecutable="true" id="com.sample.evaluation" name="Evaluation" tns:packageName="defaultPackage" > <!-- process variables --> <property id="employee" itemSubjectRef="_employeeItem"/> <property id="reason" itemSubjectRef="_reasonItem"/> <property id="performance" itemSubjectRef="_performanceItem"/> <property id="content" itemSubjectRef="_contentItem"/> <!-- nodes --> <startEvent id="_1" name="Start" /> <userTask id="_2" name="Self Evaluation" > <extensionElements> <tns:onEntry-script scriptFormat="http://www.java.com/java"> <script>java.util.Map contentParam = new java.util.HashMap(); contentParam.put("reason", reason); kcontext.setVariable("content", contentParam);</script> </tns:onEntry-script> </extensionElements> <ioSpecification> <dataInput id="_2_ContentInput" name="Content" /> <dataInput id="_2_CommentInput" name="Comment" /> <dataInput id="_2_SkippableInput" name="Skippable" /> <dataInput id="_2_TaskNameInput" name="TaskName" /> <dataOutput id="_2_performanceOutput" name="performance" /> <inputSet> <dataInputRefs>_2_ContentInput</dataInputRefs> <dataInputRefs>_2_CommentInput</dataInputRefs> <dataInputRefs>_2_SkippableInput</dataInputRefs> <dataInputRefs>_2_TaskNameInput</dataInputRefs> </inputSet> <outputSet> <dataOutputRefs>_2_performanceOutput</dataOutputRefs> </outputSet> </ioSpecification> <dataInputAssociation> <sourceRef>content</sourceRef> <targetRef>_2_ContentInput</targetRef> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_CommentInput</targetRef> <assignment> <from xsi:type="tFormalExpression">Please perform a self-evalutation.</from> <to xsi:type="tFormalExpression">_2_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_SkippableInput</targetRef> <assignment> <from xsi:type="tFormalExpression">false</from> <to xsi:type="tFormalExpression">_2_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_2_TaskNameInput</targetRef> <assignment> <from xsi:type="tFormalExpression">Performance Evaluation Self</from> <to xsi:type="tFormalExpression">_2_TaskNameInput</to> </assignment> </dataInputAssociation> <dataOutputAssociation> <sourceRef>_2_performanceOutput</sourceRef> <targetRef>performance</targetRef> </dataOutputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>#{employee}</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <userTask id="_3" name="PM Evaluation" > <extensionElements> <tns:onEntry-script> <script>java.util.Map contentParam = new java.util.HashMap(); contentParam.put("reason", reason); contentParam.put("performance", performance); kcontext.setVariable("content", contentParam);</script> </tns:onEntry-script> </extensionElements> <ioSpecification> <dataInput id="_3_ContentInput" name="Content" /> <dataInput id="_3_CommentInput" name="Comment" /> <dataInput id="_3_SkippableInput" name="Skippable" /> <dataInput id="_3_TaskNameInput" name="TaskName" /> <inputSet> <dataInputRefs>_3_ContentInput</dataInputRefs> <dataInputRefs>_3_CommentInput</dataInputRefs> <dataInputRefs>_3_SkippableInput</dataInputRefs> <dataInputRefs>_3_TaskNameInput</dataInputRefs> </inputSet> <outputSet> </outputSet> </ioSpecification> <dataInputAssociation> <sourceRef>content</sourceRef> <targetRef>_3_ContentInput</targetRef> </dataInputAssociation> <dataInputAssociation> <targetRef>_3_CommentInput</targetRef> <assignment> <from xsi:type="tFormalExpression">You need to evaluate #{employee}.</from> <to xsi:type="tFormalExpression">_3_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_3_SkippableInput</targetRef> <assignment> <from xsi:type="tFormalExpression">false</from> <to xsi:type="tFormalExpression">_3_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_3_TaskNameInput</targetRef> <assignment> <from xsi:type="tFormalExpression">Performance Evaluation PM</from> <to xsi:type="tFormalExpression">_3_TaskNameInput</to> </assignment> </dataInputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>john</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <userTask id="_4" name="HR Evaluation" > <extensionElements> <tns:onEntry-script scriptFormat="http://www.java.com/java"> <script>java.util.Map contentParam = new java.util.HashMap(); contentParam.put("reason", reason); contentParam.put("performance", performance); kcontext.setVariable("content", contentParam);</script> </tns:onEntry-script> </extensionElements> <ioSpecification> <dataInput id="_4_ContentInput" name="Content" /> <dataInput id="_4_CommentInput" name="Comment" /> <dataInput id="_4_SkippableInput" name="Skippable" /> <dataInput id="_4_TaskNameInput" name="TaskName" /> <inputSet> <dataInputRefs>_4_ContentInput</dataInputRefs> <dataInputRefs>_4_CommentInput</dataInputRefs> <dataInputRefs>_4_SkippableInput</dataInputRefs> <dataInputRefs>_4_TaskNameInput</dataInputRefs> </inputSet> <outputSet> </outputSet> </ioSpecification> <dataInputAssociation> <sourceRef>content</sourceRef> <targetRef>_4_ContentInput</targetRef> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_CommentInput</targetRef> <assignment> <from xsi:type="tFormalExpression">You need to evaluate #{employee}.</from> <to xsi:type="tFormalExpression">_4_CommentInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_SkippableInput</targetRef> <assignment> <from xsi:type="tFormalExpression">false</from> <to xsi:type="tFormalExpression">_4_SkippableInput</to> </assignment> </dataInputAssociation> <dataInputAssociation> <targetRef>_4_TaskNameInput</targetRef> <assignment> <from xsi:type="tFormalExpression">Performance Evaluation HR</from> <to xsi:type="tFormalExpression">_4_TaskNameInput</to> </assignment> </dataInputAssociation> <potentialOwner> <resourceAssignmentExpression> <formalExpression>mary</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <parallelGateway id="_5" name="Gateway" gatewayDirection="Diverging" /> <parallelGateway id="_6" name="Gateway" gatewayDirection="Converging" /> <endEvent id="_7" name="End" > <terminateEventDefinition/> </endEvent> <!-- connections --> <sequenceFlow id="_1-_2" sourceRef="_1" targetRef="_2" /> <sequenceFlow id="_5-_3" sourceRef="_5" targetRef="_3" /> <sequenceFlow id="_5-_4" sourceRef="_5" targetRef="_4" /> <sequenceFlow id="_2-_5" sourceRef="_2" targetRef="_5" /> <sequenceFlow id="_4-_6" sourceRef="_4" targetRef="_6" /> <sequenceFlow id="_3-_6" sourceRef="_3" targetRef="_6" /> <sequenceFlow id="_6-_7" sourceRef="_6" targetRef="_7" /> </process> <bpmndi:BPMNDiagram> <bpmndi:BPMNPlane bpmnElement="com.sample.evaluation" > <bpmndi:BPMNShape bpmnElement="_1" > <dc:Bounds x="16" y="56" width="48" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_2" > <dc:Bounds x="96" y="56" width="135" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_3" > <dc:Bounds x="344" y="96" width="136" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_4" > <dc:Bounds x="344" y="16" width="136" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_5" > <dc:Bounds x="263" y="56" width="48" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_6" > <dc:Bounds x="512" y="56" width="48" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="_7" > <dc:Bounds x="593" y="56" width="48" height="48" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="_1-_2" > <di:waypoint x="40" y="80" /> <di:waypoint x="163" y="80" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_5-_3" > <di:waypoint x="287" y="80" /> <di:waypoint x="287" y="120" /> <di:waypoint x="412" y="120" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_5-_4" > <di:waypoint x="287" y="80" /> <di:waypoint x="287" y="40" /> <di:waypoint x="412" y="40" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_2-_5" > <di:waypoint x="163" y="80" /> <di:waypoint x="287" y="80" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_4-_6" > <di:waypoint x="412" y="40" /> <di:waypoint x="536" y="40" /> <di:waypoint x="536" y="80" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_3-_6" > <di:waypoint x="412" y="120" /> <di:waypoint x="537" y="120" /> <di:waypoint x="536" y="80" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="_6-_7" > <di:waypoint x="536" y="80" /> <di:waypoint x="617" y="80" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
启动任务:StartProcess.java
package com.sample; import java.util.HashMap; import java.util.Map; import org.drools.KnowledgeBase; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.logger.KnowledgeRuntimeLogger; import org.drools.logger.KnowledgeRuntimeLoggerFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.jbpm.process.workitem.wsht.WSHumanTaskHandler; /** * This is a sample file to launch a process. */ public class StartProcess { public static final void main(String[] args) { try { // load up the knowledge base KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newThreadedFileLogger(ksession, "test", 1000); ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WSHumanTaskHandler()); // start a new process instance Map<String, Object> params = new HashMap<String, Object>(); params.put("employee", "tony"); params.put("reason", "全年业绩评价"); ksession.startProcess("com.sample.evaluation", params); System.out.println("@流程已经启动。。。。。。"); logger.close(); } catch (Throwable t) { t.printStackTrace(); } } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource("Evaluation.bpmn"), ResourceType.BPMN2); return kbuilder.newKnowledgeBase(); } }
执行任务:TestProcess.java
package com.sample; import java.io.IOException; import java.util.List; import org.drools.SystemEventListenerFactory; import org.jbpm.task.query.TaskSummary; import org.jbpm.task.service.TaskClient; import org.jbpm.task.service.mina.MinaTaskClientConnector; import org.jbpm.task.service.mina.MinaTaskClientHandler; import org.jbpm.task.service.responsehandlers.BlockingTaskOperationResponseHandler; import org.jbpm.task.service.responsehandlers.BlockingTaskSummaryResponseHandler; public class TestProcess { public static void main(String[] args) throws IOException, InterruptedException { TaskClient tc = new TaskClient(new MinaTaskClientConnector("client 1", new MinaTaskClientHandler( SystemEventListenerFactory.getSystemEventListener()))); tc.connect("127.0.0.1", 9123); System.out.println("@客户端理解服务器[127.0.0.1:9123]"); BlockingTaskSummaryResponseHandler taskHandler = new BlockingTaskSummaryResponseHandler(); BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler(); long taskId = 0; tc.getTasksAssignedAsPotentialOwner("tony", "en-UK", taskHandler); List<TaskSummary> tasks = taskHandler.getResults(); System.out.println("@tony获得任务列表, tony属于第?级节点"); if (tasks != null && tasks.size() != 0) { System.out.println("-------@>tony 执行"); taskId = tasks.get(0).getId(); System.out.println("tony 执行 Task " + tasks.get(0).getName()); System.out.println("@休息 2 秒钟"); Thread.currentThread(); Thread.sleep(2000); tc.start(taskId, "tony", responseHandler); responseHandler = new BlockingTaskOperationResponseHandler(); tc.complete(taskId, "tony", null, responseHandler); System.out.println("@tony处理完成任务"); }else{ System.out.println("------->tony 不执行"); } System.out.println("休息 1 秒钟"); responseHandler = new BlockingTaskOperationResponseHandler(); taskHandler = new BlockingTaskSummaryResponseHandler(); Thread.currentThread(); Thread.sleep(1000); tc.getTasksAssignedAsPotentialOwner("john", "en-UK", taskHandler); tasks = taskHandler.getResults(); System.out.println("@john获得任务列表, john属于第二级节点,PM"); if (tasks != null && tasks.size() != 0) { System.out.println("-------@>john 执行"); taskId = tasks.get(0).getId(); System.out.println("john 执行 Task " + tasks.get(0).getName()); System.out.println("@休息 2 秒钟"); Thread.currentThread(); Thread.sleep(2000); tc.start(taskId, "john", responseHandler); responseHandler = new BlockingTaskOperationResponseHandler(); tc.complete(taskId, "john", null, responseHandler); System.out.println("@john处理完成任务"); }else{ System.out.println("------->john 不执行"); } responseHandler = new BlockingTaskOperationResponseHandler(); taskHandler = new BlockingTaskSummaryResponseHandler(); tc.getTasksAssignedAsPotentialOwner("mary", "en-UK", taskHandler); System.out.println("@mary获得任务列表, mary属于第二级节点,HR"); tasks = taskHandler.getResults(); if (tasks != null && tasks.size() != 0) { System.out.println("-------@>mary 执行"); taskId = tasks.get(0).getId(); System.out.println("mary 执行 Task " + tasks.get(0).getName()); System.out.println("@休息 2 秒钟"); Thread.currentThread(); Thread.sleep(2000); tc.start(taskId, "mary", responseHandler); responseHandler = new BlockingTaskOperationResponseHandler(); tc.complete(taskId, "mary", null, responseHandler); System.out.println("@mary处理完成......"); }else{ System.out.println("------->mary 不执行"); } System.out.println("......Task被处理完成......"); } }
输出:
@客户端理解服务器[127.0.0.1:9123]
@tony获得任务列表, tony属于第?级节点
-------@>tony 执行
tony 执行 Task Performance Evaluation Self
@休息 2 秒钟
@tony处理完成任务
休息 1 秒钟
@john获得任务列表, john属于第二级节点,PM
-------@>john 执行
john 执行 Task Performance Evaluation PM
@休息 2 秒钟
@john处理完成任务
@mary获得任务列表, mary属于第二级节点,HR
-------@>mary 执行
mary 执行 Task Performance Evaluation HR
@休息 2 秒钟
@mary处理完成......
......Task被处理完成......
- JBPM5.2_Demo.tar.gz (75.5 KB)
- 下载次数: 24
评论
1 楼
z070204z
2013-07-30
请问为什么我taskHandler.getResults()得到的是一个空数组??
我的启动顺序是DemoTaskService、StartProcess、TestProcess这样对吗??
我的启动顺序是DemoTaskService、StartProcess、TestProcess这样对吗??
发表评论
-
drools 规则文件 —— 语法
2014-06-09 21:53 3452原文:http://liureying.blog.163.co ... -
使用eclipse创建bpmn2文件的一些问题
2014-06-07 15:18 1778使用bpmn2 diagram Editor编辑器的问题 1 ... -
JBPM6入门资料: Spring4 + Hibernate4 + JBPM6整合
2014-05-21 19:39 18800参考资料: =============== ... -
我的Activiti例子
2013-09-21 15:01 6927Spring 与Activiti的入门整合 http://ww ... -
各种状态的任务查询以及和业务对象关联
2013-09-21 14:26 1978http://www.kafeitu.me/activiti/ ... -
Activiti: 三种部署方式和几种启动方式
2013-09-20 00:24 4759三种部署: 1.自动部署: <property name ... -
Activiti modeler 国际化要点
2013-09-18 15:33 25701. 界面文本:src/main/resources/sten ... -
两篇整合Activiti Modeler到业务系统
2013-09-17 14:29 8719整合Activiti Modeler到业务系统(或BPM平台) ... -
Activiti5.12共22张表
2013-09-17 14:10 1986(1)用户管理表 ACT_ID_GROUP; ... -
Activiti: 关于表单的一些接口
2013-09-17 09:31 2496获得流程启动的时候的表单信息 ProcessInstance ... -
Activiti5: TaskQuery查询API
2013-09-16 13:34 3486http://blog.csdn.net/iflow/arti ... -
第一个Activiti5.13 + Spring3.x例子
2013-09-16 13:24 2377参考: http://www.iteye.com/topic/ ... -
kft-activiti-demo: 部署记录
2013-09-13 17:36 20252.SpringMvc + Activiti + Hibern ... -
SSH 整合 Activiti
2013-09-09 14:45 2039原文:http://blog.chinaunix.net/ui ... -
Activiti BPM Platform工作流的一些资料
2013-09-03 16:07 2949Activiti官方: http://www.activiti ... -
JBPM5.4发送email
2013-05-29 15:57 2098JBPM5.4配置参考: http://panyongzhen ... -
Spring3.1 + Hibernate4.2.1 + JBPM5.4 + Ehache整合例子
2013-05-29 11:17 9499pom.xml ----------------------- ... -
JBPM5 Designer 2.3源码问题
2013-05-24 09:50 2351最新本2.4发布,但是里面是使用Maven的module方式来 ... -
Spring 3 & jBPM 5 & LocalTaskService
2013-05-24 09:52 1842帖子地址:https://community.jboss.or ... -
JBPM Designer 部署
2013-05-24 09:53 1670版本:2.4 把war放到tomcat下面之后,进入的url是 ...
相关推荐
第一章 概述 1 1.1 什么是jBPM? 1 1.2 概览 2 1.3 核心引擎 3 1.4 Eclipse编辑器 4 1.5 基于Web的设计器 5 1.6 jBPM控制台 5 1.7 文档结构 6 第二章 获得开始 7 2.1 下载 7 2.2 获得开始 7 2.3 社区 8 2.4 资源 8 ...
- 包括环境搭建、第一个流程的实现等内容。 - **2.3 社区** - 拥有一个活跃的社区,用户可以在其中交流心得、解决问题。 - **2.4 资源** - **许可证**: 明确了JBPM的开源许可类型,为开发者提供了法律保障。 -...
第一篇 jBPM工作流开发基础 1 第1章 工作流基础 2 1.1 工作流概念 2 1.1.1 工作流管理思想之于企业现代化管理 2 1.1.2 工作流技术在企业中的应用 5 1.1.3 如何从一个开发者的角度看工作流技术 6 1.2 工作流管理系统...
#### 二、第一个流程 ##### 2.1 开始前的准备 在开始之前,需要准备JBPM的相关环境和工具。可以从JBoss官方网站下载最新的JBPM版本,例如3.2.1版本。推荐下载`jbpm-starters-kit-3.1.2`这一版本,因为它包含了JBPM...