Query API
有两种方式从引擎中查询数据, 查询 API 和本地查询。
API方式:
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("kermit")
.processVariableValueEquals("orderId","0815")
.orderByDueDate().asc()
.list();
本地查询方式(写sql):
List<Task> tasks = taskService.createNativeTaskQuery()
.sql("SELECT count(*) FROM "+ managementService.getTableName(Task.class)+" T WHERE T.NAME_ = #{taskName}")
.parameter("taskName","gonzoTask")
.list();
long count = taskService.createNativeTaskQuery()
.sql("SELECT count(*) FROM "+ managementService.getTableName(Task.class)+" T1, "
+ managementService.getTableName(VariableInstanceEntity.class)+" V1 WHERE V1.TASK_ID_ = T1.ID_")
.count();
Expressions
Activiti 使用UEL( Unified Expression Language )作为表达式解析
Value expression: 解析为一个值,默认所有的流程变量都可以被使用 所有的spring bean也可以被使用
在流程定义文件中,可以使用${XXX}这样的表达式
${myVar}
${myBean.myProperty}
Method expression:继续为一个方法可能有参数,如果没有参数,也要加“()”.
${printer.print()}
${myBean.addNewOrder('orderName')}
${myBean.doSomething(myVar, execution)}
表达式支持解析简单的 基本类型 bean map array list
Unit testing
在单元测试3中, org.activiti.engine.test.ActivitiTestCase
必须被继承
在 setup()测试方法中,processEngine 将被
activiti.cfg.xml初始化,为了指定不同的配置文件getConfigurationResource()方法需要被重写
继承 ActivitiTestCase 之后,可以使用org.activiti.engine.test.Deployment注解
在测试之前,, 一个形如 testClassName.testMethod.bpmn20.xml的资源文件和测试类在一个包中
, 将被部署 deployed.
public class 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());
}
}
在单元测试4中,org.activiti.engine.test.ActivitiRule
Rule 必须被使用,通过Rule,流程引擎和服务可以被获取 。Deployment注解也会被用到
/**
* 1,要测试的文件必须与测试类在同一包下面
* 2,此流程文件名是: 类名.方法名 .bpmn20.xml
*/
public class MyBusinessProcessTest{
@Rule
publicActivitiRule 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());
}
}
在 in-memory H2 database进行单元测试 浏览器输入 http://localhost:8082,设置数据库相关信息,进入数据库查询页面
流程引擎在web应用
ProcessEngine
是线程安全的,在web应用中看,容器启动,关闭引擎跟着启动和关闭
下面是简单的写一个ServletListener,启停引擎
public class ProcessEnginesServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent servletContextEvent){
// ProcessEngines.init()方法会查找classpath中activiti.cfg.xml
资源文件,创建ProcessEngine
ProcessEngines.init();
}
publicvoid contextDestroyed(ServletContextEvent servletContextEvent){
ProcessEngines.destroy();
}
}
取ProcessEngines对象可以使用 ProcessEngines.getDefaultProcessEngine()或
ProcessEngines.getProcessEngine("myName");