Spring Batch多线程卡住没有任何异常输出

Posted

技术标签:

【中文标题】Spring Batch多线程卡住没有任何异常输出【英文标题】:Spring Batch Multithreading stuck without any exception output 【发布时间】:2019-07-14 07:49:58 【问题描述】:

我正在为一些日常流程实现 Spring Batch 多线程。项目阅读器、项目处理器和项目编写器都是 bean(单例)。此外,我正在使用 Hibernate 和 spring data jpa 进行数据库访问。对于线程,我使用的是threadpooltaskexecutor。

线程会无缘无故挂起,可能我不知道根本原因。现在,在日志中,hibernate 将停留在 select 或 insert 语句中,并且永远挂在那里。我真的不知道原因。对于事务,我有 required_new 和 read_committed 用于传播和隔离。其他一切都是 Spring Boot 的默认设置。

我正在处理 20k json,大小可能不同,但有些很大。我不能分享整个代码,因为我不知道问题出在哪里。基本上在项目处理器中,我几乎没有同步块来处理业务逻辑。

对于这个问题,我只想知道可能的原因是什么?因为 Java 不提供任何信息。

【问题讨论】:

【参考方案1】:

没有代码很难说可能是什么问题。您需要准确挖掘它被绞死的地方。可能的原因是

    在阅读器中选择查询需要很长时间。 (可能是由于不正确的索引或表可能已锁定)。您可以在阅读器中添加更多日志,以准确检查导致此问题的记录。 如果您在 ItemProcessor 中执行任何数据库操作,请添加日志添加检查。 在 writer 中,插入可能需要很长时间才能完成写入。

【讨论】:

item reader 进行读取,它只是从一个表中读取。问题发生在项目处理器中。当我从多线程切换到分区时。目前一切正常,没有看到任何错误或停止。不知道为什么。 @gamewu 如果没有任何代码或日志,很难说到底是什么问题。如果对您有帮助,请采纳答案。

以上是关于Spring Batch多线程卡住没有任何异常输出的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch 事务管理 - 多线程步骤

Spring Batch 连接池和多线程

多线程jpa读取时休眠空指针异常

为啥我的 Spring Batch 多线程步骤在任何处理之前执行所有读取?

Spring-Batch学习总结——重要概念,环境搭建,名词解释,第一个项目及异常处理

Spring-batch学习总结—Job,Flow创建及应用,多线程并发,决策器,监听器,参数