让我解释一下我的应用程序是如何设置的。首先,我有一个独立的命令行启动应用程序,该应用程序运行一个主程序,而主程序又在传递适当参数的作业操作员上调用 start。我知道 start 是一个异步调用,一旦我调用 start ,除非我在我的 main 中阻塞了一些它是如何死的。
我遇到的问题是,当我运行分区作业时,它似乎使一些线程处于活动状态,从而阻止了整个处理结束。当我运行非分区作业时,一旦作业完成,进程就会正常结束。
这是正常和/或预期的行为吗?有没有办法告诉分区线程死亡。似乎分区线程在作业完成后被阻塞等待某些东西,它们不应该是吗?
我知道我可以监控主要的批处理状态并可能结束它,但正如我在另一个问题中所说的那样,这给数据库增加了大量的喋喋不休,并不理想。
我的工作规范的一个例子
<job id="partitionTest" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="onlyStep">
<partition>
<plan partitions="2">
<properties partition="0">
<property name="partitionNumber" value="1"></property>
</properties>
<properties partition="1">
<property name="partitionNumber" value="2"></property>
</properties>
</plan>
</partition>
<chunk item-count="2">
<reader id="reader" ref="DelimitedFlatFileReader">
<properties>
<!-- Reads in from file Test.csv -->
<property name="fileNameAndPath" value="#{jobParameters['inputPath']}/CSVInput#{partitionPlan['partitionNumber']}.csv" />
<property name="fieldNames" value="firstName, lastName, city" />
<property name="fullyQualifiedTargetClass" value="com.test.transactionaltest.Member" />
</properties>
</reader>
<processor ref="com.test.partitiontest.Processor" />
<writer ref="FlatFileWriter" >
<properties>
<property name="appendOn" value="true"/>
<property name="fileNameAndPath" value="#{jobParameters['outputPath']}/PartitionOutput.txt" />
<property name="fullyQualifiedTargetClass" value="com.test.transactionaltest.Member" />
</properties>
</writer>
</chunk>
</step>
</job>
编辑:
好的,阅读有关此问题的更多信息并查看 spring 批处理代码,至少在我看来,JsrPartitionHandler 中似乎存在一个错误。具体来说,handle 方法会在本地创建一个 ThreadPoolTaskExecutor,但是该线程池永远不会被正确清理。应该在该方法返回之前调用关闭/销毁以执行一些清理,否则线程会留在内存中并超出范围。
如果我在这里错了,请纠正我,但这绝对是问题所在。
我要去尝试改变它,看看它是如何发挥作用的。我做了一些测试后会更新。