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电商系统的商品关联版式功能模块设计

关联版式 1、关联版式跟着商品走&#xff0c;关联spu_ext_id&#xff0c;一对多关系 2、商城和店铺有各自的关联版式

spring nosql_使用Spring Security和NoSQL的Spring Boot

spring nosql在前面的文章中&#xff0c;我们从一个SQL数据库提供用户和权威检索自定义查询设置弹簧安全配置。 如今&#xff0c;许多现代应用程序都使用NoSQL数据库。 Spring安全性不是NoSQL数据库的现成解决方案。 在这种情况下&#xff0c;我们需要通过实现自定义UserDeta…

ofbiz修改mysql_如何将OFBIZG的默认数据库更改mysql的方法(只求参考 )

ofbiz自带的数据库是Derby,这是一种小型的适合与测试系统的数据库,但不适合在产品级系统中使用,所以通常我们需要将ofbiz迁移到其它数据库上,下面我就以如何迁移至mysql为例,向大家讲述数据库迁移过程,迁移至其它数据库的过程类似.第一步:修改entityengine.xml文件.该文件的位置…

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

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

c mysql 地址池_FreeRadius 根据mysql 下发指定地址池的地址...

一、使用radius本地文件存储IP地址。修改modules/ippoolippool main_pool {range-start 192.168.111.1range-stop 192.168.113.254netmask 255.255.255.0cache-size 800session-db ${db_dir}/db.ippoolip-index ${db_dir}/db.ipindexoverride nomaximum-timeout 0}在si…

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

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

跨境商品的进口税额显示

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

HH SaaS电商系统的跨境商品展示、下单、清关、出库全流程设计

跨境商品的展示 后补 跨境商品的下单 在订单确认页面就要按SKU拆单&#xff0c;所以跨境销售订单的主单和子单是一对一的关系 多种进口渠道的商品在同个销售主单中&#xff0c;在进口清关、收货、货款结算时会出现问题&#xff0c;假设销售订单中有2种商品&#xff0c;一种…

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

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

javaone_代理的JavaOne 2016观察

javaone我无法参加JavaOne 2016&#xff0c;因此很高兴看到在线资源众多&#xff0c;使我能够基于JavaOne 2016内容进行观察。 我在本文中引用并简要描述了其中的一些JavaOne 2016资源&#xff0c;并根据这些资源的使用添加了一些我自己的观察结果。 正如Katharine在JavaOne综述…

组合商品和商品套餐(套装)的设计

文章目录商品套餐创建商品套餐活动的交互设计组合商品创建组合商品的交互设计商品套餐 商品套餐设计成一种促销活动&#xff0c;活动结束时间不设置表示“长期有效”商品套餐是指SKU和SKU的组合套餐&#xff0c;例如&#xff1a;iphone 6s 数据线 白色iphone 6s 充电器 白色&a…

antlr 4.7.1_新ANTLR 4.6的重要更改

antlr 4.7.1自上一个主要版本发布以来&#xff0c;已经过去了将近一年的时间&#xff0c;推出了新的ANTLR版本&#xff1a; 4.6 。 有很多新闻&#xff1a;新的目标&#xff0c;更好的性能&#xff0c;更好的错误处理以及ANTLR本身开发中的一些改进。 新目标 影响最大的新闻可…

电商系统下单时商品库存和销售状态如何处理

文章目录查看购物车时商品库存问题商品被下架了如何处理价格变动了如何处理促销活动到期了如何处理提交订单时库存问题商品被下架了如何处理价格变动了如何处理促销活动到期了如何处理使用的优惠券到期了如何处理选择商品时库存问题商品被下架了如何处理价格变动了如何处理促销…

json怎么读取数据库_如何:使用Json插入数据库并从中读取

json怎么读取数据库在本文中&#xff0c;我们将为Speedment创建一个插件&#xff0c;该插件使用Gson生成序列化和反序列化逻辑&#xff0c;从而使其在数据库实体和JSON字符串之间进行映射非常容易。 这将有助于展示Speedment代码生成的可扩展性&#xff0c;同时探索Gson库的一些…

django连接mysql步骤_使用Django连接Mysql数据库步骤

链接mysql步骤第一步&#xff1a;在终端下载pymysql文件–pip install pymysql第二步&#xff1a;在gjango项目的__init__文件中添加代码import pymysqlpymysql .install_as_MySQLdb()第三步&#xff1a;找到mysql的连接源&#xff0c;然后填信息&#xff0c;如果没有mysql驱动…

HH SaaS电商系统的商品发货策略设计

什么是发货策略 用来指定商品的发货仓库的策略方案&#xff0c;我们在实际的业务开展过程中&#xff0c;同种商品不同的销售渠道也许发货仓库不同&#xff0c;同种商品同个销售渠道在不同的业务开展阶段中也许发货仓库不同&#xff0c;所以需要通过灵活配置发货策略来满足此需…

mysql 上一篇_mysql取上一篇和下一篇的查询

$id 为当前文章 ID获取文章上一篇文章&#xff1a;SELECT id FROM table WHERE id>$id ORDER BY id ASC LIMIT 1获取文章下一篇文章&#xff1a;SELECT id FROM table WHERE id查询思路&#xff1a;获取与该文章同表相连的文章&#xff0c;如果根据分类获取相应的关联文章&a…

jhipster_JHipster入门,第3部分

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

什么是UID、UED、UXD、IXD、UCD、IAD,看这篇就足够了

文章目录UID&#xff1a; User Interface Design 用户界面设计UI&#xff1a;User Interface&#xff08;用户界面&#xff09;UID&#xff08;用户界面设计师&#xff09;UID认知现状UED&#xff1a; User Experience Design 用户体验设计UE or UX&#xff1a; User Experienc…