Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Spring批处理:已完成的作业实际上并未结束_Multithreading_Spring_Spring Boot_Spring Batch_Threadpoolexecutor - Fatal编程技术网

Multithreading Spring批处理:已完成的作业实际上并未结束

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数据库表中,使用完成状态和退出代码写

我使用的是SpringBatch 3.0.1。 我有一份分两步走的工作

第一步是读进程写块。它使用iText生成PDF文件,并使用Atomikos和JTA写入两个数据库。 第二个步骤只是一个虚拟步骤,用于登录进程结束的文件 我已经对它进行了配置,用CommandLineJobRunner way启动了它,我预期的工作已经完成,包括PDF和数据库

最后的消息处理结束后被写入;并且,在batch_job_execution和batch_step_execution数据库表中,使用完成状态和退出代码写入行,并完成结束时间

所以,我的问题是提示符没有返回,并且进程似乎正在执行。 当我用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是一个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可能会产生很大的破坏性影响。但是,谢谢你的评论。