科尔达服务101

我今天想写一篇简短的要点文章。 我真的很好奇我能多快出版此书。 所以走吧

这篇文章是关于Corda Services(使用Corda 3.2版)的。 这些是什么? 作为经常使用Spring的开发人员,我个人会说它们就像Beans。 Spring Beans可以做的还很多,但是从根本上讲,它们非常相似。 无论如何,让我们停止谈论Spring,而专注于Corda。

科尔达服务

您需要知道的最低限度

Corda服务是Flow外部的类,当前只能从正在执行的Flow或其他服务(依次由Flow调用)中调用。 与subFlow相似,它们允许您重用代码,但出于不同的原因应使用它们。 例如,库查询功能的集合或节点内的启动trackBy 。 这些都是我倾向于使用服务的方式。

Corda服务是通过使用@CordaService批注以及扩展SingletonSerializeAsToken来定义的。 完成此操作后,在加载Cordapp并启动节点时,将初始化您刚刚定义的服务:

@CordaService
class MessageRepository(private val serviceHub: AppServiceHub) : SingletonSerializeAsToken() {private companion object {val log = loggerFor()}init {log.info("I am alive!")}fun findAll(pageSpec: PageSpecification): Vault.Page =serviceHub.vaultService.queryBy(QueryCriteria.LinearStateQueryCriteria(), pageSpec)
}

serviceHub提供对您所需一切的访问。 在此示例中,服务访问vaultService以从节点的保管库检索状态。

现在可以根据需要在Flows或其他服务中使用它。 以下摘录摘自我的流程之一:

private fun repository() = serviceHub.cordaService(MessageRepository::class.java)

serviceHub适用于所有流量,并提供cordaService功能。 对于输入,它需要您尝试检索的服务的类。 在这种情况下,正在加载MessageRepository

一点点更多信息

这就是开始使用Corda Services所需的全部。 但。 我会为您提供更多信息,以便您不会犯一些与我相同的错误。

第一课。 从Flow调用服务时。 不要将其注入Flow的构造函数中。 而是从call函数内部的任何位置或此后使用的任何其他函数调用它。 如果您不这样做,则会看到以下错误消息:

java.lang.IllegalStateException: This can only be done after the flow has been started.

上面是从测试调用Flow时会得到的错误。 如果从RPC调用,您将得到以下内容:

Caused by: java.lang.reflect.InvocationTargetException: null
Caused by: java.lang.IllegalStateException: This can only be done after the flow has been started.

根据您选择的Web框架,可能具有较长的stacktrace。

目前尚不清楚,在这一点上注入服务会导致这些错误,并且您可能会发现它们是由于其他原因而弹出的。 但是,至少在Corda 3.2 ,我认为可以肯定地说,您不应在构造函数内部或Flow初始化期间执行任何操作。

为了使这一点更加清楚,下面是在较早的代码片段中插入了该服务的代码:

@InitiatingFlow
@StartableByRPC
class ReplyToMessagesFlow : FlowLogic<List>() {@Suspendableoverride fun call(): List {return messages().map { reply(it) }}private fun messages() =repository().findAll(PageSpecification(1, 100)).states.filter { it.state.data.recipient == ourIdentity }private fun repository() = serviceHub.cordaService(MessageRepository::class.java)@Suspendableprivate fun reply(message: StateAndRef) = subFlow(SendMessageFlow(response(message), message))private fun response(message: StateAndRef): MessageState {val state = message.state.datareturn state.copy(contents = "Thanks for your message: ${state.contents}",recipient = state.sender,sender = state.recipient)}
}

如您所见,该服务被注入到repository函数中,该函数又被call 。 按照这种结构,一切都将正常工作。

第二课。 不要忘记在服务的构造函数中包含serviceHub: AppServiceHub (可以随意调用serviceHub )。 如果不这样做,它将不会创建服务,并且在尝试访问该服务时会弹出以下错误消息:

Caused by: java.lang.IllegalArgumentException: Corda service com.lankydanblog.tutorial.services.MessageRepository does not exist

尽管在这种情况下有一线希望……您极不可能这样做。 因为没有AppServiceHub实例,使用您自己的服务实际上无能为力。 您将无权访问Vault或任何其他内置服务。 所以,总的来说,这一课是毫无意义的,但我仍然陷入了这个陷阱……

这就是全部?

该死,我想我实际上曾经写过一篇短篇文章! 是好还是坏? 我不是100%确定...

无论如何,我非常努力地想想更多的信息片段。 但是我不能。 使Corda Service正常工作的最低限度的确很容易。

话虽这么说,在过去的几周中,我了解到您可以在Flows中无法完成的服务中完成一些非常酷而有用的工作。 我希望在某个时候涵盖这一主题!

结论

Corda Services允许您在Flow外部创建类,在此您可以在逻辑上对与Flow的执行没有直接关系的代码进行分组。 我最喜欢的使用服务的方法是将保管库查询功能分组到一个类中(这与我在Spring世界中所做的差不多)。 您需要采取一些步骤来确保正确创建服务。 首先,使用@CordaService对其进行@CordaService并扩展SingletonSerializeAsToken 。 其次,确保以正确的方式将它们注入到Flow中,除了构造函数(或Kotlin中的init )以外,几乎在任何地方都没有。 最后,请记住在服务的构造函数中包含AppServiceHub 。 一旦能够使用Corda服务,就可以将代码从Flow中分离出来。 不仅使流程更短,而且使流程更易于理解,同时增加了您花费宝贵时间编写的代码的可重用性。

这篇文章使用的代码可以在我的GitHub上找到 。 该存储库中还有很多内容未包含在本文中。

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

翻译自: https://www.javacodegeeks.com/2018/08/corda-services-101.html

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

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

相关文章

intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

intent隐式和显式我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 &#xff0c;他建议对于某些关系类型&#xff0c;我们对关系的方向不那么感兴趣&#xff0c;因此可以在查询时忽略它。 他使用以下示例显示Neo Technology和GraphAware之间的合作关系&#xff1a; 两家…

mysql读写分离 存储过程_基于maxscale的读写分离部署笔记

使用maxscale搭建的读写分离架构&#xff0c;后期还可以再结合MHA做master的故障转移&#xff0c;这样业务层面上不需要做任何的改动即可。基于connect方式的不要使用。从库延迟他还会继续分发请求过去&#xff0c;暂时不适合生产使用。实验演示&#xff1a;目前的主从结构&…

python读书笔记2000_流畅的Python读书笔记

特殊方法的存在是为了Python解释器调用的&#xff0c;你自己并不需要去调用他们&#xff0c;比如说my_object.len()这种写法是没有的&#xff0c;应该使用len(my_object)。在使用len(my_object)的时候&#xff0c;如果my_object是一个自定义类的对象&#xff0c;那么Python会自…

antd 3升级命令_是时候拥有一个你自己的命令行工具了

本篇博客主要介绍了如何使用commander, inquirer以及chalk从零开始&#xff0c;创建属于自己的命令行工具。0. 一分钟体验首先我们先花一分钟的时间&#xff0c;体验一下创建自己的命令行cli工具是什么感觉。0.1. 新建项目目录假如我们的项目名称叫hello-cli&#xff0c;使用如…

找不到要去的声明_老汉将行李袋交由他人看管 去了一趟卫生间找不到人了.........

春节走亲访友难免多喝两杯&#xff0c;但酒后乘车却容易造成财物遗失。目前正值春运返程高峰&#xff0c;从沧州女儿家返程回山东老家的蔡先生就因为中午多喝了几杯酒&#xff0c;便将装有12000元生活费的行李袋弄丢了。好在沧州火车站派出所民警最终将蔡先生的失物找回&#x…

java可视化压缩_web可视化技术发展(1/6)

EverCraft一直在关注Web可视化技术的发展&#xff0c;在本系列文章里&#xff0c;小编将对国外一篇感觉很不错的综述性文章进行翻译&#xff0c;供这一领域的爱好者相互学习。这篇paper的信息为&#xff1a;“Mwalongo, F., et al., State-of-the-Art Report in Web-based Visu…

屏幕坏点检测图片_电视屏幕出现坏点?行家会这样做!

液晶电视经常会有几个亮点或暗点&#xff0c;这些通常被称为电视坏点。作为强迫症患者&#xff0c;面对这些屏幕坏点我们应该怎么做&#xff1f;下面跟小智聊聊这个问题吧&#xff01;首先&#xff0c;坏点形成的原因首先是因为液晶屏幕由很多点组成&#xff0c;每个点由RGB三原…

Java:GraalVM数据库流性能

GraalVM是JVM块的新成员。 它是一个开源虚拟机&#xff0c;能够同时运行多种编程语言&#xff0c;例如Java&#xff0c;Rust和JavaScript。 GraalVM还有一个新的内部代码优化器管道&#xff0c;在某些情况下&#xff0c;与其他JVM相比&#xff0c;它可以显着提高性能。 了解如何…

kubelet启动失败_kubelet 架构浅析

一、概要kubelet 是运行在每个节点上的主要的“节点代理”&#xff0c;每个节点都会启动 kubelet进程&#xff0c;用来处理 Master 节点下发到本节点的任务&#xff0c;按照 PodSpec 描述来管理Pod 和其中的容器&#xff08;PodSpec 是用来描述一个 pod 的 YAML 或者 JSON 对象…

shell 提取sql 的字段名表名_SQL代码风格规范

作为新时代SQL Boy&#xff0c;大部分时间都是在写sql&#xff0c;很多时候看到别人写的代码实在是不规范&#xff0c;命名随便写&#xff0c;没有缩进&#xff0c;看起来很没有逻辑性&#xff0c;今天分享下我自己的一些规范&#xff0c;从这里修改而来。--名称&#xff1a;xx…

亚马逊ec2 实例删除_亚马逊免费使用套餐:在EC2 Linux实例上安装Tomcat 7

亚马逊ec2 实例删除Amazon Web Services提供了12个月的免费使用期限&#xff0c;使开发人员可以在云中运行任何他们想要的东西。 免费层包括14个服务&#xff0c;其中Web开发人员最关注EC2服务。 EC2是一项服务&#xff0c;通过停止和启动Windows和/或Linux的虚拟实例来提供可调…

使用混合多云每个人都应避免的3个陷阱(第4部分)

每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您被告知这是确保业务数字化未来的一种方式。 您必须做出的这些选择不会排除提高客户体验和敏捷交付这些应用程序的日常工作。 让我们开始一段旅程&#xff0c;仔细研…

Java,JavaFX的流畅设计风格拨动开关

嗨&#xff0c;这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来变得非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中&#xff0c;我谈到了切换开…

python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

Python爬虫解析多级嵌套json最近刚接触Python爬虫&#xff0c;正好最近肺炎在全国蔓延&#xff0c;所以准备从网站爬取肺炎实时数据&#xff0c;并解析自己想要的数据。获取json数据网址为 https://m.look.360.cn/events/feiyan爬取网址&#xff1a;def main():urlhttps://m.lo…

如何使用vps 异地组网_使用ZEROTIER异地组建内网(局域网)

一、注册账号(该网站打开比较慢&#xff0c;但并不影响组网后的网速)二、建立虚拟局域网网(获取Network ID)1.选择菜单栏的Networks菜单2.选择创建网络3.注意获取到的Network ID(需要在每台组网的电脑上加入这个network id)4.大部分设置默认就可以了.三、下载软件点菜单中的Dow…

编写一个watchdog.sh脚本_五大原因!为何要将Jupyter Notebook转换为python脚本?

全文共3360字&#xff0c;预计学习时长9分钟图源&#xff1a;unsplash大多数数据科学在线课程都把Jupyter Notebook作为教学媒介&#xff0c;这是因为初学者在Jupyter Notebook的单元格中编写代码&#xff0c;比编写包含类和函数的脚本更容易。另一个原因在于它使浏览和绘制数据…

java 多线程 总结_Java 多线程总结

昨天熬了个通宵&#xff0c;看了一晚上的视频&#xff0c;把java 的多线程相关技术重新复习了一遍&#xff0c;下面对学习过程中遇到的知识点进行下总结。首先我们先来了解一下进程、线程、并发执行的概念&#xff1a;进程是指&#xff1a;一个内存中运行的应用程序&#xff0c…

基本服务-使用大使网关

这是我对Knative服务进行实验的延续&#xff0c;这次是围绕在Knative服务应用程序之上构建网关。 这是基于我之前的两篇文章- 使用Knative部署Spring Boot App以及在Knative中进行服务到服务的调用 。 为什么在Knative应用程序之上使用网关 为了解释这一点&#xff0c;让我谈谈…

mysql function 表名作为参数_mysql 常用的分组聚合函数

mysql 常用的分组聚合函数1.聚合运算一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它.根据定义,聚合函数对一组值执行计算并返回单个值.MySQL提供了许多聚合函数,包括AVG,COUNT,SUM,MIN,MAX等.除COUNT函数外,其它聚合…

java加减乘除运算顺序_java 实现加减乘除混合运算

初衷&#xff1a;解决小学一年级到四年级 基本加减乘除混合运算基本思路&#xff1a;表达式&#xff1a;10032-200(10000/5(100/2))此类表达式我们称之为中缀表达式(运算符在数字的中间),如果我们稍加转换&#xff0c;转化为100, 3, , 2, , 200, -, 10000, 5, /, 100, 2, /, , …