Spring Batch:已完成的工作实际上并未结束

时间:2015-02-17 18:20:08

标签: multithreading spring spring-boot spring-batch threadpoolexecutor

我正在使用Spring Batch 3.0.1。 我有一个两步的工作。

  • 第一步是读取进程写入块。它使用iText生成PDF文件,并使用Atomikos和JTA写入两个数据库。
  • 第二个只是登录文件“流程结束”的虚拟步骤

我已经配置了它,用 CommandLineJobRunner 方式启动它,我预期的工作已经完成,包括PDF和数据库。

写入最终消息“进程结束”;并且,在 batch_job_execution batch_step_execution 数据库表中,行使用 COMPLETED 状态和退出代码写入,并且结束时间。

所以,我的问题是提示没有回来,而且这个过程似乎正在执行。 当我使用Eclipse调试流程时,行为是相同的:工作已完成,但流程并未结束。与Atomikos,数据库池和步骤相关的线程仍在运行,我不明白为什么。

测试用例有9个PDF(项目)要处理。 第一步配置如下:

<bean id="printingTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize"   value="10" />
    <property name="maxPoolSize"    value="20" />
    <property name="queueCapacity"  value="50" />

    <property name="waitForTasksToCompleteOnShutdown" value="false" />
</bean>

<step id="pdfStep" next="endLoggerStep">
        <tasklet transaction-manager="jtaTransactionManager" task-executor="printingTaskExecutor" throttle-limit="10" >
            <batch:chunk reader="pdfItemReader" processor="pdfItemProcessor" writer="pdfItemWriter" commit-interval="20">
            </batch:chunk>
        </tasklet>
    </step>

pdfItemReader 是一个带有 pageSize 参数的JdbcPagingItemReader,其值也是20。

如何在命令行或Eclipse中实际完成该过程?任何错误的配置? 非常感谢任何帮助。感谢

[解决] 我对此很生气。最后,当使用跟踪级别进行日志记录时,最后一行是:

在bean上调用destroy方法'close',名称为'atomikosTransactionManager'

我将标志 forceShutdown 更改为true,最后程序感激不尽。

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
    init-method="init" destroy-method="close">
    <property name="forceShutdown" value="true" /><!-- Change this to true -->
</bean>

希望它有所帮助。

1 个答案:

答案 0 :(得分:-2)

您可以使用System.exit(0);在将终止JVM并最终终止批处理执行的主类末尾。