从响应式Spring Data存储库流式传输实时更新

这篇文章详细介绍了从数据库到对该数据感兴趣的任何其他组件进行更新的幼稚实现。 更确切地说,如何更改Spring Data R2DBC存储库以向相关订阅者发出事件。

对R2DBC和Spring的一点背景知识将对这篇文章有所帮助。 我以前的著作“ 使用 Microsoft SQL Server的 Spring Data R2DBC和Spring Data R2DBC进行 异步RDBMS访问”在这方面应该有所帮助。

如前所述,这将是一个幼稚的实现。 因此,代码将不会花哨。

为此,我劫持了SimpleR2dbcRepository以创建一个存储库实现,该存储库实现在每次保存新记录时都会发出事件。 新事件将添加到DirectProcessor ,并发送到订阅它的任何Publisher 。 看起来像:

class PersonRepository(entity: RelationalEntityInformation<Person, Int>,databaseClient: DatabaseClient,converter: R2dbcConverter,accessStrategy: ReactiveDataAccessStrategy
) : SimpleR2dbcRepository<Person, Int>(entity, databaseClient, converter, accessStrategy) {private val source: DirectProcessor<Person> = DirectProcessor.create<Person>()val events: Flux<Person> = sourceoverride fun <S : Person> save(objectToSave: S): Mono<S> {return super.save(objectToSave).doOnNext(source::onNext)}
}

来自SimpleR2dbcRepository唯一需要重写的函数是savesaveAll委托来save )。 doOnNext添加到原始保存调用中,该调用通过调用onNext将新事件推送到sourceDirectorProcessor )。

source被强制转换为Flux以防止来自存储库外部的类添加新事件。 从技术上讲,他们仍然可以添加事件,但是他们需要自己进行转换。

您可能已经注意到,存储库正在加载参数并将其传递到SimpleR2dbcRepository 。 存储库的一个实例需要手动创建,因为其某些依赖项无法自动注入:

@Configuration
class RepositoryConfiguration {@Beanfun personRepository(databaseClient: DatabaseClient,dataAccessStrategy: ReactiveDataAccessStrategy): PersonRepository {val entity: RelationalPersistentEntity<Person> = dataAccessStrategy.converter.mappingContext.getRequiredPersistentEntity(Person::class.java) as RelationalPersistentEntity<Person>val relationEntityInformation: MappingRelationalEntityInformation<Person, Int> =MappingRelationalEntityInformation(entity, Int::class.java)return PersonRepository(relationEntityInformation,databaseClient,dataAccessStrategy.converter,dataAccessStrategy)}
}

至此,一切都准备就绪,可以使用了。 以下是其工作的示例:

personRepository.events.doOnComplete { log.info("Events flux has closed") }.subscribe { log.info("From events stream - $it") }
// insert people records over time
MARVEL_CHARACTERS.toFlux().delayElements(Duration.of(1, SECONDS)).concatMap { personRepository.save(it) }.subscribe()

哪个输出:

29-08-2019 09:08:27.674 [reactor-tcp-nio-1]  From events stream - Person(id=481, name=Spiderman, age=18)
29-08-2019 09:08:28.550 [reactor-tcp-nio-2]  From events stream - Person(id=482, name=Ironman, age=48)
29-08-2019 09:08:29.555 [reactor-tcp-nio-3]  From events stream - Person(id=483, name=Thor, age=1000)
29-08-2019 09:08:30.561 [reactor-tcp-nio-4]  From events stream - Person(id=484, name=Hulk, age=49)
29-08-2019 09:08:31.568 [reactor-tcp-nio-5]  From events stream - Person(id=485, name=Antman, age=49)
29-08-2019 09:08:32.571 [reactor-tcp-nio-6]  From events stream - Person(id=486, name=Blackwidow, age=34)
29-08-2019 09:08:33.576 [reactor-tcp-nio-7]  From events stream - Person(id=487, name=Starlord, age=38)
29-08-2019 09:08:34.581 [reactor-tcp-nio-8]  From events stream - Person(id=488, name=Captain America, age=100)
29-08-2019 09:08:35.585 [reactor-tcp-nio-9]  From events stream - Person(id=489, name=Warmachine, age=50)
29-08-2019 09:08:36.589 [reactor-tcp-nio-10] From events stream - Person(id=490, name=Wasp, age=26)
29-08-2019 09:08:37.596 [reactor-tcp-nio-11] From events stream - Person(id=491, name=Winter Soldier, age=101)
29-08-2019 09:08:38.597 [reactor-tcp-nio-12] From events stream - Person(id=492, name=Black Panther, age=42)
29-08-2019 09:08:39.604 [reactor-tcp-nio-1]  From events stream - Person(id=493, name=Doctor Strange, age=42)
29-08-2019 09:08:40.609 [reactor-tcp-nio-2]  From events stream - Person(id=494, name=Gamora, age=29)
29-08-2019 09:08:41.611 [reactor-tcp-nio-3]  From events stream - Person(id=495, name=Groot, age=4)
29-08-2019 09:08:42.618 [reactor-tcp-nio-4]  From events stream - Person(id=496, name=Hawkeye, age=47)
29-08-2019 09:08:43.620 [reactor-tcp-nio-5]  From events stream - Person(id=497, name=Pepper Potts, age=44)
29-08-2019 09:08:44.627 [reactor-tcp-nio-6]  From events stream - Person(id=498, name=Captain Marvel, age=59)
29-08-2019 09:08:45.631 [reactor-tcp-nio-7]  From events stream - Person(id=499, name=Rocket Raccoon, age=30)
29-08-2019 09:08:46.637 [reactor-tcp-nio-8]  From events stream - Person(id=500, name=Drax, age=49)
29-08-2019 09:08:47.639 [reactor-tcp-nio-9]  From events stream - Person(id=501, name=Nebula, age=30)

每秒保存一条记录,该记录与从存储库发出的事件相匹配。

请注意, doOnComplete事件永远不会触发。 源永远不会关闭,因此永远不会向其任何订户发出完成事件。

至少对于此基本实现而言,这就是全部。 我敢肯定还有很多事情可以做,但是我首先需要弄清楚该怎么做……总结一下,通过添加一些内容,您可以将插入数据库的数据流式传输到对记录感兴趣的组件被添加。

翻译自: https://www.javacodegeeks.com/2019/09/streaming-live-updates-reactive-spring-data-repository.html

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

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

相关文章

ns3入门案例1 first.cc

1、目录结构 example&#xff1a;1、根文件下自带示例结构&#xff0c;作为良好的参考资源 2、src环境下中各模块中example作为资源 build&#xff1a; 编译后文件以及可执行文件 src&#xff1a;各模块源代码 2、新代码运行 将新脚本放在scratch文件夹中&#xff0c;该目…

工业以太网交换机都有哪些作用

工业以太网交换机由于使用及定位的关系&#xff0c;区别于商业交换机&#xff0c;它更关注稳定性&#xff0c;耐高温&#xff0c;耐振动&#xff0c;耐腐蚀等一些工业特性。工业以太网交换机以其较高的防护等级&#xff08;一般IP40)、较强的电磁兼容性&#xff08;EMS 4级&…

ubuntu下面 将桌面换成 英文

1. 我们可以先将目录都改成英文的。 export LANGen_US 执行 xdg-user-dirs-gtk-update 这时会弹出一个配置界面&#xff0c;将所有中文的用户目录切换到英文。选中不再提示&#xff0c;确定。 这时&#xff0c;会删除没有内容的用户目录&#xff0c;但有内容的用户目录会保…

光纤交换机是什么,光纤交换机的作用是什么?

随着网络的发展&#xff0c;先后出现了交换机、路由器、电话光端机等网络设备&#xff0c;在数据存储网络中&#xff0c;光纤交换机起到了重要的作用。今天飞畅科技的小编来为大家介绍下光纤交换机及光纤交换机的作用&#xff0c;一起来看看吧&#xff01; 光纤交换机的简介 光…

ns3 入门案例2:third.cc

代码分析 1 头文件 #include "ns3/core-module.h" #include "ns3/point-to-point-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/mobility-module.h" #include "n…

光纤交换机产品功能介绍

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;光纤传输的优点是速度快、抗干扰能力强。那么&#xff0c;光纤交换机有哪些功能呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来看看吧&#xff01; 通道协议支持 SAN交换…

java8 streams_使用Java 8 Streams进行编程对算法性能的影响

java8 streams多年来&#xff0c;使用Java进行多范式编程已经成为可能&#xff0c;它支持面向服务&#xff0c;面向对象和面向方面的编程的混合。 带有lambda和java.util.stream.Stream类的Java 8是个好消息&#xff0c;因为它使我们可以将功能性编程范例添加到混合中。 确实&a…

光纤交换机光纤通道协议介绍

光纤通道&#xff08;FC&#xff0c;Fibre Channel&#xff09;协议是美国国家标准所指定的一种串行高速、低延时、低误码的标准协议能够为存储设备、IP 数据网、音频流等应用提供高速数据传输的骨干网络技术。随着光纤通道在不同领域的应用&#xff0c;在光纤通道协议的基础上…

解决E: 仓库 “http://ppa.launchpad.net/fcitx-team/nightly/ubuntu bionic Release” 没有 Release 文件。

转载声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;在NS-3中安装可视化工具pyviz的一些问题的解决_寻同学的博客-CSDN博客 今天&#xff0c;在更新软件时&#xff0c;使用以下…

POI创建的文档具有不同条件的灵活样式

介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下&#xff0c;Java程序员使用POI :-)。 这些报告通常具有严格的样式和数据格式规则。 数据通常是SQL查询执行的结果…

在NS-3中安装可视化工具pyviz的一些问题的解决

转载声明&#xff1a;本文为寻同学原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/qq_31676673/article/details/88107454 在NS-3中安装可视化工具pyviz的一些问题的解决 PyViz是一…

什么是光纤交换机?

光纤交换机是一种高速的网络传输中继设备&#xff0c;又叫做光纤通道交换机、SAN交换机&#xff0c;它较普通交换机而言&#xff0c;采用了光纤电缆作为传输介质。光纤传输的优点是速度快、抗干扰能力强。光纤交换机主要有两种&#xff0c;一是用来连接存储的FC交换机。另一种是…

java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?

java 调用 js性能那么这是怎么回事&#xff1f; 让我们从一个简短的故事开始。 几周前&#xff0c;我提议对Java核心libs邮件列表进行更改 &#xff0c;以覆盖当前final一些方法。 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一个方法被引入的程度final免遭停…

VMware虚拟机扩展Ubuntu系统磁盘空间

转载&#xff1a;https://www.cnblogs.com/dongry/p/10620894.html 1 首先给虚拟机扩容 虚拟机->设置->硬盘->实用程序->扩展磁盘容量 2 启动Ubuntu系统 2.1 打开终端安装gparted&#xff0c;sudo apt-get install gparted&#xff1b;输入sudo gparted打开gparte…

光纤以太网交换机产品性能介绍

光纤以太网交换机是一款高性能的管理型的二层光纤以太网接入交换机。那么&#xff0c;光纤以太网交换机产品性能有哪些呢&#xff1f;接下来&#xff0c;飞畅科技的小编就来为大家详细介绍下光纤以太网交换机的产品性能&#xff0c;感兴趣的朋友就一起来看看吧&#xff01; 光…

操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序

首先&#xff0c;免责声明&#xff1a;如果您正在编写微服务 &#xff08;每个人现在都对吗&#xff1f;&#xff09;并希望它是惯用的 &#xff0c;那么通常不会在其中使用几个不同的数据源。 图片取自Pixabay© https: //pixabay.com/illustrations/software-binary-sys…

2020-09-03解决pip install安装非常慢[Errno 101] 网络不可达问题

转载链接&#xff1a;http://huanyouchen.github.io/2019/11/21/pip-install-package-very-slow/ 问题描述 使用pip安装seaborn提示&#xff1a; sudo python3.5 -m pip install seabornCollecting seabornWARNING: Retrying (Retry(total4, connectNone, readNone, redirect…

环网工业交换机ERPS技术解析

ERPS(Ethernet Ring Protection Switching&#xff0c;以太环网保护切换协议)是ITU开发的一种环网保护协议&#xff0c;也称G.8032。它是一个专门应用于以太环网的链路层协议。它在以太环网完整时能够防止数据环路引起的广播风暴&#xff0c;而当以太环网上一条链路断开时能迅速…

交换机和路由器的区别是什么?

在我们日常生活中&#xff0c;上网很多时候都要用到交换机和路由器&#xff0c;很多人只知道二者都是用于连接上网的设备&#xff0c;但很少知道它们之间有什么区别&#xff0c;以及各自的功能。 交换机和路由器的区别&#xff1a; 路由器可以给你的局域网自动分配IP&#xf…

import _ssl # if we can‘t import it, let the error propagate

转载链接&#xff1a; https://blog.csdn.net/u013398960/article/details/107524068 实测有用