规则引擎Drools(3)Activiti整合Drools
制订业务
- 金卡7折
- 银卡8折
测试规则
设计流程
Activiti整合Drools,drl文件部署,要注意三点如下:
1在activiti.cxf.xml中加入下标签
2.在JAVA部署时将我们要部署的drl文件进行部署,如下
3. 匹配参数要JAVA 中JUEL注入
测试流程图;
测试
1.1 新建 activiti.cxf.xml(加Drools有效标签,祥见上上图), 流程图sale.bpmn
1.2 新建sale.drl,并修改sale.bpmn,给匹配销售规则节点加输入参数,和匹配结果结果参数(是个数组)
1.3 再新建相关的类其他,
1.4整个过程如下:
项目结构如下:
注意事项:将 Activiti整合Drools,drl文件部署,要注意三点如下都弄好后
根据流程图:执行SaleMain的main方法 我们部署完 bpmn,drl文件后,流程先走到录入销售信息,然后执行如下代码
// 完成第一个任务并设置销售参数
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
// 设置参数
Map<String, Object> vars = new HashMap<String, Object>();
Member m = new Member();
m.setIdentity("gold");
m.setAmount(100);
vars.put("member", m);
System.out.println("当前节点任务名"+task.getName());//当前节点任务名录入销售信息
//在跳到下一个节点即匹配销售规则节点节点前设置好参数 member JUEL
taskService.complete(task.getId(), vars);
/*
因为流程bpmn和drl是同时加入流程的.addClasspathResource("sale.bpmn").addClasspathResource("sale.drl").deploy();
所以在进入 匹配销售规则节点时
会按照我们juel注入的参数member对象,按照sale.bpmn activiti:ruleVariablesInput="${member}" 自动根据sale.drl进行匹配
并将匹配新的对象(因为sale.drl配置规则打折后更新了对象)放入 sale.bpmn 设置的数组参数 activiti:resultVariable="members" 中
然后会自动执行Service Task对应的自定义类com.xiangshuai.act.c27.OutputDelegate
@Override
public void execute(DelegateExecution exe) {
System.out.println("结果输出类");
List<Member> members = (List<Member>)exe.getVariable("members");
for(Member m : members) {
System.out.println("客户身份:" + m.getIdentity() + ", 消费金额:" + m.getAmount() + ", 优惠后金额:" + m.getResult());
}
}
*/
总测试类:
SaleMain.java
package com.xiangshuai.act.c27;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
/**
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤24-28 规则引擎Drools(3)Activiti整合Drools
或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤24-28 规则引擎Drools(3)Activiti整合Drools
*
*/
public class SaleMain {
public static void main(String[] args) {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment()
.addClasspathResource("sale.bpmn")
.addClasspathResource("sale.drl").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
// 完成第一个任务并设置销售参数
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
// 设置参数
Map<String, Object> vars = new HashMap<String, Object>();
Member m = new Member();
m.setIdentity("gold");
m.setAmount(100);
vars.put("member", m);
System.out.println("当前节点任务名"+task.getName());//当前节点任务名录入销售信息
//在跳到下一个节点即匹配销售规则节点节点前设置好参数 member JUEL
taskService.complete(task.getId(), vars);
/*
因为流程bpmn和drl是同时加入流程的.addClasspathResource("sale.bpmn").addClasspathResource("sale.drl").deploy();
所以在进入 匹配销售规则节点时
会按照我们juel注入的参数member对象,按照sale.bpmn activiti:ruleVariablesInput="${member}" 自动根据sale.drl进行匹配
并将匹配新的对象(因为sale.drl配置规则打折后更新了对象)放入 sale.bpmn 设置的数组参数 activiti:resultVariable="members" 中
然后会自动执行Service Task对应的自定义类com.xiangshuai.act.c27.OutputDelegate
@Override
public void execute(DelegateExecution exe) {
System.out.println("结果输出类");
List<Member> members = (List<Member>)exe.getVariable("members");
for(Member m : members) {
System.out.println("客户身份:" + m.getIdentity() + ", 消费金额:" + m.getAmount() + ", 优惠后金额:" + m.getResult());
}
}
*/
}
}