Spring batch “春季批次”;使用ItemStream reader检测到异步TaskExecutor“;

Spring batch “春季批次”;使用ItemStream reader检测到异步TaskExecutor“;,spring-batch,Spring Batch,首先,这个问题似乎正是我们想要做的: SpringBatch 3.0.10,在JavaEE服务器(WebSphere、Java8、JavaEE6)下运行。我也不是这段代码的原始作者 XML配置,我们有一个批处理步骤,从文件中读取一行,处理该行(我们希望多线程的部分),并将记录写入数据库: 即使在以下情况之后: 我们的启动日志仍然包含: 22:25:25252(默认值:3)警告org.springframework.batch.core.step.builder.FaultToleran

首先,这个问题似乎正是我们想要做的:

SpringBatch 3.0.10,在JavaEE服务器(WebSphere、Java8、JavaEE6)下运行。我也不是这段代码的原始作者

XML配置,我们有一个批处理步骤,从文件中读取一行,处理该行(我们希望多线程的部分),并将记录写入数据库:


即使在以下情况之后:


我们的启动日志仍然包含:

22:25:25252(默认值:3)警告org.springframework.batch.core.step.builder.FaultTolerantStepBuilder:使用ItemStream reader检测到异步TaskExecutor。这可能是一个错误,并可能导致存储的重启数据不正确

22:34:03755(WorkManager.DefaultWorkManager:0)警告org.springframework.batch.core.step.item.ChunkMonitor:未设置ItemReader(必须是并发步骤),因此忽略偏移数据

以及以下几个例子:

22:34:03880(WorkManager.DefaultWorkManager:2)警告org.springframework.batch.core.step.item.ChunkMonitor:ItemStream是在其他线程中打开的。重启数据可能会被破坏

我认为这是有道理的,因为我们包装了处理器和编写器,但没有类包装读取器

在运行我的作业时,日志确实表明正在使用来自容器执行器的不同线程,但我在使用异步包装器之前没有尝试过这一点,所以即使没有异步包装器,它也可能“工作”了

那么,有没有办法防止这些警告,以及他们警告的情况呢

更新:基于:

如果读卡器不是线程安全的,那么在您自己的同步委托器中使用它可能仍然是有效的。您可以同步对read()的调用,只要处理和写入是块中最昂贵的部分,您的步骤完成速度可能仍然比单线程配置快得多


我已经尝试创建了一个
FlatFileItemReader
子类,它同步了自己的
read()
方法,调用了底层的
read()
方法,但是我仍然得到了警告日志记录。我不知道我是否误解了这个建议,或者我现在所做的是安全的,但不能被检测为安全的,所以它仍然在记录。

FlatFileItemReader不是线程安全的,因为它扩展了
AbstractItemCountingItemStreamItemReader
。因此,在多线程步骤中使用它是不正确的(否则执行上下文数据可能会被并发线程损坏,因此会出现警告)


为了避免任何并发问题,您可以尝试对文件进行分区(物理分区或逻辑分区),并使每个线程在不同的分区上工作。

FlatFileItemReader不是线程安全的,因为它扩展了
AbstractItemCountingItemStreamItemReader
,后者是。因此,在多线程步骤中使用它是不正确的(否则执行上下文数据可能会被并发线程损坏,因此会出现警告)


为了避免任何并发问题,您可以尝试对文件进行分区(物理分区或逻辑分区),并使每个线程在不同的分区上工作。

谢谢,有关于如何执行后一个分区的详细信息吗?那么就没有线程安全的文件读取器了吗?那我的synchronized
FlatFileReader
子类呢?很抱歉,我一直在尝试设想这个问题的具体解决方案。您正在寻找的item reader的包装器是
SynchronizedItemStreamReader
(这将替换同步
读取方法的自定义读取器)。但这并不能解决警告问题。这里的问题是关于多线程步骤中的状态管理。此状态用于重新启动场景。如果您不关心可重启性,可以关闭状态(在读卡器上设置
saveState(false)
)并安全地忽略这些警告。我提到的分区技术如下所示:。我使用
split
命令对输入文件进行物理拆分。这种方法是不可移植的,你可以用一个等价的java代码来代替它。谢谢,关于如何实现后者的详细信息?那么就没有线程安全的文件读取器了吗?那我的synchronized
FlatFileReader
子类呢?很抱歉,我一直在尝试设想这个问题的具体解决方案。您正在寻找的item reader的包装器是
SynchronizedItemStreamReader
(这将替换同步
读取方法的自定义读取器)。但这并不能解决警告问题。这里的问题是关于多线程步骤中的状态管理。此状态用于重新启动场景。如果您不关心可重启性,可以关闭状态(在读卡器上设置
saveState(false)
)并安全地忽略这些警告。我提到的分区技术如下所示:。我使用
split
命令对输入文件进行物理拆分。这种方法是不可移植的,您可以用等效的java代码替换它。