Multithreading Spring批处理:已完成的作业实际上并未结束
我使用的是SpringBatch 3.0.1。 我有一份分两步走的工作 第一步是读进程写块。它使用iText生成PDF文件,并使用Atomikos和JTA写入两个数据库。 第二个步骤只是一个虚拟步骤,用于登录进程结束的文件 我已经对它进行了配置,用CommandLineJobRunner way启动了它,我预期的工作已经完成,包括PDF和数据库 最后的消息处理结束后被写入;并且,在batch_job_execution和batch_step_execution数据库表中,使用完成状态和退出代码写入行,并完成结束时间 所以,我的问题是提示符没有返回,并且进程似乎正在执行。 当我用Eclipse调试流程时,行为是相同的:工作已经完成,但流程没有结束。与Atomikos、数据库池和步骤相关的线程仍在运行,我不明白为什么 测试用例有9个PDF项要处理。 第一步配置如下:Multithreading Spring批处理:已完成的作业实际上并未结束,multithreading,spring,spring-boot,spring-batch,threadpoolexecutor,Multithreading,Spring,Spring Boot,Spring Batch,Threadpoolexecutor,我使用的是SpringBatch 3.0.1。 我有一份分两步走的工作 第一步是读进程写块。它使用iText生成PDF文件,并使用Atomikos和JTA写入两个数据库。 第二个步骤只是一个虚拟步骤,用于登录进程结束的文件 我已经对它进行了配置,用CommandLineJobRunner way启动了它,我预期的工作已经完成,包括PDF和数据库 最后的消息处理结束后被写入;并且,在batch_job_execution和batch_step_execution数据库表中,使用完成状态和退出代码写
<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是一个JdbcPagingItemReader,pageSize参数的值也为20
如何在命令行或Eclipse中真正完成该过程?有没有错误的配置?
非常感谢您的帮助。谢谢
[已解决]
我被这个弄疯了。最后,当使用跟踪级别进行日志记录时,最后一行是:
在名为“atomikosTransactionManager”的bean上调用销毁方法“close”
我将标志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>
希望对您有所帮助。您可以使用System.exit0;在主类结束时,将终止JVM并最终终止批处理执行。在我做的一次测试中发生过一次,问题是处理器我忘记正确执行,进入了一个无休止的循环,请为处理器和读卡器以及编写器粘贴代码,“这也是对概念的误解。”Koitoer,我终于解决了这个问题。我不知道为什么,但Atomikos事务管理器并没有正确结束。我强迫它以一个参数结束,我在问题版中解释了它。谢谢。好奇的是,我以前在spring批处理作业中包含ehcache和spring缓存时见过这种行为。即使批处理作业退出,ehcache缓存管理器也不会关闭。我不知道它是否有类似的强制关机选项…@icebox13,很抱歉,我还没有将ehcache与Spring集成。最后发生了什么?你解决了吗?让我们知道。谢谢。@yaki_nuka不,我没有真正解决它。对于一个使用ehcache的批处理应用程序,我正在用XML进行spring批处理配置。我没有这个问题。对于另一个批处理应用程序,我保留了注释配置,只是取出了ehcache,并编写了几个quick&dirty缓存类来满足我的需要。在Spring场景中强制使用System.exit0可能会产生很大的破坏性影响。但是,谢谢你的评论。