科尔达服务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,一经查实,立即删除!

相关文章

python写入数据到excel_python实现查询的数据写入到excel

#codingutf-8 import sys import xlwt import pymysql as MySQLdb #这里是python3 如果你是python2.x的话&#xff0c;import MySQLdb import datetime host 192.168.10.109 user root pwd port 3306 db com66nao_mi sheet_name report out_path rD:\SQL\aaa.xls print…

1899-11-30 php mysql_PHP学习十一--PHP操作MYSQL数据库

1.PHP访问Mysql数据库的一般步骤连接MySQL服务器选择MySQL数据库请求 执行SQL语句 请求MySQL数据库服务器 关闭结果集 数据资源响应 关闭MySQL服务器 响应(1).连接MySQL服务器。通过…

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

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

python运行pyc文件_Python什么情况下会生成pyc文件?

作为Python爱好者&#xff0c;需要了解.py脚本的基本运行机制及特性&#xff1a; 在很多工作上Python的运行流程基本上取决于用户&#xff0c;因此源码不需要编译成二进制代码&#xff08;否则无法实现大部分贴近用户的特性&#xff09;&#xff0c;而直接从源码运行程序。当我…

mysql 8.0认证失败_连接mysql8.0提示认证协议失败

描述用docker容器安装软件非常方便&#xff0c;省了太多麻烦。通过docker运行mysql8.0,再用navicat客户端连接出现client does not support authentication protocol requested by server。像似认真失败&#xff0c;检查mysql.user表&#xff0c;已经配置了用户&#xff0c;为什…

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会自…

mysql 注入 file load_Mysql注入中into outfile和load_file()总结

(1)outfile后面不能接0x开头或者char转换以后的路径&#xff0c;只能是单引号路径。这个问题在php注入中更加麻烦&#xff0c;因为会自动将单引号转义成\,那么基本没的玩了。唯一的一种可能就是你使用mysql远程连接&#xff0c;然后直接在mysql中执行命令&#xff0c;就没有查询…

vscode python单步调试_调试期间VSCode python“未验证断点”?

我正在使用VSCode调试python应用程序。在我有一个主python文件&#xff0c;从这里启动调试器。我可以在这个文件中放置断点&#xff0c;但是如果我想在主文件调用的其他文件中放置断点&#xff0c;我会将它们作为“未验证的断点”得到&#xff0c;调试器会忽略它们。在如何更改…

您自己的MicroProfile Config来源

MicroProfile配置 &#xff0c;即一部分MicroProfile规格&#xff0c;是Java Enterprise和微服务配置的标准化。 开箱即用&#xff08;即&#xff0c;对于规范定义的所有实现都是强制性的&#xff09;有3种方法来定义您的配置&#xff1a; System.getProperties() System.ge…

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

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

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

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

tpcc mysql优化_tpcc_mysql性能测试

. bzr branch lp:~percona-dev/perconatools/tpcc-mysql该方法需要下载bzr工具&#xff0c;还要在网站注册并添加SSH KEY&#xff0c;非常麻烦&#xff0c;并且还没有成功(卡在SSH KEY上)。2. 直接在 http://bazaar.launchpad.net/~percona-dev/perconatools/tpcc-mysql/files …

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

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

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

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

suse11 rpm 安装mysql_SuSE11安装MySQL5.7.22:RPM安装方式

摘要&#xff1a;SuSE11sp3 64位操作系统、 MySQL5.7.22 rpm安装包5.7版本与先前版本安装有所区别&#xff0c;需要注意注&#xff1a;kingtry是我的主机名一、环境准备操作系统&#xff1a;SuSE版本11sp3&#xff0c;64位kingtry:~ # uname -aLinux kingtry 3.0.76-0.11-defau…

python有多少库存_库存究竟多少才算合理?

本文摘自以上刘宝红老师著作。作为库存计划人员&#xff0c;不管你的库存周转多快&#xff0c;总有人挑战你&#xff0c;说你的库存不合理。不合理&#xff0c;其实是太高的代名词。不过想想看&#xff0c;每一分钱的库存都不是凭空而来&#xff0c;都是为了特定的业务需求而设…

java中iterator_如何在Java中读取CSV文件-Iterator和Decorator的案例研究

java中iterator在本文中&#xff0c;我将讨论如何使用Apache Common CSV读取CSV&#xff08;逗号分隔值&#xff09;文件。 从这个案例研究中&#xff0c;我们将学习如何在设计模式的上下文中使用Iterator和Decorator来提高不同情况下的可重用性。 但是在开始之前&#xff0c;我…

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

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

python中int函数的用法浅析_Python中int()函数的用法浅析

int()是Python的一个内部函数Python系统帮助里面是这么说的>>> help(int)Help on class int in module __builtin__:class int(object)| int(x[, base]) -> integer|| Convert a string or number to an integer, if possible. A floating point| argument will be…