前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工作流引擎之activiti利用juel进行条件分支判断

工作流引擎之activiti利用juel进行条件分支判断

作者头像
lyb-geek
发布2018-10-24 09:55:12
11.3K0
发布2018-10-24 09:55:12
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

activiti分支判断

有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其activiti的网关有那多个,比如互斥网关、并行网关、兼容网关等等,这个给非研发的小伙伴在画流程时,带来的一定难度。在网上查找了一些例子,发现他们实现分支判断,大部分都依靠网关来实现。然而我发现其实在节点的连接线上,设置一些分支条件流转规则也可以达到效果。如下图

其BPMN文件分支内容为

代码语言:javascript
复制
<sequenceFlow id="flow2" name="&lt;=3" sourceRef="usertask1" targetRef="usertask2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days<=3}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow3" name="&gt;3" sourceRef="usertask1" targetRef="usertask3">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${days>3}]]></conditionExpression>
    </sequenceFlow>

而如果有网关时候的流程图如下图

经过代码测试发现,去除了网关,只用juel表达式也可以实现条件流转

什么是juel

其官网的定义是:JUEL is an implementation of the Unified Expression Language (EL), specified as part of the JSP 2.1 standard (JSR-245), which has been introduced in JEE5. Additionally, JUEL 2.2 implements the JSP 2.2 maintenance release specification for full JEE6 compliance. 其中文大意是:JUEL是统一表达式语言(EL)的一种实现,它被指定为JSP 2.1标准(JSR-245)的一部分,该标准已在JEE5中引入。 此外,JUEL 2.2实现了JSP 2.2维护版本规范,以实现完整的JEE6合规性。 其写法和el表达式一模一样,如${day>3}

如何利用juel表达式实现分支判断

代码实现逻辑

代码语言:javascript
复制
public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> formData) throws Exception {

        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();
        for (Object k : formData.keySet()) {
            if (formData.get(k) != null) {
                context.setVariable(k.toString(), factory.createValueExpression(formData.get(k), formData.get(k).getClass()));
            }
        }

        ValueExpression e = factory.createValueExpression(context, el, Boolean.class);
        return (Boolean) e.getValue(context);
    }

    public static void main(String[] args) throws Exception {
        String el = "${请假天数>3 && 部门 == '产品部'}";
        Map<String, Object> formData = new HashMap<>();
        formData.put("请假天数", 4);
        formData.put("部门", "产品部");
        formData.put("test", "123");
        System.out.println(checkFormDataByRuleEl(el, formData));
    }

控制台输出

代码语言:javascript
复制
true

根据juel表达式的true或者false可以很容易在代码实现分支判断

在非activiti项目中如何使用juel表达式判断

引入依赖包

代码语言:javascript
复制
<dependency>
    <groupId>juel</groupId>
    <artifactId>juel</artifactId>
    <version>2.1.0</version>
</dependency>

代码逻辑实现

代码语言:javascript
复制
public static Boolean checkFormDataByRuleEl(String el, Map<String, Object> formData) throws Exception {

        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();
        for (Object k : formData.keySet()) {
            if (formData.get(k) != null) {
                context.setVariable(k.toString(), factory.createValueExpression(formData.get(k), formData.get(k).getClass()));
            }
        }

        ValueExpression e = factory.createValueExpression(context, el, Boolean.class);
        return (Boolean) e.getValue(context);
    }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • activiti分支判断
  • 什么是juel
  • 在非activiti项目中如何使用juel表达式判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档