整合activiti drools
在网上找了很多整合activit使用的都是5.x的drools ,我按照按照网上的方法配置时整合6.5时,发现老是提示
Deployment * doesn't contain any rules 。
转换思路
后来打算不采用BusinessRuleTask,通过普通的serviceTask来自己编写触发规则的方法。
- pom配置 主要就是依赖activiti drool spring 的相关依赖
- 编写drools脚本生成类
@Component
public class DroolsLoader {
/**
* drools脚本动态生成 可以根据业务,在不同场景下去生成
* @throws IOException
*/
@PostConstruct
public void init() throws IOException {
KieServices kieServices = KieServices.Factory.get();
KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("Test");
KieSessionModel kieSessionModel = kieBaseModel.newKieSessionModel("sdfasdf");
KieFileSystem kfs = kieServices.newKieFileSystem();
//读取事先定义好的脚本 可以在此处动态生成脚本
String ruleTemplate = IOUtils
.toString(MyStartProcess.class.getResourceAsStream("/drools/user.drl"), "UTF-8");
kfs.write("src/main/resources/drools/hello.drl",ruleTemplate);
kfs.writeKModuleXML(kieModuleModel.toXML());
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
}
}
这儿我采用的初始化方法去创建drools脚本,在实际的应用场景中我们也可以根据需求在不同的时间点创建,在规则平台中我们也可以自定义去实时的动态创建规则。需要注意的是kieBaseModel.newKieSessionModel("sdfasdf"); session的name是sdfasdf,在后续的触发时需要找到指定session这样就可以触发我们想要触发的规则,而不是触发所有规则。
事例中是读取编写drools文件,实际开发中我们可以通过占位符实现模板文件,自定义的生成drools脚本然后加载到droolsResposity中。
user.drl文件内容如下:
package asdfas
import com.bauer.java.activitidrools.bean.UserBean
rule "testuser"
when
$ruleParam :UserBean(age > 20)
then
System.out.println("hello world---");
end
如果 年龄大于20会输出hello world
3.bpmn文件配置
采用表达式的方式去触发规则,目前bpmn文件是预先写好的。实际的应用场景是动态生成的,类似drools脚本的生成。然后通过avtiviti的api实现动态部署如下面代码所示:
Deployment deployment = repositoryService.createDeployment().name(name).addString(name+".bpmn", bpmn).deploy();
4.编写触发规则类
@Component("bussinuessRuleTask")
public class BussinuessRuleTask {
/**
*
* @param execution
* @param name 用于区分触发哪些规则 sessionname
*/
public void fireRule(String name , DelegateExecution execution ) {
KieServices kieServices = KieServices.Factory.get();
KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieSession kieSession = kContainer.newKieSession(name);
//插入入参
kieSession.insert(execution.getVariable("userBean"));
kieSession.fireAllRules();
kieSession.dispose();
System.out.println("rule has fired");
}
}
这里需要注意的是这个name实际对应的是上文中所说到的session的name是sdfasdf,这里需要保持一致这样我才能控制触发指定的规则。