spring activiti drools6.5整合
整合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,这里需要保持一致这样我才能控制触发指定的规则。