此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2! |
常见问题解答
是否可以在多个线程或多个进程中执行作业?
有三种方法可以解决这个问题 - 但我们建议在分析此类要求时谨慎行事(真的有必要吗?
-
添加一个
TaskExecutor
到步骤。为配置步骤提供的“StepBuilder”具有您可以设置的“taskExecutor”属性。只要该步骤本质上是可重启的(有效幂等),这就有效。并行作业示例展示了它在实践中的工作原理 - 它使用“流程指示器”模式在业务事务中将输入记录标记为完整。 -
使用
PartitionStep
将步骤执行显式拆分为多个步骤实例。Spring Batch 有一个本地多线程实现了主策略(PartitionHandler
),这使其成为 IO 密集型工作的绝佳选择。记得使用scope="step"
对于以这种方式执行的步骤中的有状态组件,因此每个步骤执行都会创建单独的实例,并且线程之间没有串扰。 -
使用远程分块方法,如
spring-batch-integration
模块。这需要一些耐用的中间件(例如 JMS),以便在驾驶步骤和远程工作人员之间进行可靠的通信。基本思想是使用特殊的ItemWriter
在驱动进程上,以及工作进程上的侦听器模式(通过ChunkProcessor
).
如何使项目阅读器线程安全?
您可以同步read()
方法(例如,通过将其包装在执行同步的委托器中)。
请记住,您将失去可重启性,因此最佳实践是将步骤标记为不可重启,并且为了安全(和高效),您也可以将saveState=false
在读者上。
Spring Batch 关于使用灵活策略和默认实现的理念是什么?你能为这个或那个属性添加一个公共 getter 吗?
Spring Batch 中有许多扩展点供框架开发人员使用(而不是业务逻辑的实现者)。
我们希望客户端创建自己的更具体的策略,这些策略可以插入来控制提交间隔(CompletionPolicy
),
关于如何处理异常的规则 (ExceptionHandler
),等等。
一般来说,我们试图劝阻用户不要扩展框架类。Java 语言没有为我们提供与内部一样的灵活性来标记类和接口。
通常,您可以在包中源代码树的顶层期待任何内容org.springframework.batch.*
是公共的,但不一定是可子分类的。
不鼓励扩展我们对大多数策略的具体实施,而支持组合或分叉方法。
如果您的代码只能使用 Spring Batch 中的接口,那么这将为您提供最大的可移植性。
Spring Batch 与 Quartz 有何不同?在解决方案中,它们都有一席之地吗?
Spring Batch 和 Quartz 有不同的目标。Spring Batch 提供了处理大量数据的功能,Quartz 提供了调度任务的功能。
因此,Quartz 可以补充 Spring Batch,但不排除技术。一个常见的组合是使用 Quartz 作为使用 Cron 表达式的 Spring Batch 作业的触发器
和 Spring Core 的便利性SchedulerFactoryBean
.
如何使用 Spring Batch 安排作业?
使用调度工具。那里有很多这样的人。示例:Quartz、Control-M、Autosys。
Quartz 不具备 Control-M 或 Autosys 的所有功能 - 它应该是轻量级的。
如果你想要更轻量级的东西,你可以只使用作系统(cron
,at
等)。
可以使用 Spring Batch 的作业步骤模型和 Spring Batch 中的非顺序功能来实现简单的顺序依赖关系。 我们认为这很常见。事实上,它更容易纠正调度程序的常见误用 - 配置了数百个作业, 其中许多不是独立的,而只是相互依赖。
Spring Batch 如何允许项目优化性能和可扩展性(通过并行处理或其他)?
我们将此视为Job
或Step
.该步骤的具体实现涉及分解业务逻辑的问题
并在并行进程或处理器之间有效地共享它(参见PartitionStep
).有许多技术可以在这里发挥作用。
本质只是一组对分布式代理的并发远程调用,可以处理一些业务处理。
由于业务处理通常已经模块化——例如,输入一个项目,对其进行处理——Spring Batch 可以通过多种方式制定分发策略。
我们有一些经验的一个实现是一组处理业务处理的远程 Web 服务。
我们为多个远程调用中的每一个发送特定范围的输入主键。
相同的基本策略适用于任何 Spring Remoting 协议(普通 RMI、HttpInvoker、JMS、Hessian 等),只需更改几行即可
在执行层配置中。
如何使用消息传递来扩展批处理体系结构?
现有项目中有大量实际证据表明,流水线批处理方法非常有益,可以带来弹性和高吞吐量。 我们经常面临关键任务应用,在这些应用中,审计跟踪至关重要,需要有保证的处理,但限制极其严格 在负载下的性能,或高吞吐量提供竞争优势的地方。
Matt Welsh 的工作表明,与更严格的处理架构相比,分阶段事件驱动架构 (SEDA) 具有巨大的优势,
面向消息的中间件(JMS、AQ、MQ、Tibco 等)为我们提供了开箱即用的弹性。有特别的好处
下游和上游阶段之间存在反馈的系统,因此可以调整消费者的数量以考虑需求量。
那么这如何适应 Spring Batch 呢?spring-batch-integration 项目在 Spring Integration 中实现了这种模式,
并可用于扩展任何需要处理许多项目的步骤的远程处理。
特别请参阅“chunk”包,以及ItemWriter
和ChunkHandler
实现。