Camunda BPM和Flowable中的JSON处理(上)

Camunda BPM和Flowable中的JSON处理(上)

大多数使用工作流产品来自动化其业务流程的公司都需要处理JSON(JavaScript对象表示法)格式的数据。尽管JSON在ECMAScript / JavaScript中用于对象的表示,但其纯文本且紧凑的数据表示已导致2020年在几乎所有不同的平台和产品上广泛使用它。我们将研究不同的机制Camunda BPM和Flowable可以在其流行的开源工作流产品中读取,编写和存储JSON。

 

首先,简要介绍Camunda和Flowable。它们是开源工作流市场的直接竞争者,它们都提供强大而灵活的开源工作流引擎,与更主流的工作流软件选件相比,它们可以帮助用户更高效地执行大量流程实例。有趣的是,它们是相关的,都是从Alfresco的Activiti项目中派生出来的,并且都对原始代码库进行了有意义且重要的增强,以支持各自产品中日益复杂的用例。两者均分发Apache许可版本,并且均在付费版本中提供其他高级功能。

 

快速说明一下,由于每个JSON对象都可以简单地表示为字符串/文字,因此可以在两种平台中以其“字符串化”形式使用JSON。但是,这种方法很快使许多用户失败,因为(a)长的JSON字符串很快超过了两个平台中这些字符串的存储能力,并且(b)许多平台(包括Java,这两个工具都基于其构建的平台)缺乏本机支持JSON。

 

在Camunda中使用JSON

 

让我们先看看Camunda如何在其Camunda BPM产品中实现对JSON对象的读取,写入和存储。Camunda的方法是使用自己的Spin项目,该项目旨在使JSON对象的读取和写入更加容易,并且可以在任何Java项目中使用,而不仅限于Camunda BPM中。但是,在Camunda BPM中使用时,Spin提供了一种本机方式,使流程引擎可以识别JSON对象,从而允许存储非常大的JSON对象(默认情况下超过4,000个字符)。要使用Spin在JavaScript的Camunda BPM中创建JSON字符串,可以使用以下代码:

 

var SpinValues = Java.type('org.camunda.spin.plugin.variable.SpinValues');

 

var sierra = {};

sierra.displacement = 6.2;

sierra.engineType = 'V8';

sierra.forcedInduction = false;

sierra.horsepower = 420;

sierra.year = 2018;

sierra.make = 'GMC';

sierra.model = 'Sierra';

 

execution.setVariable('sierra', SpinValues.jsonValue(JSON.stringify(sierra)).create());

 

在上面的代码中,execution.setVariable('sierra', SpinValues.jsonValue(JSON.stringify(sierra)).create());

都将JavaScript对象转换为JacksonJsonNode并将变量添加到进程列表中实例变量。由于变量的类型为JacksonJsonNode,因此该变量将自动识别为Spin JSON变量。这将导致该变量作为大对象存储在ACT_GE_BYTEARRAY表中。这个大对象在不同的​​数据库中称为不同的事物。例如,在H2中,它称为LONGVARBINARY。

 

也可以使用Spin从头开始创建JSON对象;这是上面使用Java和Spin而不是JavaScript和Spin来创建JSON对象的传真:

 

SpinJsonNode sierra = Spin.JSON("{}");

sierra.prop("displacement", 6.2);

sierra.prop("engineType", "V8");

sierra.prop("forcedInduction", false);

sierra.prop("horsepower", 420);

sierra.prop("year", 2018);

sierra.prop("make", "GMC");

sierra.prop("model", "Sierra");

 

execution.setVariable("sierra", sierra);

 

要检索变量并进行内部检查,我们只需要使用execution.getVariable('sierra')调用,然后使用返回的JacksonJsonNode实例读取所需的数据即可,例如(在JavaScript中):

 

var sierra = execution.getVariable('sierra');

var make = sierra.prop('make').stringValue();

 

相关教程