我想知道如何将 Spring React 应用于 Spring Batch。我该怎么做?为什么我们要把 Spring Reactive 应用于 Spring Security?为什么我可以应用到Spring Security,但不能应用Reactive到Spring Batch。
最佳答案
Spring Batch 的响应式版本不存在。 Spring 开发人员正在此 Github issue 中讨论此实现。 .
我想标记以下评论,它解释了所有原因。
Spring Batch and Reactive Streams
首先,Reactive Streams 是为数据流(无限)设计的,而 Spring Batch 是为固定数据集(有限)设计的批处理框架。在我看来,这已经是一个根本性的不匹配,可能导致这两个工具之间的非自然集成。
现在,即使我们尝试在 Spring Batch 中以某种方式引入“响应式”,我们也需要小心一些设计选择。以下摘自Spring Framework FAQ部分是关键:
For handlers to be fully non-blocking, you need to use reactive libraries throughout the processing chain, all the way to the persistence layer.
如果堆栈是部分响应式的,Spring 框架甚至建议继续使用阻塞模型:
By all means, keep using Spring MVC if you are developing web apps that don't benefit from a non-blocking programming model, or that use blocking JPA or JDBC APIs for persistence (typically in combination with thread-bound transactions).
根据这些陈述,要使 Web 应用程序完全响应式,整个堆栈都应该是响应式的,从 Controller 一直到持久层。这对于批处理应用程序没有什么不同,只是我们这里显然没有 Controller ,但端到端作业执行应该是 react 性的。拥有与阻塞作业存储库交互的“响应式(Reactive)非阻塞步骤”是没有意义的。
因此,要真正从这个响应式故事中受益,整个框架应该是响应式的,从批处理工件(读取器、处理器、写入器、监听器等)到基础设施 bean(作业存储库、事务管理器等)。为了实现这一目标,需要付出巨大的努力:
- 应提供响应式(Reactive)作业存储库实现
- 所有 API 使用
PlatformTransactionManager
(即BatchConfigurer
、Tasklet
、StepBuilderHelper
等)应更新为使用新引入的 org.springframework.transaction.TransactionManager界面。这是为了能够提供ReactiveTransactionManager
或经典PlatformTransactionManager
根据需要。- 所有读取器/写入器的实现均应更新为使用非阻塞 API(文件 IO、数据库 IO 等)
- 还有许多其他变化
此外,当前面向 block 的处理模型实际上与响应式(Reactive)范式不兼容。原因是
ChunkOrientedTasklet
在读取下一个 block 之前等待 chunkProcessor(处理器 + 写入器)处理整个 block :Chunk inputs = chunkProvider.provide(); chunkProcessor.process(inputs);
所以这个实现也应该进行调整。所有这些更改都是必需的,甚至无需讨论 Spring Batch 当前的并发模型(与响应式(Reactive)范例不兼容)和作业存储库级别使用的乐观锁定策略。
在我看来,“响应式(Reactive)支持”不是我们可以在 Spring Batch 中引入的功能,它实际上需要完全重写框架的 80%(如果不是更多)。出于所有这些原因,我认为这种集成的成本/ yield 太高而无法考虑,但我愿意相信其他情况。
block 引用>
关于java - 如何为 Spring Batch 应用响应式(Reactive),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71268480/