当前位置: 首页 > 知识库问答 >
问题:

Spring Batch“使用ItemStream阅读器检测到异步TaskExector”

令狐建修
2023-03-14

首先,这个问题似乎正是我们想要做的:在SpringBatch中并行执行ItemStreamReader

Spring批次3.0.10,在Java EE服务器(WebSphere,Java 8,Java EE 6)下运行。我也不是这个代码的原始作者。

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

    <batch:step id="processRenewalsStep" next="saveResponseFileStep">
        <batch:tasklet task-executor="taskExecutor" throttle-limit="4">
            <batch:chunk
                reader="batchRenewalCsvFileItemReader"
                writer="asyncBatchRenewalDb2ItemWriter"
                processor="asyncBatchRenewalProcessor"
                commit-interval="1"
                skip-limit="10">
                <batch:skippable-exception-classes>
                    <batch:include class="java.lang.Exception"/>
                </batch:skippable-exception-classes>
                <batch:listeners>
                    <batch:listener ref="batchSkipListener"/>
                </batch:listeners>
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

即使在接受答案中遵循了建议的aynchronous包装之后:

<bean id="asyncBatchRenewalProcessor" class="org.springframework.batch.integration.async.AsyncItemProcessor"
      p:taskExecutor-ref="taskExecutor"
      p:delegate-ref="batchRenewalProcessor"/>

<bean id="asyncBatchRenewalDb2ItemWriter" class="org.springframework.batch.integration.async.AsyncItemWriter"
      p:delegate-ref="batchRenewalDb2ItemWriter"/>

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

22:25:25,252(默认值:3)WARN org . spring framework . batch . core . step . builder . faulttolerantstepbuilder:用ItemStream读取器检测到异步TaskExecutor。这可能是一个错误,并可能导致存储不正确的重启数据。

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

以及以下几个实例:

22:34:03,880(工作经理。DefaultWorkManager:2)WARN org . spring framework . batch . core . step . item . chunk monitor:item stream已在不同的线程中打开。重启数据可能会受损。

我认为这是有意义的,因为我们包装了处理器和写入器,但没有类包装读取器?

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

那么有什么方法可以防止这些警告,以及它们所警告的情况呢?

更新:基于文档中的这一点:

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

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

共有1个答案

东方英豪
2023-03-14

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

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

 类似资料:
  • SQLAlchemy 1.4 / 2.0 Tutorial 此页是 SQLAlchemy 1.4/2.0教程 . 上一页: 使用相关对象 进一步阅读 下面的部分是主要的顶层部分,它们将更详细地讨论本教程中的概念,并描述每个子系统的更多特性。 核心基本参考 使用引擎和接头 模式定义语言 SQL语句和表达式API 列和数据类型 ORM基本参考 映射器配置 关系配置 使用会话 查询数据,加载对象

  • 一款全部开源的rss阅读器,界面简单,功能强大! 采用的是.net+jquery实现,代码大小只有55k,配置要求只要支持.net2.0和iis服务就可以! 简介:由于安全问题,浏览器没有足够的权限来操作远程的xml,所以不得不借助服务器端来实现,所以提供了RssServer来解析xml,然后直接显示出来,再有jquery来操作配合css来显示,思路就是这样! 最后的效果:

  • 在问题[1]中,我了解到如果您想在Android下使用NFC标签,则不必采用NDEF格式。我想在Win 8.1 in. Net下执行此操作。我的情况是这样的: 我有一个RFID卡Mifare Classic 1K,其中存储了一个ID。(由制造商记录)该ID由我们的考勤系统通过通常的RFID读取器(例如Gigatek的PROMAG MFR120)读取。我们不在卡上写任何东西,我们只需要读取ID。但是

  • RSS 阅读器用于读取 RSS feed! RSS 阅读器可供许多不同的设备和操作系统使用。 RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web services 的形式来工作,而某些则运行于 windows (或 Mac、PDA 或 UNIX)。 这是一些我尝试过并钟爱的阅读器: 这是一些我尝试过并钟爱的阅读器: RSS 阅读器 有很多不同的 RSS 阅读器。某些以 web servi

  • 问题内容: 异步编程是下一个新兴的范式。。。在过去的几个月中,我一直在Node.js中进行编程,并且一直在学习以这种方式编写代码。我有一个在Silverlight中工作的同事,我一直在尝试教他如何使用TPL。我还向他展示了“ await”关键字及其工作方式。 一段时间后,使用回调变得很正常。在Node.js中,我正在使用caolan / async项目来避免深度嵌套的回调。我看了一下源代码,但这就

  • 全部: 我对Jasmine测试非常陌生,我想知道的一个关于异步测试的问题是: 有谁能简单解释一下Jasmine是如何知道里面有一个done()函数调用并等待它完成的? 例如,如果我把一些异步调用在之前: Jasmine怎么知道它应该让规范测试等待? 谢谢