工作流中的UEL表达式的使用



工作流中的UEL表达式的使用

公共spring配置文件:

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”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 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd”>

<!– 配置数据源 –>
<bean id=”dataSource” class=”org.springframework.jdbc.datasource.SimpleDriverDataSource”>
<property name=”driverClass” value=”org.h2.Driver” />
<property name=”url” value=”jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000″ />
<property name=”username” value=”sa” />
<property name=”password” value=”" />
</bean>
<!– 事务管理器 –>
<bean id=”transactionManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>
<property name=”dataSource” ref=”dataSource” />
</bean>

<bean id=”bean1″ class=”com.easyway.workflow.activiti.SentenceGenerator” />

<!– 流程引擎配置对象 –>
<bean id=”processEngineConfiguration” class=”org.activiti.spring.SpringProcessEngineConfiguration”>
<property name=”dataSource” ref=”dataSource” />
<property name=”transactionManager” ref=”transactionManager” />
<property name=”jobExecutorActivate” value=”false” />
<!– 数据库的表结构的创建方式 –>
<property name=”databaseSchemaUpdate” value=”create-drop” />
<!– 采用自动部署工作流activiti的方式 –>
<property name=”deploymentResources” value=”classpath*:diagrams/*.bpmn20.xml” />
<!– 设置需要暴露的bean对象 –>
<property name=”beans”>
<map>
<entry key=”bean1″ value-ref=”bean1″ />
</map>
</property>
</bean>

<!– 流程引擎对象的创建 –>
<bean id=”processEngine” class=”org.activiti.spring.ProcessEngineFactoryBean”>
<property name=”processEngineConfiguration” ref=”processEngineConfiguration” />
</bean>
<!– 创建各种流程引擎的服务 –>
<bean id=”repositoryService” factory-bean=”processEngine” factory-method=”getRepositoryService” />
<bean id=”runtimeService” factory-bean=”processEngine” factory-method=”getRuntimeService” />
<bean id=”taskService” factory-bean=”processEngine” factory-method=”getTaskService” />
<bean id=”historyService” factory-bean=”processEngine” factory-method=”getHistoryService” />
<bean id=”managementService” factory-bean=”processEngine” factory-method=”getManagementService” />

</beans>

package com.easyway.workflow.activiti;
/**
*
* 工作流中的activiti中的UEL的两种用法要求:
* 1.UEL使用的bean必须为spring暴露给activiti的bean。
* 2.如果采用方法必须为public
* <!–访问方法表达式 –>
* <serviceTask id=”serviceTask” activiti:expression=”${bean1.getSentence()}” />
* 3.如果采用属性方位则必须为属性提供getter/setter方法
* <!– 访问属性的表达方式的 –>
* <serviceTask id=”serviceTask2″ activiti:expression=”${bean1.level}” />
*
*
* @author longgangbai
*
* 2011-12-18 下午09:48:36
*/
public class SentenceGenerator {

private String level;

/**
* @return the level
*/
public String getLevel() {
return level;
}

/**
* @param level the level to set
*/
public void setLevel(String level) {
this.level = level;
}

public String getSentence() {
return “Activiti BPMN 2.0 process engine”;
}

}

 

 

实例一:
配置:

<?xml version=”1.0″ encoding=”UTF-8″?>
<definitions id=”definitions”
xmlns=”http://www.omg.org/spec/BPMN/20100524/MODEL”
xmlns:activiti=”http://activiti.org/bpmn”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
targetNamespace=”bankService”>
<!– 全局共享变量是设置 –>
<process id=”springexclusiveGateway”>
<startEvent id=”theStart” />
<!– 共享通道 –>
<exclusiveGateway id=”fork” name=”abc”>
<documentation> 可以理解为多种方式都可以达到目的地,但是适合自己的只有一条</documentation>
</exclusiveGateway>

<exclusiveGateway id=”join” name=”abc” />
<sequenceFlow id=”flow1″ sourceRef=”theStart” targetRef=”fork” />
<sequenceFlow id=”flow2″ sourceRef=”fork” targetRef=”receivePayment” >
<!– 使用xsi之前必须在命名空间中导入 xsi –>
<conditionExpression xsi:type=”tFormalExpression”>${paymentReceived == false}</conditionExpression>
</sequenceFlow>
<sequenceFlow id=”flow3″ sourceRef=”fork” targetRef=”shipOrder” >
<conditionExpression xsi:type=”tFormalExpression”>${shipOrder == true}</conditionExpression>
</sequenceFlow>

<userTask id=”receivePayment” name=”Receive Payment” />
<sequenceFlow id=”flow4″ sourceRef=”receivePayment” targetRef=”join” />

<userTask id=”shipOrder” name=”Ship Order” />
<sequenceFlow id=”flow5″ sourceRef=”shipOrder” targetRef=”join” />

<sequenceFlow id=”flow6″ sourceRef=”join” targetRef=”archiveOrder” />

<!– 指定特定用户组中的特定的用户处理任务 –>
<userTask id=”archiveOrder” name=”Archive Order” >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>

</userTask>

<sequenceFlow sourceRef=”archiveOrder” targetRef=”theEnd” />

<endEvent id=”theEnd” />

</process>
</definitions>

 

代码:

package com.easyway.workflow.activiti;

import java.util.HashMap;

/**
*
* <exclusiveGateway id=”fork” name=”abc”/>
* 可以理解为多种方式都可以达到目的地,但是适合自己的只有一条
*
* <!– 指定特定用户组中的特定的用户处理任务 –>
<userTask id=”archiveOrder” name=”Archive Order” >
<potentialOwner>
<resourceAssignmentExpression>
<formalExpression>user(kermit), group(management)</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
*
*
* 全局属性的使用
*
*
* @author longgangbai
*
* 2011-12-18 下午10:33:15
*/
public class SpringExclusiveGateway {
public static void main(String[] args) {
//加载spring配置和工作流流程处理配置
ApplicationContext ctx=new ClassPathXmlApplicationContext(“application-context-expression.xml”);
//工作流相关的各种服务
HistoryService historyService=(HistoryService)ctx.getBean(“historyService”);
RuntimeService runtimeService=(RuntimeService)ctx.getBean(“runtimeService”);
TaskService taskService=(TaskService)ctx.getBean(“taskService”);
//设置调用流程过程中使用的参数
HashMap<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put(“paymentReceived”, true);
variableMap.put(“shipOrder”, true);
//流程实例对象
ProcessInstance pi = runtimeService.startProcessInstanceByKey(“springexclusiveGateway”,variableMap);
TaskQuery query = taskService.createTaskQuery()
.processInstanceId(pi.getId())
.orderByTaskName()
.asc();

List<Task> tasks = query.list();
System.out.println(“tasksize =”+tasks.size());

Task task = tasks.get(0);
System.out.println(“Ship Order =”+task.getName());

}

}

 

 

实例二:

配置:


<?xml version=”1.0″ encoding=”UTF-8″?>

<definitions id=”definitions”
xmlns=”http://www.omg.org/spec/BPMN/20100524/MODEL”
xmlns:activiti=”http://activiti.org/bpmn”
targetNamespace=”Expressions”>

<process id=”limitedExpressionProcess”>
<startEvent id=”start” />
<sequenceFlow id=”flow1″ sourceRef=”start” targetRef=”serviceTask” />
<!–访问方法表达式 –>
<serviceTask id=”serviceTask” name=”定期会议开始” activiti:expression=”${bean1.getSentence()}” >
</serviceTask>

<sequenceFlow id=”flow2″ sourceRef=”serviceTask” targetRef=”userTask” />

<userTask id=”userTask” name=”会议中…..” />

<sequenceFlow id=”flow3″ sourceRef=”userTask” targetRef=”serviceTask2″ />
<!– Using bean that is available in app-context, but not mentioned in beans –>
<!– 访问属性的表达方式的 –>
<serviceTask id=”serviceTask2″ name=”定期会议结束….” activiti:expression=”${bean1.level}” />

<sequenceFlow id=”flow4″ sourceRef=”serviceTask2″ targetRef=”end” />
<endEvent id=”end” />

</process>

</definitions>

 

代码:

/**
package com.easyway.workflow.activiti;

import java.util.List;

/**
* 测试工作流中的UEL表达式的使用
*
* @author longgangbai
*
* 2011-12-18 下午07:35:29
*/
public class SpringLimitedExpressionActiviti {
public static void main(String[] args) throws InterruptedException {
//加载spring配置和工作流流程处理配置
ApplicationContext ctx=new ClassPathXmlApplicationContext(“application-context-expression.xml”);
//工作流相关的各种服务
HistoryService historyService=(HistoryService)ctx.getBean(“historyService”);
RuntimeService runtimeService=(RuntimeService)ctx.getBean(“runtimeService”);
TaskService taskService=(TaskService)ctx.getBean(“taskService”);
//流程实例对象
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(“limitedExpressionProcess”);
//查询当前任务数据
System.out.println(“处理任务之前:”+runtimeService.createProcessInstanceQuery().count());
List<Task> taskList=taskService.createTaskQuery().list();
//手动分配代办任务
for (Task task : taskList) {
taskService.claim(task.getId(), “kermit”);
}
//手动处理完成任务
for (Task task : taskList) {
taskService.complete(task.getId());
}
//检查剩余任务数
System.out.println(“处理任务之前:”+taskService.createTaskQuery().count());
// verify that the process is actually finished
//验证流程是否处理完毕
HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
System.out.println(“Process instance end time: ” + historicProcessInstance.getEndTime());
//6分钟时间等待第二次执行
Thread.sleep(6*60*1000);

}

}

 

实例三

配置:

<?xml version=”1.0″ encoding=”UTF-8″?>
<definitions id=”definitions”
xmlns=”http://www.omg.org/spec/BPMN/20100524/MODEL”
xmlns:activiti=”http://activiti.org/bpmn”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
targetNamespace=”bankService”>
<process id=”springparallelGateway”>
<startEvent id=”theStart” />
<sequenceFlow id=”flow1″ sourceRef=”theStart” targetRef=”fork” />

<parallelGateway id=”fork” >
<documentation> 理解为多种方式都可以到达目的地,并行的互不干涉,进度</documentation>
</parallelGateway>

<sequenceFlow sourceRef=”fork” targetRef=”receivePayment” />
<sequenceFlow sourceRef=”fork” targetRef=”shipOrder” />
<!– 给特定用户分配任务 –>
<userTask id=”receivePayment” name=”Receive Payment” >
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>

<sequenceFlow sourceRef=”receivePayment” targetRef=”join” />

<userTask id=”shipOrder” name=”Ship Order” />
<sequenceFlow sourceRef=”shipOrder” targetRef=”join” />

<parallelGateway id=”join” />
<sequenceFlow sourceRef=”join” targetRef=”archiveOrder” />

<userTask id=”archiveOrder” name=”Archive Order” />
<sequenceFlow sourceRef=”archiveOrder” targetRef=”theEnd” />

<endEvent id=”theEnd” />

</process>
</definitions>

 

 

代码:

 

/**
package com.easyway.workflow.activiti;

import java.util.List;

/**
* 测试工作流中的UEL表达式的使用
*
* <parallelGateway id=”fork” />
* 理解为多种方式都可以到达目的地,并行的互不干涉,进度
*
* <!– 给特定用户分配任务 –>
<userTask id=”receivePayment” name=”Receive Payment” >
<humanPerformer>
<resourceAssignmentExpression>
<formalExpression>kermit</formalExpression>
</resourceAssignmentExpression>
</humanPerformer>
</userTask>

*
* @author longgangbai
*
* 2011-12-18 下午07:35:29
*/
public class SpringParallelExpressionActiviti {
public static void main(String[] args) throws InterruptedException {
//加载spring配置和工作流流程处理配置
ApplicationContext ctx=new ClassPathXmlApplicationContext(“application-context-expression.xml”);
//工作流相关的各种服务
HistoryService historyService=(HistoryService)ctx.getBean(“historyService”);
RuntimeService runtimeService=(RuntimeService)ctx.getBean(“runtimeService”);
TaskService taskService=(TaskService)ctx.getBean(“taskService”);
//流程实例对象
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(“springparallelGateway”);
TaskQuery query = taskService.createTaskQuery()
.processInstanceId(processInstance.getId())
.orderByTaskName()
.asc();

List<Task> tasks = query.list();
System.out.println(tasks.size());

Task task1 = tasks.get(0);
System.out.println(“Receive Payment =”+ task1.getName());
Task task2 = tasks.get(1);
System.out.println(“Ship Order”+task2.getName());
//查看指定人的任务
List<Task> kermittasks = taskService.createTaskQuery().taskAssignee(“kermit”).list();
System.out.println(“kermit task number =”+ kermittasks.size());

}

}