java - 如何为 Spring Batch 应用响应式(Reactive)

标签 java spring reactive

我想知道如何将 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 (即 BatchConfigurerTaskletStepBuilderHelper 等)应更新为使用新引入的 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 太高而无法考虑,但我愿意相信其他情况。

关于java - 如何为 Spring Batch 应用响应式(Reactive),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71268480/

相关文章:

java - 如何在 Java 中首先编写测试?

java - 用java启动一个新程序

java - 如何在另一个类的方法中使用一个类的字段名称,这样如果名称更改就会出现编译器问题

spring - 在某个 Maven 配置文件构建期间是否可以排除或忽略 junit 测试?

java - TicTacToe Java 游戏没有结束

java - 如何创建支持 Spring 的 Eclipse 插件?

angular - 有没有办法在不分配的情况下取消订阅BehaviorSubject?

java - RxJava + Kotlin - 使用一个可观察对象创建另一个可观察对象

java - 将 "is_deleted"状态字段作为复合主键放在 cassandra 表上进行读取是一种好的做法吗?

java - 我能否在 Mac OS X 上为 Swing 获得原生外观的 JPopupMenu 外观?