使用trackBy启动流程

仍然沿用Corda Services的趋势,我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次,我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。

这应该是一个相对简短的职位,因为我可以依靠之前的职位: Corda Services 101和Corda Services的 异步流程调用 。 在Corda Services的“异步流”调用中找到的内容与此帖子非常相关,并且将包含此帖子中未包含的其他信息。

这篇文章适用于Corda Open Source和Enterprise。 撰写本文时的版本为Open Source 3.2和Enterprise 3.1

trackBy简介

trackBy允许您编写在包含指定类型的状态的事务完成时执行的代码。 无论将它们作为输入还是输出,代码仍将触发。

在这里,您可以决定要执行的操作。 也许很简单,例如记录已收到状态的日志。 或者,也许更有趣的事情,例如启动新流程。 此用例对该功能非常有意义。 节点接收到新状态或消耗新状态后,便可以启动代表流程中下一个逻辑步骤的新流程。

此外,还有trackBy两个版本。 一是我一直提到的trackBy ,可以在CorDapp中使用。 另一个vaultTrackBy是使用RPC从节点外部调用的。

本文中提出的问题仅在CorDapp版本trackBy 。 因此,在本文的其余部分中,我们将不包括vaultTrackBy

这个离散的问题是什么?

僵局。 当我这样说时,它不是很离散。 但是,它的发生方式相当微妙,需要对将要解决的问题有一个很好的了解。 如前所述,此问题与Corda Services的异步流调用中详细介绍的问题非常相似。 此外,当我在项目中遇到此问题时,R3再次大喊大叫以诊断此问题,我确信他们会解决这个问题。 在此之前,如果您遇到相同的问题,这篇文章应该可以省去一些麻烦。

我将引用我在上一篇文章中写的内容,因为它的解释仅缺少关于该帖子的一点。

“ Flow Worker队列负责执行Flow执行的顺序,并在Flow添加和完成时填充并为空。 该队列对于协调节点内流的执行至关重要。 当涉及到多线程Flows本身时,这也是痛苦的根源。”

跟踪

“我为什么要谈论这个队列? 好吧,我们需要格外小心,不要将无法完成的流程填满队列。

怎么会这样 通过在正在执行的流程中启动流程,然后流程等待其完成。 直到队列的线程池中的所有线程都遇到这种情况,这才不会引起问题。 一旦发生,它将使队列陷入僵局。 没有流程可以完成,因为它们都依赖于排队的多个流程来完成。”

跟踪

那标志着我的复制面的终结。 我会继续说这句话,实际上,我建议您通读Corda Services的异步流调用,以对该主题进行彻底的解释。

这与trackBy有什么关系? 从服务调用trackBy将在Flow Worker线程上运行每个可观察的事件。 换句话说,每个事件都占据队列中的一个位置。 从此处启动Flow将向队列添加另一个项目,并挂起当前线程,直到Flow完成。 它将一直保留在队列中,直到那个时候。 如果您遇到的情况是队列中的所有位置都由可观察的事件而不是实际的流程所占据,那么我为您提供了一个词。 僵局。 这与我之前详细介绍过的情况完全相同,只是从不同的震中开始。

从好的方面来说,解决方案是小菜一碟(这句话从何而来?)。

解决问题的部分

现在您知道了问题所在。 将“中断”版本更改为可避免死锁的版本,仅需要几行。

让我们看一些与导致我踏上这个地雷的代码非常相似的代码:

每当节点收到新的MessageState时,此Service就会使用trackBy启动新的Flow。 由于前面提到的所有原因,此代码可能会死锁。 我们不知道什么时候发生,或者是否会发生。 但是,可以。 因此,我们可能应该在问题解决之前对其进行整理。

下面的代码将做到这一点:

我添加了一些注释以使更改更清晰,因为仅添加了几行。

所有这些更改所做的就是在新线程上启动Flow。 然后,这将允许当前线程结束。 请记住,这很重要,因为该线程保持在队列中的某个位置。 允许它结束,为接下来发生的事情腾出空间。 它是来自trackBy还是Flow的另一个可观察事件。 不要紧。 只要释放线程,就不会由于该代码而发生死锁。

从此线程释放您

请花一点时间来欣赏我在本节标题中所做的双关语的荣耀。 也许不是很好,但我仍然为此感到自豪。

总之,在Corda Service中使用trackBy非常适合根据已保存到节点的信息来启动新流程。 但是,从trackBy观察开始新流程时,您需要小心。 这是由于可观察到的保持在Flow Worker线程上,因此是队列中的一个点。 如果吞吐量达到更高的数量,则可能会出现节点死锁的风险。 您可能会遇到以下情况:队列被所有线程都阻塞,这些线程都在等待流完成,但队列中没有实际的流。 通过将Flow调用移动到与可观察线程不同的线程上。 您可以释放队列中曾经保留的位置。 现在,您的trackBy代码不再可能导致死锁。

这篇文章中使用的代码可以在我的GitHub上找到 。

如果您认为这篇文章有帮助,可以在Twitter上@LankyDanDev关注我,以跟上我的新文章。

翻译自: https://www.javacodegeeks.com/2018/10/starting-flows-trackby.html

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

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

相关文章

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到:SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构:第一步:整合dao层mybatis和spring整合,通过spring管理map…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作:保持团队联系,按任务执行和按时完成重大计划。 但是市场变得非常拥挤,并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉,以便它们既可行又相关…

模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序(如Kafka Streams或KSQL )中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目中可以找到…

拥抱模块化Java平台:Java 10上的Apache CXF

Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间。 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接。 总的来说, 拼图项目是一种颠覆性的变化&#xff…

建立无服务器的“ Hello World”功能

无服务器 ,功能即服务(FaaS)或仅具有云功能,就可以编写将在云中运行的代码。 您可以使用多种不同的语言(例如JavaScript(Node.js),Swift,Python,Java&#xf…

oracle 10g 分区管理,Oracle 10g分区表的自动维护

Oracle 10g分区表不支持自动化管理,一般都要手动创建分区,手动删除。今天给大家带来了一个自动化管理表空间的脚本。本脚本主要由3个部分组成:sys_ConfigTable.sql、sys_pro_AddAndDropPartition.sql、sys_pro_MergeTable.sql1、sys_ConfigTa…

java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍

java实现metro风格我上一篇关于JMetro的文章–我的都市风格的Java皮肤(或外观)是关于日历选择器控件的 。 我本打算使用Tom Eugelink不错的日历选择器,但当时我了解到它是由Oracle创建并随Java 8一起提供的,因此出于时间的考虑&am…

toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

Oracle logminer 分析redo logOracle 11g r2 RAC centos 6.5设置时间格式select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) date_format from dual ;查看数据库是否开启补全日志功能selectSUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEM…

Nutshell中的Java 8语言功能-第2部分

编者注:您也可以在此处检查Part-1。 嗨,朋友们,这是简明系列的Java 8语言功能的第2部分。 在这里,我们将讨论Java 8的以下功能: 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法? 静态方法是属…

梯度下降法、最速下降法

梯度下降法 最优化问题是求解函数极值的问题,包括极大值和极小值。相信所有的读者对这个问题都不陌生,在初中时我们就学会了求解二次函数的极值(抛物线的顶点),高中时学习了幂函数,指数函数,对…

超越函数

代数数 在数论中,超越数是指任何一个不是代数数的数字(通常它是复数)。它满足以下条件——只要它不是任何一个整系数代数方程的根,它即是超越数。最著名的超越数是e以及π。 超越数 超越数的例子 所有超越数构成的集是一个不可数…

只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

这是一个分为两部分的系列,其中我将展示如何使用Spring Boot创建分层架构。 什么是分层体系结构:简而言之,当我们构建企业应用程序时,我们维护不同的层以封装特定于层的逻辑,这样就不会溢出到另一层。 当我们考虑企业…

linux设置默认的首页文件,Linux 设置Firefox主页

Linux 设置Firefox主页在Linux系统中,当用户启动Firefox主页时,会自动打开Firefox默认设置的主页。当然,用户也可以通过Firefox的首选项,手动将Firefox主页设置为自己喜欢的或经常访问的网页。在本单元练习中,将Firefo…

向量范数与矩阵范数

一、向量的范数 1.1 定义 1.2 举例 首先定义一个向量为:a[-5,6,8, -10] 1.2.1 向量的1范数 向量的1范数即:向量的各个元素的绝对值之和,上述向量a的1范数结果就是:29,MATLAB代码实现为&…

苹果linux桌面文件夹,Ubuntu 10.04下一键安装Mac OS X主题桌面

不久前的《Ubuntu 10.04下Mac OS X风格桌面美化安装》遭到网友的砖头,认为和Mac OS X风格桌面美化安装根本没有关系。本来是要跟这篇一起发布的,一等就等了这么长,下面我们来看下在Ubuntu 10.04下一键安装Mac OS X主题桌面的工具Epidermis th…

示性函数、共轭函数、对偶范数、共轭

示性函数(Indicator function) 共轭函数 对偶范数 几个常用公式 共轭(conjugate) 所谓“轭”,指的是古代牛车上放在并行的牛脖颈上的曲木。共轭关系,通俗来说一般用以描述两件事物以一定规律相互配对或孪生(一般共轭对…

Redis-实践知识

转自极客时间Redis 亚风 原文视频:https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义,但是最好遵循下面几个实践的约定: 格式:[业务名称]:[数据名]:[id] 长度不超过44字节 不…

MicroProfile OpenAPI上的Swagger UI

MicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger-annotations ,由于OpenApi是基于Swagger构建的,因此您会感到非常熟悉。 2015年11月5日,SmartBear与3Scale&…

linux 跟踪内存,用strace跟踪malloc内存分配

strace介绍strace是一个非常有用的命令,它用于记录和跟踪程序运行期间收到的信号和调用的系统调用。strace的简单使用ubuntu64:~$ strace cat /dev/nullexecve("/bin/cat", ["cat", "/dev/null"], [/* 32 vars */]) 0brk(NULL) 0x1…