此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2spring-doc.cadn.net.cn

常见问题解答

是否可以在多个线程或多个进程中执行作业?

有三种方法可以解决这个问题 - 但我们建议在分析此类要求时谨慎行事(真的有必要吗?spring-doc.cadn.net.cn

  • 添加一个TaskExecutor到步骤。为配置步骤提供的“StepBuilder”具有您可以设置的“taskExecutor”属性。只要该步骤本质上是可重启的(有效幂等),这就有效。并行作业示例展示了它在实践中的工作原理 - 它使用“流程指示器”模式在业务事务中将输入记录标记为完整。spring-doc.cadn.net.cn

  • 使用PartitionStep将步骤执行显式拆分为多个步骤实例。Spring Batch 有一个本地多线程实现了主策略(PartitionHandler),这使其成为 IO 密集型工作的绝佳选择。记得使用scope="step"对于以这种方式执行的步骤中的有状态组件,因此每个步骤执行都会创建单独的实例,并且线程之间没有串扰。spring-doc.cadn.net.cn

  • 使用远程分块方法,如spring-batch-integration模块。这需要一些耐用的中间件(例如 JMS),以便在驾驶步骤和远程工作人员之间进行可靠的通信。基本思想是使用特殊的ItemWriter在驱动进程上,以及工作进程上的侦听器模式(通过ChunkProcessor).spring-doc.cadn.net.cn

如何使项目阅读器线程安全?

您可以同步read()方法(例如,通过将其包装在执行同步的委托器中)。 请记住,您将失去可重启性,因此最佳实践是将步骤标记为不可重启,并且为了安全(和高效),您也可以将saveState=false在读者上。spring-doc.cadn.net.cn

Spring Batch 关于使用灵活策略和默认实现的理念是什么?你能为这个或那个属性添加一个公共 getter 吗?

Spring Batch 中有许多扩展点供框架开发人员使用(而不是业务逻辑的实现者)。 我们希望客户端创建自己的更具体的策略,这些策略可以插入来控制提交间隔(CompletionPolicy), 关于如何处理异常的规则 (ExceptionHandler),等等。spring-doc.cadn.net.cn

一般来说,我们试图劝阻用户不要扩展框架类。Java 语言没有为我们提供与内部一样的灵活性来标记类和接口。 通常,您可以在包中源代码树的顶层期待任何内容org.springframework.batch.*是公共的,但不一定是可子分类的。 不鼓励扩展我们对大多数策略的具体实施,而支持组合或分叉方法。 如果您的代码只能使用 Spring Batch 中的接口,那么这将为您提供最大的可移植性。spring-doc.cadn.net.cn

Spring Batch 与 Quartz 有何不同?在解决方案中,它们都有一席之地吗?

Spring Batch 和 Quartz 有不同的目标。Spring Batch 提供了处理大量数据的功能,Quartz 提供了调度任务的功能。 因此,Quartz 可以补充 Spring Batch,但不排除技术。一个常见的组合是使用 Quartz 作为使用 Cron 表达式的 Spring Batch 作业的触发器 和 Spring Core 的便利性SchedulerFactoryBean.spring-doc.cadn.net.cn

如何使用 Spring Batch 安排作业?

使用调度工具。那里有很多这样的人。示例:Quartz、Control-M、Autosys。 Quartz 不具备 Control-M 或 Autosys 的所有功能 - 它应该是轻量级的。 如果你想要更轻量级的东西,你可以只使用作系统(cron,at等)。spring-doc.cadn.net.cn

可以使用 Spring Batch 的作业步骤模型和 Spring Batch 中的非顺序功能来实现简单的顺序依赖关系。 我们认为这很常见。事实上,它更容易纠正调度程序的常见误用 - 配置了数百个作业, 其中许多不是独立的,而只是相互依赖。spring-doc.cadn.net.cn

Spring Batch 如何允许项目优化性能和可扩展性(通过并行处理或其他)?

我们将此视为JobStep.该步骤的具体实现涉及分解业务逻辑的问题 并在并行进程或处理器之间有效地共享它(参见PartitionStep).有许多技术可以在这里发挥作用。 本质只是一组对分布式代理的并发远程调用,可以处理一些业务处理。 由于业务处理通常已经模块化——例如,输入一个项目,对其进行处理——Spring Batch 可以通过多种方式制定分发策略。 我们有一些经验的一个实现是一组处理业务处理的远程 Web 服务。 我们为多个远程调用中的每一个发送特定范围的输入主键。 相同的基本策略适用于任何 Spring Remoting 协议(普通 RMI、HttpInvoker、JMS、Hessian 等),只需更改几行即可 在执行层配置中。spring-doc.cadn.net.cn

如何使用消息传递来扩展批处理体系结构?

现有项目中有大量实际证据表明,流水线批处理方法非常有益,可以带来弹性和高吞吐量。 我们经常面临关键任务应用,在这些应用中,审计跟踪至关重要,需要有保证的处理,但限制极其严格 在负载下的性能,或高吞吐量提供竞争优势的地方。spring-doc.cadn.net.cn

Matt Welsh 的工作表明,与更严格的处理架构相比,分阶段事件驱动架构 (SEDA) 具有巨大的优势, 面向消息的中间件(JMS、AQ、MQ、Tibco 等)为我们提供了开箱即用的弹性。有特别的好处 下游和上游阶段之间存在反馈的系统,因此可以调整消费者的数量以考虑需求量。 那么这如何适应 Spring Batch 呢?spring-batch-integration 项目在 Spring Integration 中实现了这种模式, 并可用于扩展任何需要处理许多项目的步骤的远程处理。 特别请参阅“chunk”包,以及ItemWriterChunkHandler实现。spring-doc.cadn.net.cn