trackby_使用trackBy启动流程

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

trackby

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

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

相关文章

SQL查询语句的排序

order by column1 asc, column2 desc -- 按column1升序排序,若column1值相同,则按column1降序排序asc,ascend 的缩写,表示正序,即升序,从小到大,可以省略,默认的 desc,de…

SpringBoot创建项目入门案例

目录结构 一、创建SpringBoot项目 1.创建骨架名称 2.给项目命名 3.配置pom.xml文件 4.MySql的驱动包 5.自动生成的pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xs…

apache spark_Apache Spark Job的剖析

apache sparkApache Spark是通用的大规模数据处理框架。 了解spark如何执行作业对于获取大部分作业非常重要。 关于Spark评估范式的简要介绍&#xff1a;Spark使用的是惰性评估范式&#xff0c;在该范式中&#xff0c;Spark应用程序在驱动程序调用“ Action”之前不会执行任何…

MySQL常用权限的解释

文章目录全局管理权限数据库/数据表/数据列权限特别的权限全局管理权限 FILE: 在MySQL服务器上读写文件。 PROCESS: 显示或杀死属于其它用户的服务线程。 RELOAD: 重载访问控制表&#xff0c;刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限 ALTER: 修改已…

No identifier specified for entity没有为实体指定标识符

异常 ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userController’: Injection of resour…

aws jenkins_Jenkins在AWS上(第1部分)

aws jenkins这是我对PEAT UK播客的逐字记录&#xff1a; 你好&#xff0c;再一次到另一个热点。 我叫Peter Pilgrim。 我曾经是DevOps专家&#xff0c;欢迎观看另一集。 这是11 Jenkins n AWS的第一部分&#xff0c;我是一名平台工程师&#xff0c;并且是Java Champion。 在…

SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

文章目录介绍加锁情况分析明确指定主键&#xff0c;并且数据真实存在&#xff0c;锁定行明确指定主键&#xff0c;但数据不存在&#xff0c;不加锁主键不明确&#xff0c;锁定整个表无主键&#xff0c;锁定整个表应用场景介绍 1.FOR UPDATE 加的锁是一种行级排他锁&#xff0c…

广义表

广义表(广义表也称为列表&#xff0c;是线性表的一种推广&#xff0c;也是数据元素的有序序列) 一、基础 1.如何设定链表结点?广义表中的数据元素可能为单元素(原子)或子表&#xff0c;由此需要两种结点:一种是表结点&#xff0c;用以表示广义表;一种是单元素结点&#xff0c;…

数据库各种锁详解

文章目录排他锁共享锁更新锁意向锁锁的粒度数据库自动加锁手动加锁各种锁之间的兼容问题排他锁 Exclusive Locks&#xff0c;英译&#xff1a;排他锁&#xff0c;简称 X 锁&#xff0c;又称为写锁或独占锁。排他锁分为表级排他锁和行级排他锁。 如果事务 T1 对数据行对象 A 加…

activiti dmn_新的DMN编辑器预览

activiti dmnWorkbench 7.13.0.Final于10月16日星期二发布&#xff0c;此版本带来了许多有趣的功能和重要的修复程序。 亮点之一是作为技术预览功能的新DMN编辑器&#xff0c;该功能仍在开发中&#xff0c;但您可以开始使用。 在本文中&#xff0c;您将学习如何启用DMN编辑器预…

MySQL的索引存储数据结构BTree和B+Tree的区别

文章目录BTree 原理示意图BTree 原理示意图BTree的树层级很少BTree 可以高效支持范围查找BTree 原理示意图 注&#xff1a;BTree 就是 B-Tree&#xff0c;实际上官方并没有 B-Tree 的说法。 BTree 原理示意图 BTree的树层级很少 BTree 的数据存在每个节点中&#xff0c;所以每…

jdk11 javafx_JDK 11上的JavaFX

jdk11 javafx在JFX第11版发布后&#xff0c;人们对JavaFX与JDK的解耦感到百感交集。 我们许多人认为现在是时候告别JavaFX并改用另一种GUI技术了&#xff0c;而另一些人对此情况感到高兴。 他们认为&#xff0c;将JavaFX与Oracle分离开来&#xff0c;并致力于将其作为开源社区驱…

配置Java环境变量

JAVA环境变量配置 一、新建系统变量 新建变量&#xff0c;找到安装目录新建一个JAVA_HOME,路径为bin目录的前一级目录。 可以安装多个JAVA版本&#xff0c;然后新建不同的JAVA_HOME名称&#xff0c;然后填写bin目录的前一级路径。 二、编辑环境变量 找到path,然后编辑%JAVA…

MySQL的存储引擎InnoDB,B+Tree数据结构索引的实现原理图(聚簇索引/聚集索引)

1.表数据文件本身就是按BTree组织的一个索引结构文件 2.InnoDB的BTree的索引数据结构中&#xff0c;表数据和索引数据合并在一起&#xff0c;即叶子节点包含了完整的数据记录&#xff0c;这样的索引叫聚簇索引。

idea 切换java11_Java 11就在这里,您准备好进行切换了吗?

idea 切换java11在应该将Java 9发行版“震撼我们的世界”一年之后&#xff0c;我们一直在等待的LTS版本终于出现了 我们知道&#xff0c;大多数开发人员&#xff0c;团队&#xff0c;公司等尚未通过Java 8进行更新。 即使去年发布了模块Java 9&#xff0c;随后在3月又发布了Ja…

编译Java源文件

编写 新建hello.java文件 注意类名要和文件名称相同&#xff0c;如果不相同会提示错误 public class hello{public static void main(String[] args) {System.out.println("HelloWorld");} }编译 javac hello.java 编译会生成相应的.class文件。 运行 java hell…

oracle jdk_两个Oracle JDK的故事

oracle jdk最近 &#xff0c;人们担心 Java开发人员现在会无意中使用错误的Oracle提供的JDK实现&#xff08;从JDK 11开始 &#xff09;&#xff0c; Oracle提供了开源OpenJDK的构建 &#xff0c;并且还主要基于OpenJDK源提供了商业JDK的构建。 下表比较并对比了Oracle提供的两…

安装MAVEN和找不到JAVA_HOME问题原因

一、MAVEN安装 1.将下载好的MAVEN解压 2.配置MAVEN环境变量 MAVEN_HOME3.3.9 配置path 3.配置本地仓库 打开settings.xml进行修改 在MAVEN下新建一个repository文件夹 4.配置阿里MAVEN仓库配置 每次去阿里云下载jar包 <mirror><id>AliMaven</id>&…

数据库中的二级索引_普通索引_辅助索引

普通索引、二级索引、辅助索引是同个东西。 假设有张表的字段为 name&#xff0c;这个字段添加普通索引&#xff08;也叫二级索引&#xff09;&#xff0c;其存储引擎为 InnoDB&#xff0c;那么这个 name 索引的结构图&#xff1a;

2018-12 jdk_JDK 12新闻(2018年9月13日)

2018-12 jdk由于计划于本月晚些时候&#xff08;2018年9月25日&#xff09;发布JDK 11的 一般可用性 &#xff0c;是时候开始更仔细地研究JDK 12了 。 在OpenJDK jdk-dev邮件列表上的标题为“ JDK 12的计划时间表 ”的消息中 &#xff0c; 马克赖因霍尔德 &#xff08; Mark R…