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脚本生成类 
@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,这里需要保持一致这样我才能控制触发指定的规则。

 

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值