文档章节

疯狂Activiti6.0连载(14)Activiti运行第一个DMN应用

杨大仙的程序空间
 杨大仙的程序空间
发布于 2017/11/08 07:26
字数 1524
阅读 925
收藏 9

本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

Activiti运行第一个DMN应用

        前面对DMN规范作了一个简单的讲解,本小节将带领大家开发第一个Activiti的规则项目,目的让大家对Activiti的规则引擎有一个初步了解,在成功运行第一个规则项目后,对DMN规范以及Activiti的DMN实现就不会感觉神秘。

建立项目

        与本书前面章节的项目一样,新建一个普通的Java项目,后缀为.dmn的文件存放在resource/dmn目录,同样依赖common-lib/lib目录(不包括子目录)下的jar包。除了依赖Activiti的jar包外,由于规则引擎使用了liqui、mvel等项目,因此还要导入这些项目的包,项目结构以及所使用的jar包如图15-1所示。

图15-1 项目结构

        需要注意的是,在导入common-lib/lib的包时,不要把源代码的包也导入到项目中,例如把规则引擎的源代码包(activiti-dmn-engine-6.0.0-sources.jar)导到环境中,在运行时,会出现以下异常:org.activiti.dmn.engine.ActivitiDmnException: Error initialising dmn data model。

        图15-1中的resource目录,有一份activiti.dmn.cfg.xml的配置文件,该文件包含规则引擎的基础配置,我们将在后面章节中讲述。

规则引擎配置文件

        在默认情况下,规则引擎会读取ClassPath下的activiti.dmn.cfg.xml,对于该文件,大家可能觉得比较熟悉,这个文件名,就是流程引擎配置文件的名称中间加入了dmn字母。而相对于配置文件的内容,几乎也是与流程引擎一样。代码清单15-7是本例中所使用的配置文件。

        代码清单15-7:codes\15\15.3\first-dmn\resource\activiti.dmn.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dmnEngineConfiguration"
        class="org.activiti.dmn.engine.impl.cfg.StandaloneDmnEngineConfiguration">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="123456" />
    </bean>

</beans>

        规则引擎的配置文件,几乎与流程引擎的配置文件一样,配置一个dmnEngineConfiguration的bean,为该bean设置JDBC的连接属性。规则引擎有哪些配置,将在下面章节中讲述。

编写DMN文件

        本例中定义一个最简单的规则,当传入的年龄参数大于等于18时,就返回“成年人”字符串,如果年龄参数小于18,就返回“小孩”字符串。代码清单15-8为本例的规则文件。

        代码清单15-8:codes\15\15.3\first-dmn\resource\dmn\first.dmn

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151130"
    id="simple" name="Simple" namespace="http://activiti.org/dmn">
    <decision id="decision1" name="Simple decision">
        <decisionTable id="decisionTable">
            <input id="input1">
                <inputExpression id="inputExpression1" typeRef="number">
                    <text>personAge</text>
                </inputExpression>
            </input>
            <output id="outputId" label="Output 1" name="myResult" typeRef="string" />
            <rule>
                <inputEntry id="inputEntry2">
                    <text><![CDATA[ >= 18 ]]></text>
                </inputEntry>
                <outputEntry id="outputEntry2">
                    <text>'成年人'</text>
                </outputEntry>
            </rule>
            <rule>
                <inputEntry id="inputEntry1">
                    <text><![CDATA[ < 18 ]]></text>
                </inputEntry>
                <outputEntry id="outputEntry1">
                    <text>'小孩'</text>
                </outputEntry>
            </rule>
        </decisionTable>
    </decision>
</definitions>

        规则文件中,定义了一个输入参数、一个输出结果和两个规则,在前面章节已经对相关的DMN元素作了讲解,在此不再赘述。

加载与运行DMN文件

        两个引擎不仅仅在配置上类似,连API的使用也非常相似。如果在本书前面的章节中,熟练掌握了Activiti工作流引擎的API,那么在学习使用规则引擎的API也不会太难。代码清单15-9中为规则的运行代码。

        代码清单15-9:codes\15\15.3\first-dmn\src\org\crazyit\activiti\FirstDmn.java

public class FirstDmn {

    public static void main(String[] args) {
        // 根据默认配置创建引擎的配置实例
        DmnEngineConfiguration config = DmnEngineConfiguration
                .createDmnEngineConfigurationFromResourceDefault();
        // 创建规则引擎
        DmnEngine engine = config.buildDmnEngine();
        // 获取规则的存储服务组件
        DmnRepositoryService rService = engine.getDmnRepositoryService();
        // 获取规则服务组件
        DmnRuleService ruleService = engine.getDmnRuleService();
        // 进行规则 部署
        DmnDeployment dep = rService.createDeployment()
                .addClasspathResource("dmn/first.dmn").deploy();
        // 进行数据查询
        DmnDecisionTable dt = rService.createDecisionTableQuery()
                .deploymentId(dep.getId()).singleResult();
        // 初始化参数
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("personAge", 19);
        // 传入参数执行决策,并返回结果
        RuleEngineExecutionResult result = ruleService.executeDecisionByKey(
                dt.getKey(), params);
        // 控制台输出结果
        System.out.println(result.getResultVariables().get("myResult"));
        // 重新设置参数
        params.put("personAge", 5);
        // 重新执行决策
        result = ruleService.executeDecisionByKey(dt.getKey(), params);
        // 控制台重新输出结果
        System.out.println(result.getResultVariables().get("myResult"));
    }
}

        如代码清单15-9所示,先读取默认的配置文件来创建DmnEngineConfiguration实例,以该实例获取规则引擎DmnEngine实例,再以DmnEngine为基础,获取两个服务组件:DmnRepositoryService和DmnRuleService。DmnRepositoryService主要负责引擎资源的部署,DmnRuleService则提供规则的相关服务,例如可以执行规则、查询规则等。

        代码清单15-9中,使用了DmnRepositoryService将first.dmn规则文件部署到引擎中,再根据部署的id去查询DmnDecisionTable实例。代码清单15-9中的粗体字代码,使用DmnRuleService来执行决策并返回结果,由于我们在DMN文件中配置了,需要有一个名称为personAge的输入参数,因此要新建一个Map实例来保存该参数。

        在以上例子中,第一次使用DmnRuleService来执行决策时,传入的“personAge”参数值为19,第二次执行决策时,传入的参数值为5,运行代码清单15-9,输出如下:

成年人
小孩

        到此,Activiti的第一个应用已经成功运行,根据本小节可知,规则引擎与流程非常相似,配置的读取、规则引擎的创建、服务组件的获取方式、数据查询以及运行,与Activiti流程引擎如出一辙。如果熟悉Activiti流程引擎的话,规则引擎的API将很快掌握。

本文节选自《疯狂工作流讲义(第2版)》

京东购买地址:https://item.jd.com/12246565.html

疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397

工作流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577

本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti

© 著作权归作者所有

共有 人打赏支持
杨大仙的程序空间

杨大仙的程序空间

粉丝 910
博文 74
码字总数 125484
作品 0
广州
架构师
加载中

评论(1)

1
18856627751
rrrr
疯狂Activiti6.0连载(12)DMN规范概述

本文节选自《疯狂工作流讲义(第2版)》 京东购买地址:https://item.jd.com/12246565.html 疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397 工作流Activiti教学视频:htt...

杨大仙的程序空间
2017/10/27
0
0
疯狂Activiti6.0连载(13)DMN的XML规范

本文节选自《疯狂工作流讲义(第2版)》 京东购买地址:https://item.jd.com/12246565.html 疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397 工作流Activiti教学视频:htt...

杨大仙的程序空间
2017/11/03
0
0
Activiti6.0零编程部署工作流(一)

概述 前一篇文章《十分钟认识Activiti6.0工作流引擎》站在工程师的视角快速编码体验了一把工作流,为了更纯粹的体验Activiti提供的核心API的功能,我们在命令行交互下体验了流程审批的过程,...

JimmyNo1
06/27
0
0
十分钟认识Activiti6.0工作流引擎

概述 了解Activiti 假如你还不知道Activiti是什么,那么工作流引擎对你来说一定也是新的,解决Activiti和工作流知识盲点,所以看到到这里就对了,还有Android同学会误以为是“Activity”,工...

JimmyNo1
06/13
0
0
Activiti 6.0.0 版本正式发布,工作流引擎

Activiti 6.0.0 发布了,这是一个重大版本更新。 Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速,稳定的BPMN2流程引擎。它易于与 Spring集成使...

李玉珏
2017/08/09
3.8K
15

没有更多内容

加载失败,请刷新页面

加载更多

一步步编写自己的PHP爬取代理IP项目(二)

这一章节我们正式开展我们的爬虫项目,首先我们先要知道哪个网站能获取到免费代理IP,目前比较火的有西刺代理,快代理等,这里我们拿西刺代理作为例子。 这里就是一个个免费的IP地址以及各自...

NateHuang
27分钟前
1
0
11-利用思维导图梳理JavaSE-Java的反射机制

11-利用思维导图梳理JavaSE-Java的反射机制 主要内容 1.反射与Class类 1.1.反射概念 1.2.Class类 1.3.实例化Class类 1.4.反射的作用 1.5.Class对象的作用 2.反射的深入应用 2.1.调用无参的成...

飞鱼说编程
33分钟前
1
0
How to serve the world from home computer?

最近在开发web应用,很想知道,通过公网来访问,效果会不会好。今天在做家务的时候,突然想到,如果我自己写一个ip转发的工具,不就可以实现了吗?但是转过头一想,这么大众的想法,怎么会没...

pearma
49分钟前
1
0
今天在码云遇到一个很有意思的人 for Per.js

今天在码云遇到一个很有意思的人,他在我的Per.js项目下面评论了一句,大意为“你试试这句代码,看看速度到底是你快还是Vue快”【当然,这个评论被我手残不小心删掉了...】。 然后我就试了,...

Skyogo
今天
50
0
Java -------- 首字母相关排序总结

Java 字符串数组首字母排序 字符串数组按首字母排序:(区分大小写) String[] strings = new String[]{"ba","aa","CC","Ba","DD","ee","dd"}; Arrays.sort(strings); for (int i ...

切切歆语
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部