使用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,一经查实,立即删除!

相关文章

过防火墙一句话php2017,dedeCMS友情链接getshell漏洞利用

1.php//print_r($_SERVER);$referer $_SERVER[HTTP_REFERER];$dede_login str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php,取得dede后台的路径//拼接 exp$muma .;$exp tpl.php?actionsavetagfile&actiond…

java 1.8新增功能_Java 8的新增功能(第二部分-可能会出现什么)

java 1.8新增功能免责声明:我不为Oracle工作,也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”,这只是我研究的一部分。 这是由三部分组成的系列文章的第二部分。 在第一部分中 ,我谈到了Oracle正式让开发人员…

Spring应用架构

我最近收到我博客的一位读者Ajay的问题,并决定在此处分享我的答案,以帮助其他有类似问题的人。 这是来自阿杰的问题: 大卫您好,我想知道我最近遇到的两种MVC应用程序体系结构之间的区别: 1)在普通的Spri…

PHP能不能让一串代码现实,一段让你认清现实的Java代码.java

/*** 答致命三问* 终回归现实*/public static void main(String[] args) {boolean a false,b false,c false;java.util.Scanner scanner new java.util.Scanner(System.in);System.out.println(decode("5oKo5aSa6auY77yIY23vvInvvJ8"));int height 0;while (hei…

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

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

java是面向过程的编程语言吗,下列关于Java语言特点的叙述中,错误的是()。 A.Java是面向过程的编程语言B.Java支持分...

查询最近30天的记录应使用( )作为准则某企业年度主营业务收入为以下关于第一层ISP特征的描述中,错误的是测量电压时,应将数字万用表与被测电路并联。()HLAⅡ类分子主要分布于在铁碳合金相图中今年来,公务员逐渐成为广大高校毕业生所青睐的热门职业,但是报考公务员必…

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

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

ecshop 模板 php代码,ecshop无法在模板文件.dwt和.lbi中直接添加php代码的解决方法...

ecshop不能在模板文件.dwt和.lbi中直接添加php代码了,为什么呢?因为直接在模板中加入php函数和代码,没有经过过滤,容易造成安全隐患。程序源码安全是比较重要的。不过如果有朋友希望能在模板文件中直接加入.dwt和.lbi文件&#xf…

php mail 在线,在线web e-mail发送

名称:CJ Web2Mail V3.0说明:很多网站的“Contact Us ”打开的是outlook,但很多人没装。本人提供的是web发。可以给管理员发信的人自动发一封确认信,同时管理员也可以收到一封!演示:http://phptext.512j.com(左下角的“…

jstl视图_使用JSTL视图探索Spring Controller

jstl视图让我们通过对Spring MVC的Controller开发的更多探索来改进我们以前的Spring JDBC应用程序 。 我将展示另一种编写新的Controller的练习,该Controller处理HTML表单并在JSP视图页面中使用JSTL标签。 要在Spring MVC应用程序中启用JSTL,您需要将以…

php5.6 连接 oracle,XAMPP中PHP5.6.3连接Oracle

系统环境:Windows 8.1 x64PHP 5.6.3 x86Apache/2.4.10 (Win32)Oracle Database 11g Enterprise Editionxampp-win32-5.6.3-0-VC11-installer.exe 这个版本很坑爹… 在 php.ini 中只有extensionphp_oci8.dll ; Use with Oracle 10gR2 Instant Clientextensionphp_oci…

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

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

electronjs MySQL,javascript – 在Electron应用程序中使用sql.js.

我是Electron的新手.它非常棒,而且入门非常有趣而且非常简单.一段时间以来,我一直试图找到一个在我的应用程序中使用的“数据库”解决方案.当然有Web SQL /本地存储选项,但我试图使用SQLite.我找到了sql.js,它很棒且易于使用.我可以让一切正常运行放我无法保存/更新数据库文件&…

php ajax mysql 出错,MySql + PHP + Ajax的乱码问题的解决方案

现如今,基本的web2.0应用都会涉及到表现层、业务层、数据层等多个层次。在数据的来回传递中,新手一不注意就会产生汉字的乱码问题。汉字乱码主要是由于各层使用的编码、或在层间进行数据传输时使用的编码不一致造成的,釜底抽薪的解决办法就是…

读取csv文件 java_Java:逐步读取/流式传输CSV文件

读取csv文件 java我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中。 当文件的内容适合内存时,此方法有效,但对于较大的文件来说是个问题&…

php+数组转换函数是,php数组与字符串的转换函数大全

4.在字符串种中查找另外一个字符使用strpos()或strstr()函数strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。语法://string为必须,表示被搜索的字符串//find为必须,表示被查找的字…

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

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

matlab sym转str,sym struct 转换

描述:用 sym() 生成了 矩阵; 再用 solve() 结果返回 结构体,还带sym 型。。。尝试:用 struct 转换 ; eval() 什么的 都无解,, (结构体还带sym。。。。昏了)求:怎…

php $r,PHP

本文实例为大家分享了php微信跳一跳的具体代码,供大家参考,具体内容如下 ?php require config.php; function similar($rgb1, $rgb2) { $r1 ($rgb1 16) $g1 ($rgb1 8) $b1 $rgb1 $r2 ($rgb2 16) $g2 ($rgb2 8) $b2 $rgb2 return abs($r1 - $r2) 1…

java 字符串对齐_最佳字符串对齐的Java实现

java 字符串对齐有一阵子,我使用了Levenshtein distance的Apache Commons lang StringUtils实现。 它实现了一些众所周知的技巧,通过仅挂接到两个数组而不是为备忘录表分配巨大的nxm表来使用较少的内存。 它还仅检查宽度为2 * k 1的“条带”,…