梦相随1006

版权归 梦相随1006 所有,未经 https://www.cnblogs.com/xin1006 作者许可,严禁转载

导航

Activiti-03-query api

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"); 

 

posted on 2013-10-17 19:32  梦相随1006  阅读(714)  评论(0编辑  收藏  举报