文档章节

疯狂Activiti6.0连载(15)DMN规则匹配表达式

杨大仙的程序空间
 杨大仙的程序空间
发布于 2017/11/15 08:58
字数 1659
阅读 1751
收藏 54
点赞 1
评论 2

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

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

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

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

DMN规则匹配表达式

        规则引擎中的输入参数与输出结果,可以在inputExpression元素下使用MVEL表达式,这样就意味着在规则匹配以及结果处理上,都使得规则引擎变得很灵活,本小节将以MVEL为基础,讲述Activiti规则引擎在匹配上的原理。

MVEL表达式简介

        MVEL是一款基于Java程序的表达式语言,它支持大部分的Java语法,当前版本为2.0。使用MVEL,可以在XML文档中实现获取属性值、进行运算、设置结果等功能,除此之外,还可以对其进行扩展,实现更为复杂的需求。目前很多开源项目都使用了MVEL表达式,例如Drools、Apache Camel等框架。Activiti规则引擎中也使用了MVEL,因此允许在DMN文件使用跟以下代码片断类似的表达式:

person.name == ‘Angus’ && person.age == 30

        以上表达式判断person对象的name属性值是否为“Angus”以及age属性值是否为30,表达式的执行结果为true或者false。本小节将先讲述MVEL的简单使用。

执行第一个表达式

        下面编写一个最简单的表式,使用MVEL的API进行编译与执行,见代码清单15-13。

        代码清单15-13:codes\15\15.5\mvel-test\src\org\crazyit\activiti\FirstTest.java

    // 进行编译
    Serializable compiledExpression = MVEL
        .compileExpression("personName == 'Angus'");
    // 设置执行参数
    Map<String, String> params = new HashMap<String, String>();
    params.put("personName", "Angus");
    // 执行表达式并返回结果
    Boolean result = MVEL.executeExpression(compiledExpression, params,
        Boolean.class);
    // 控制台输出结果
    System.out.println("表达式第一次执行结果:" + result);
    // 传入其他 参数,结果将为false
    params.put("personName", "Paris");
    // 再次执行表达式
    result = MVEL.executeExpression(compiledExpression, params,
        Boolean.class);
    // 输出结果
    System.out.println("表达式第二次执行结果:" + result);

        代码清单15-13的粗体字代码,使用了MVEL的API进行表达式编译和执行。先编译了“personName == ‘Angus’”的表达式,表示personName这个运行参数的值是否为“Angus”,在运行时,传入参数Map即可。代码清单15-13执行了两次表达式,第一次执行结果为true,第二次传入了不等的参数,因此执行结果为false。运行代码清单15-13,输出结果如下:

表达式第一次执行结果:true
表达式第二次执行结果:false

使用对象执行表达式

        MVEL表达式中,也支持传入对象,并可以获取对象的值或者方法返回值来进行运算,代码清单15-14中的表达式,使用了Java对象。

        代码清单15-14:codes\15\15.5\mvel-test\src\org\crazyit\activiti\ObjectTest.java

        // 进行编译
        Serializable compiledExpression = MVEL
                .compileExpression("person.name == 'Angus' && person.age == 30");
        // 设置执行参数
        Map<String, Object> params = new HashMap<String, Object>();
        // 设置名称与年龄均符合条件
        Person p = new Person();
        p.setName("Angus");
        p.setAge(30);
        params.put("person", p);
        // 执行表达式并返回结果,输出为true
        Boolean result = MVEL.executeExpression(compiledExpression, params,
                Boolean.class);
        System.out.println("第一次执行表达式结棍:" + result);
        // 修改参数年龄
        Person p2 = new Person();
        p2.setName("Angus");
        p2.setAge(20);
        params.put("person", p2);
        // 重新执行表达式,结果false
        result = MVEL.executeExpression(compiledExpression, params,
                Boolean.class);
        System.out.println("第二次执行表达式结果:" + result);

        代码清单15-14中,执行的表达式为,person实例的name属性值是否为“Angus”,并且person的age属性值为30,这两个条件都符合时,表达式返回true。代码清单15-14中的粗体字代码,分别执行了两次表达,第一次的参数完全符合条件,第二次执行的参数age不符合条件,最终输出false。执行代码清单15-14,输出结果如下:

第一次执行表达式结棍:true
第二次执行表达式结果:false

规则引擎规则匹配逻辑

        在DMN文件中定义规则的输入参数和输出结果的时候,可以在text元素下面写入MVEL表达式,以下代码片断为rule元素定义:

            <rule>
                <inputEntry id="inputEntry1">
                    <text>
                        <![CDATA[ 
                            执行匹配的MVEL表达式
                        ]]>
                    </text>
                </inputEntry>
                <outputEntry id="outputEntry1">
                    <text>
                        <![CDATA[  
                            处理输出结果的MVEL表达式
                        ]]>
                    </text>
                </outputEntry>
            </rule>

        以上代码片断的粗体字代码,在inputEntry下的text元素,可以使用MVEL表达式,但要注意的是,该表达式的结果必须为Boolean类型,因为该表达式决定规则是否匹配。在outputEntry下的text元素,同样可添加MVEL表达式,该表达式的计算结果就是规则的返回结果,注意要与决策表的输出结果类型相匹配,请见以下代码片断:

            <output id="outputId" label="Output 1" name="myResult" typeRef="number" />
            <rule>
                <inputEntry id="inputEntry1">
                    <text>
                        <![CDATA[ 
                            执行匹配的MVEL表达式 
                        ]]>
                    </text>
                </inputEntry>
                <outputEntry id="outputEntry1">
                    <text>
                        <![CDATA[  
                            输出结果的MVEL表达式,要返回数字
                        ]]>
                    </text>
                </outputEntry>
            </rule>

        以上代码片断的粗体字代码,定义了输出结果的类型为“number”,如果匹配到的规则,输出结果的MVEL表达返回的是字符串,则会报出异常。

        Activiti规则引擎在读取inputEntry配置的MVEL表达式时,会进处理,将输入参数的名称添加到配置的MVEL表达式前面,组合成新的表达式让MVEL去执行,在组合成新的表达式时,会有两种处理方式,请见代码清单15-15。

        代码清单15-15:codes\15\15.5\dmn-mvel\resource\dmn\GetExpression.dmn

            <rule>
                <inputEntry id="inputEntry1">
                    <text>
                        <!-- 生成的表达式为 personName.equals('Angus')  -->
                        <![CDATA[ 
                            .equals('Angus')  
                        ]]>
                    </text>
                </inputEntry>
            </rule>
            <rule>
                <inputEntry id="inputEntry2">
                    <text>
                        <!-- 生成的表达式为  personName == 'Angus'  -->
                        <![CDATA[ 
                            == 'Angus'  
                        ]]>
                    </text>
                </inputEntry>
            </rule>

        代码清单15-15中定义了两个规则,第一个规则定义的MVEL表达式为“.equals”,此种情况下,Activiti会自动生成“personName.equals”这样的语句,personName是输入参数的名称。第二个规则定义的表达式为“== ‘Angus’”,则Activiti会自动生成“personName == ‘Angus’”,即自动加上参数名称与一个空格。对比这两种情况可知,Activiti会根据我们定义的表达式是否以“.”(点)开头,然后分别作两种处理。在写规则的MVEL表达式时,要注意这个细节。

本文节选自《疯狂工作流讲义(第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

© 著作权归作者所有

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

杨大仙的程序空间

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

评论(2)

杨大仙的程序空间
杨大仙的程序空间

引用来自“闲大赋”的评论

支持一下

回复@闲大赋 : 感谢支持
闲大赋
闲大赋
支持一下
JavaScript 表单验证—正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。[正则表达式]...

夜寒曦 ⋅ 06/08 ⋅ 0

supermy/dmn-rest

决策表引擎 dmn-engine 简介 决策表引擎dmn engine;rest api 方式提供服务; 通过集群提升 QPS 能力。 特点 Rest Api 方式提供服务; 在线发布与更新 dmn table; 支持 drd; 适用场景 1.精准...

supermy ⋅ 2017/09/14 ⋅ 0

Asterisk拨号计划之匹配规则和优先级详解

Asterisk拨号计划简介 自己查资料 2. Asterisk配置 先添加SIP分机 801,用软电话注册分机后,修改801分机的context=test-inc ,因为我们下面要探究Asterisk 基于类似正则表达式的匹配以及inc...

武汉赢卓通讯 ⋅ 2013/07/26 ⋅ 0

正则表达式入门(一)常用元字符

常用元字符 例子: hi, what are you doing? candy? 匹配单词的开始处或结尾处 如何正确的匹配?我们可以使用来匹配,但是如果要匹配的单词是: 等单词,那么使用就不能精确匹配出,所以我们可...

老吴头 ⋅ 04/17 ⋅ 0

正则表达式简明笔记

正则表达式描述了一种字符串的匹配模式,可以用来检查一个串是否含有某子串,或是特定字符串是否匹配特定规则. 换句话说就是记录文本规则的一段代码。其目的在于精确地过滤字符,找到想要的字符...

奇葩界张三 ⋅ 2017/04/19 ⋅ 0

Java --正则表达式

最近处于工程尾期,抽出点时间来学习下工程中用到的知识点。 1.正则表达式作用: 它使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。 举例:在很多文本编辑器里,正则表达式被用...

求是科技 ⋅ 2015/10/30 ⋅ 0

解读C#正则表达式

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。 此...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

js 正则表达式 replace 和 match

test方法 检索字符串中指定的值。返回 true 或 false。 如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。...

阿豪boy ⋅ 02/16 ⋅ 0

正则表达式入门学习

一、课程目标: 明白正则表达式是什么,并对它有一些基本的了解,在使用时更有目的的去查找,或者修改、编写。 二、正则表达式到底是什么? 1、在编写JS验证条件时,经常会有查找符合某些复杂...

星辰~ ⋅ 2012/02/15 ⋅ 0

一个不错的VIM正则对照表

序号 入门教程 Vim 备注 1 b是正则表达式规定的一个特殊代码……代表着单词的开头或结尾,也就是单词的分界处 没有直接对应的。 <,表示单词的起始; >,表示单词的结 要查找单词hi,要用 2 ...

i33 ⋅ 2012/11/19 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 14分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 39分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部