当前位置: 代码迷 >> 综合 >> spring activiti drools6.5整合(转)
  详细解决方案

spring activiti drools6.5整合(转)

热度:42   发布时间:2023-12-08 00:33:03.0

spring activiti drools6.5整合

 

 

整合activiti drools

在网上找了很多整合activit使用的都是5.x的drools ,我按照按照网上的方法配置时整合6.5时,发现老是提示

Deployment * doesn't contain any rules 。

转换思路

后来打算不采用BusinessRuleTask,通过普通的serviceTask来自己编写触发规则的方法。

  1. pom配置 主要就是依赖activiti drool spring 的相关依赖
  2. 编写drools脚本生成类 
 
  1. @Component

  2. public class DroolsLoader {

  3.  
  4. /**

  5. * drools脚本动态生成 可以根据业务,在不同场景下去生成

  6. * @throws IOException

  7. */

  8. @PostConstruct

  9. public void init() throws IOException {

  10. KieServices kieServices = KieServices.Factory.get();

  11. KieModuleModel kieModuleModel = kieServices.newKieModuleModel();

  12. KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("Test");

  13. KieSessionModel kieSessionModel = kieBaseModel.newKieSessionModel("sdfasdf");

  14. KieFileSystem kfs = kieServices.newKieFileSystem();

  15. //读取事先定义好的脚本 可以在此处动态生成脚本

  16. String ruleTemplate = IOUtils

  17. .toString(MyStartProcess.class.getResourceAsStream("/drools/user.drl"), "UTF-8");

  18. kfs.write("src/main/resources/drools/hello.drl",ruleTemplate);

  19. kfs.writeKModuleXML(kieModuleModel.toXML());

  20. KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();

  21. }

  22. }

这儿我采用的初始化方法去创建drools脚本,在实际的应用场景中我们也可以根据需求在不同的时间点创建,在规则平台中我们也可以自定义去实时的动态创建规则。需要注意的是kieBaseModel.newKieSessionModel("sdfasdf"); session的name是sdfasdf,在后续的触发时需要找到指定session这样就可以触发我们想要触发的规则,而不是触发所有规则。

事例中是读取编写drools文件,实际开发中我们可以通过占位符实现模板文件,自定义的生成drools脚本然后加载到droolsResposity中。

user.drl文件内容如下:

 
  1. package asdfas

  2. import com.bauer.java.activitidrools.bean.UserBean

  3.  
  4. rule "testuser"

  5. when

  6. $ruleParam :UserBean(age > 20)

  7. then

  8. System.out.println("hello world---");

  9. end

如果 年龄大于20会输出hello world

3.bpmn文件配置

采用表达式的方式去触发规则,目前bpmn文件是预先写好的。实际的应用场景是动态生成的,类似drools脚本的生成。然后通过avtiviti的api实现动态部署如下面代码所示:

Deployment deployment = repositoryService.createDeployment().name(name).addString(name+".bpmn", bpmn).deploy();

   4.编写触发规则类

 
  1. @Component("bussinuessRuleTask")

  2. public class BussinuessRuleTask {

  3.  
  4. /**

  5. *

  6. * @param execution

  7. * @param name 用于区分触发哪些规则 sessionname

  8. */

  9. public void fireRule(String name , DelegateExecution execution ) {

  10. KieServices kieServices = KieServices.Factory.get();

  11. KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());

  12. KieSession kieSession = kContainer.newKieSession(name);

  13. //插入入参

  14. kieSession.insert(execution.getVariable("userBean"));

  15. kieSession.fireAllRules();

  16. kieSession.dispose();

  17. System.out.println("rule has fired");

  18. }

  19. }

这里需要注意的是这个name实际对应的是上文中所说到的session的name是sdfasdf,这里需要保持一致这样我才能控制触发指定的规则。

 

源码:https://github.com/weiruiwei/activiti-drools-example.git

  相关解决方案