activiti 变量_如何在Activiti中使用瞬态变量

activiti 变量

我们昨天发布的Activiti v6 Beta3中已经加入了很多需要的功能-临时变量。 在这篇文章中,我将向您展示一个示例,说明如何使用瞬态变量来覆盖一些以前不可能(或最佳)的高级用例。

到目前为止,Activiti中的所有变量都是持久的 。 这意味着将变量和值存储在数据存储中,并保留历史审核数据。 另一方面,瞬态变量的行为和行为类似于常规变量,但它们不会持久存在。 除了不持久之外,以下是瞬态变量的特殊功能:

  • 当流程实例的状态持久保存到数据库时,临时变量将一直保留到下一个“等待状态”。
  • 瞬态变量屏蔽具有相同名称的持久变量。

有关瞬时变量和API的更多详细信息,请参见文档 。

下面显示了用于演示暂态变量的某些位的过程定义。 这是一个相当简单的过程:想法是我们将向用户询问诸如关键字和语言之类的东西,并使用它来进行GitHub API调用。 如果成功,结果将显示给用户。 为此很容易编写一个UI(或使用Beta3 angularJS应用程序中的新表单 ),但是在这篇文章中,我们将只关注代码。

可以在以下Github存储库中找到BPMN 2.0 xml和代码: https : //github.com/jbarrez/transient-vars-example

屏幕截图-自2016-09-01-114450

让我们一起完成整个过程。 该过程首先从用户提供一些有关应搜索内容的输入开始(通常这将使用开始表格来完成)。

repositoryService.createDeployment().addClasspathResource("process.bpmn20.xml").deploy();Map<String, Object> variables = new HashMap<String, Object>();
variables.put("keyWord", "workflow");
variables.put("language", "java");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("githubsearch", variables);

我们在启动流程实例时传递的变量是常规变量。 它们将被保留,并且将保留审核历史记录,因为没有理由不应该这样做。

执行的第一步是“执行HTTP调用”步骤,这是带有Java委托的服务任务:

<serviceTask name="Execute HTTP call" activiti:class="org.activiti.ExecuteHttpCallDelegate"></serviceTask>

Java代码:

public class ExecuteHttpCallDelegate implements JavaDelegate {public void execute(DelegateExecution execution) {String keyword = (String) execution.getVariable("keyWord");String language = (String) execution.getVariable("language");String url = "https://api.github.com/search/repositories?q=%s+language:%s&sort=starsℴ=desc";url = String.format(url, keyword, language);HttpGet httpget = new HttpGet(url);CloseableHttpClient httpclient = HttpClients.createDefault();try {CloseableHttpResponse response = httpclient.execute(httpget);execution.setTransientVariable("response", IOUtils.toString(response.getEntity().getContent(), "UTF-8"));execution.setTransientVariable("responseStatus", response.getStatusLine().getStatusCode());response.close();} catch (Exception e) {e.printStackTrace();}}}

在这里,我们使用在流程实例启动时传递的'keyword'和'language'变量,针对GitHub API进行了简单的HTTP获取。 此处的特殊之处在于第16和17行,我们将响应和响应状态存储在瞬态变量中(这就是setTransientVariable()调用)。 选择瞬态变量的原因是

  • Github API的json响应非常大。 当然,它可以以持久的方式存储,但这不会提高性能。
  • 从审计的角度来看,整个响应的意义很小。 稍后,我们将从响应中提取重要的位,并将这些位存储在历史数据中。

得到响应并将其存储在瞬态变量中之后,我们通过排它网关。 序列流如下所示:

<sequenceFlow ... ><extensionElements><activiti:executionListener event="take" class="org.activiti.ProcessResponseExecutionListener"></activiti:executionListener></extensionElements><conditionExpression xsi:type="tFormalExpression"><![CDATA[${responseStatus == 200}]]></conditionExpression>
</sequenceFlow>

请注意,对于顺序流动条件,使用瞬态或非瞬态变量没有区别。 常规的getVariable还将返回带有名称(如果已设置)的瞬态变量(这是上述文档中的阴影部分)。 当只应查询瞬态变量集时,也存在getTransientVariable 。 无论如何:对于条件:完全没有区别。

您还可以看到序列流具有一个(在图中隐藏的)执行侦听器。 执行监听器将解析json响应,选择相关位并将其存储在瞬态数组列表中。 这很重要,因为您将在代码下方阅读。

public class ProcessResponseExecutionListener implements ExecutionListener {private ObjectMapper objectMapper = new ObjectMapper();public void notify(DelegateExecution execution) {List<String> searchResults = new ArrayList<String>();String response = (String) execution.getVariable("response");try {JsonNode jsonNode = objectMapper.readTree(response);JsonNode itemsNode = jsonNode.get("items");if (itemsNode != null && itemsNode.isArray()) {for (JsonNode itemNode : (ArrayNode) itemsNode) {String url = itemNode.get("html_url").asText();searchResults.add(url);}}} catch (IOException e) {e.printStackTrace();}execution.setTransientVariable("searchResults", searchResults);}}

将列表存储为瞬时变量的原因很重要。 如您在图中所看到的,接下来是一个多实例子流程。 子流程通常需要一个集合变量来创建实例。 到目前为止,这是一个持久变量,采用Java序列化 ArrayList的形式。 我从来没有喜欢过它(如果以前必须将委托表达与bean一起使用)。 这总是让我有些困扰。 现在,arraylist是临时的,不会存储在数据存储中:

<subProcess name="subProcess"><multiInstanceLoopCharacteristics isSequential="false" activiti:collection="searchResults" activiti:elementVariable="searchResult" />

请注意,上面的“ searchResult”变量将是一个持久变量。

请注意,在达到用户任务并将状态存储在数据存储中之前,瞬态变量将一直存在。 在启动流程实例时也可以传递瞬态变量(这在这里可以是一种选择,但是我认为存储用户输入是您想要的审计数据内容)。

例如,如果要像这样运行流程实例:

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("keyWord", "workflow");
variables.put("language", "java");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("githubsearch", variables);List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
for (Task task : tasks) {System.out.println("Current task : " + task.getName());
}

作为示例输出(限于5个结果):

当前任务:查看结果https://github.com/Activiti/Activiti
当前任务:查看结果https://github.com/twitter/ambrose
当前任务:查看结果https://github.com/azkaban/azkaban 当前任务:查看结果https://github.com/romannurik/AndroidDesignPreview 当前任务:审查结果https://github.com/spring-projects/spring-xd

用户现在可以查看每个结果的详细信息并继续该过程。

最后的话

您可以想象,瞬时变量有很多用例。 我知道对于很多人来说这是一个重要的功能,所以我很高兴现在它已经面世了。 像往常一样,当然也欢迎您提供反馈和意见!

翻译自: https://www.javacodegeeks.com/2016/09/use-transient-variables-activiti.html

activiti 变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

erosa mysql_MySQL协议和canal实现

前言前面的文章里&#xff0c;我们了解到 canal 可以从 MySQL 中感知数据的变化。这是因为它模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;从而实现了主从复制。正是了解到这一点&#xff0c;笔者有两个问题便一直萦绕于心&#xff1a;它是如何…

HH SaaS电商系统的供应商系统设计

供应商信息结构图 供应商类型 商城的供应商划分为专享型、共享型两种&#xff0c;但是租户和店铺供应商则都是“专享型”的。 共享型供应商发布的商品归属供应商自己的&#xff0c;商品档案供应商才有资格管理&#xff0c;所以spu_base需要保存供应商id&#xff0c;有供应商id…

aws faas_带有AWS Lambda和Java的无服务器FaaS

aws faas什么是无服务器架构&#xff1f; 无服务器架构在由第三方完全管理的临时容器中运行自定义代码。 自定义代码通常只是完整应用程序的一小部分。 也称为函数 。 这为无服务器架构提供了另一个名称&#xff0c;即功能即服务 &#xff08;FaaS&#xff09;。 该容器是短暂的…

跨境商品的进口税额显示

跨境商品的采购类型有三种&#xff1a;直邮、保税、一般贸易&#xff0c;而一般贸易的商品已经清关入境了&#xff0c;虽然是跨境商品&#xff0c;但是无需再清关&#xff0c;所以商品详情页无需显示进口税相关信息。 直邮跨境商品显示的进口税信息如下图所示&#xff1a; 保税…

coreldraw x8段落_CDR X8设置自定义文字为默认字体(二)

通过上一篇文章的介绍&#xff0c;我们已经了解到了在CorelDRAW中如何自定义设置默认字体&#xff0c;相关阅读可参阅&#xff1a;CDR X8设置文字为默认字体。其实在CorelDRAW软件中给用户提供方式不止是一种&#xff0c;本文将介绍更多关于设置默认字体的方法。1. 打开CorelDR…

jhipster_JHipster入门,第3部分

jhipster欢迎回到本JHipster教程系列&#xff01; 在第一部分中&#xff0c;我们介绍了如何创建整体应用程序。 在第二部分中 &#xff0c;我们逐步创建了一个微服务应用程序&#xff08;这有点复杂&#xff09;。 对于那些正在努力使JHipster正常运转的人&#xff0c;我想着重…

jhipster_JHipster入门,第2部分

jhipster所以你回来了&#xff01; 在本系列的最后一部分中 &#xff0c;我们采用了单片路线创建了一个JHipster应用程序。 这是红色药丸路线&#xff1b; 生活几乎与您习惯的一样。 但是也许您喜欢挑战。 也许您想超越红色药丸并尝试蓝色药丸。 在这种情况下&#xff0c;Blue…

HH SaaS电商系统的虚拟资金账户(钱包余额)设计

文章目录方案一&#xff0c;将资金账户抽象出来虚拟资金账户余额流水记录实体方案二&#xff0c;用户表直接保存资金余额余额流水记录实体方案一&#xff0c;将资金账户抽象出来 虚拟资金账户 P.S. 如果机构代码和消费代码有区分类型&#xff0c;那么资金账户表中就不必保存“…

jhipster_jHipster入门,第1部分

jhipster因此&#xff0c;您想保持技术的领先地位&#xff0c;但对所有活动部件感到不知所措。 你真幸运&#xff01; 这就是jHipster发光的地方。 如果您喜欢Ruby on Rails或Grails的方法来快速启动和运行应用程序&#xff0c;那么这可能是适合您的选择。 jHipster旨在使设置…

java基准测试_微基准测试进入Java 9

java基准测试我已经几个月没有在这里写文章了&#xff0c;这种例外还会继续。 我计划在明年三月左右恢复写作。 本文末尾的说明。 等待&#xff01; 不完全是最后&#xff0c;因为您可以向下滚动。 它在文章结尾处。 继续阅读&#xff01; 三年前&#xff0c;我在写有关Java编…

python周天为一周的开始_从两个月减肥四十斤说起,不懈坚持,才是一个人最核心的竞争力。...

大学毕业了十年&#xff0c;我的身材失控了十年。我对我的胖身材已经习以为常了十年了&#xff0c;我从来没想过改变&#xff0c;因为我也没有毅力改变。有一句话说的&#xff0c;人越胖&#xff0c;就越懒。因为我胖&#xff0c;所以我不跑步&#xff0c;我也不爱外出。只要你…

java实现线程的方式_java多线程实现的四种方式

java多线程实现的四种方式1、继承Thread类&#xff0c;重写run方法(其实Thread类本身也实现了Runnable接口)2、实现Runnable接口&#xff0c;重写run方法3、实现Callable接口&#xff0c;重写call方法(有返回值)4、使用线程池(有返回值)1、继承Thread类&#xff0c;重写run方法…

本地运行flowable_在CockroachDB上运行Flowable

本地运行flowable什么是CockroachDB&#xff1f; CockroachDB是一个我一直关注了很长时间的项目。 这是一个开放源代码的Apache 2许可数据库&#xff08; Github链接 &#xff09;&#xff0c;该数据库在很大程度上汲取了Google Spanner白皮书的启发 。 它的核心是可水平扩展的…

win10禁用驱动程序强制签名_图文细说 win10系统未检测到第三个监视器的途径 -win10使用教程...

据统计调查&#xff0c;好多朋友都在为图文细说 win10系统未检测到第三个监视器的途径 的问题而烦恼&#xff0c;小编决定将解决的办法分享给大家。对于电脑菜鸟而言看到图文细说 win10系统未检测到第三个监视器的途径 是很无奈的&#xff0c;试着独自一个人解决图文细说 win10…

安装openstack_午餐前如何安装OpenStack Cloud

安装openstack图1. QuickStart的内部工作原理 云安装程序 如果我告诉您可以在必须停下来吃午餐之前进行OpenStack Cloud环境设置&#xff0c;该怎么办&#xff1f; 您会感到惊讶吗&#xff1f; 你今天可以做吗&#xff1f; 在大多数情况下&#xff0c;我敢打赌您的答案是不…

5e怎么绑定一键跳投_怎么开通淘宝亲情账号 淘宝亲情账号申请步骤【详解】

据官方消息&#xff0c;淘宝将在2月1日上线“亲情账号”功能。那么 淘宝亲情账号怎么开通?在哪申请? 下面为大家介绍下&#xff0c;一起来看看。亲情账号用户在淘宝账号中可以创建“父亲”或“母亲”角色关系&#xff0c;对父母发出注册邀请或直接绑定他们的账号。完成亲情关…

windows功能_你的Windows杀毒软件有这个功能吗?

安全软件首推-火绒&#xff0c;良心之作。比起360安全卫士、腾讯电脑管家&#xff0c;它无广告&#xff0c;无捆绑&#xff0c;无劫持&#xff0c;无弹窗&#xff0c;还免费。我认为最喜人最贴心的功能属它的‘弹窗拦截’了&#xff0c;可以拦截程序推送烦人的弹窗。五大浓缩亮…

base64 二进制流java_读取和base64编码二进制文件

我m trying to read a binary file from the filesystem and then base64 encode it in JavaScript. I使用FileReader API读取数据并找到base64编码器here .我的代码似乎接近工作&#xff0c;问题是生成的base64数据是错误的 . 这是我到目前为止所得到的&#xff1a;function s…