【问题标题】:Spring Batch 3.0.10 - Parallel Steps using TaskExecutor - Does not understand Job scope beansSpring Batch 3.0.10 - 使用 TaskExecutor 的并行步骤 - 不理解作业范围 bean
【发布时间】:2020-12-20 06:06:43
【问题描述】:

似乎有很多关于这个主题的问题,但我似乎找不到答案。对不起,如果这是一个骗局!

我有一个包含许多步骤的作业...在某一时刻,我想并行运行多个文件的项目处理(读取/验证/写入)。在使这段代码并行之前,我同步运行它,一切都很好。当我使用任务执行器添加批处理:拆分时,我现在收到错误:

2020-09-01 01:07:12,668 [SimpleAsyncTaskExecutor-1] 错误 AbstractStep - 在作业 ATPRuleCombined 中执行步骤 loadBaseFareInfo 时遇到错误 org.springframework.beans.factory.BeanCreationException:创建名为'scopedTarget.allAddsCleanupProcessorForBaseFareInfo'的bean时出错:范围'job'对于当前线程不活动;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException: No context holder available for job scope

以下是相关代码:

        <batch:split id="loadMainTables" next="saveCacheNotification" task-executor="taskExecutor">
        <batch:flow>
            <batch:step id="loadBaseFareInfo">
                <batch:tasklet>
                    <batch:chunk reader="baseFareInfoGroupReader" processor="baseFareInfoGroupValidator"  writer="baseFareInfoGroupWriter"
                                 chunk-completion-policy="baseFareInfoCompletionPolicy">
                        <!--commit-interval="${baseFareInfo.commitInterval}"> -->
                        <!-- skip-policy="alwaysSkipPolicy"> -->
                        <batch:listeners>
                            <batch:listener ref="errorDataFileItemReadListener"/>
                            <batch:listener ref="springContextRepo"/>
                            <batch:listener ref="allAddsCleanupProcessorForBaseFareInfo"/>
                            <batch:listener ref="baseFareInfo.groupMetricListener"/>
                            <batch:listener ref="baseFareInfoGroupWriter"/>
                            <batch:listener ref="baseFareInfoGroupReader"/>
                            <batch:listener ref="baseFareInfoStepLocking"/>
                        </batch:listeners>
                        <batch:streams>
                            <batch:stream ref="baseFareInfoItemReader"/>
                        </batch:streams>
                    </batch:chunk>
                </batch:tasklet>
            </batch:step>
        </batch:flow>
        <batch:flow>
            <batch:step id="loadNegFareSecurity">
                <batch:tasklet>
                    <batch:chunk reader="negFareSecurityGroupReader" processor="negFareSecurityGroupValidator"  writer="negFareSecurityGroupWriter"
                                 chunk-completion-policy="negFareSecurityCompletionPolicy">
                        <!--commit-interval="${negFareSecurity.commitInterval}"> -->
                        <!-- skip-policy="alwaysSkipPolicy"> -->
                        <batch:listeners>
                            <batch:listener ref="errorDataFileItemReadListener"/>
                            <batch:listener ref="springContextRepo"/>
                            <batch:listener ref="allAddsCleanupProcessorForNegFareSecurity"/>
                            <batch:listener ref="negFareSecurity.groupMetricListener"/>
                            <batch:listener ref="negFareSecurityGroupWriter"/>
                            <batch:listener ref="negFareSecurityGroupReader"/>
                            <batch:listener ref="negFareSecurityStepLocking"/>
                        </batch:listeners>
                        <batch:streams>
                            <batch:stream ref="negFareSecurityItemReader"/>
                        </batch:streams>
                    </batch:chunk>
                </batch:tasklet>
            </batch:step>
        </batch:flow>
    </batch:split>

    <bean id="allAddsCleanupProcessorForBaseFareInfo"
      class="com.sabre.aircontent.batch2.rule.basefareinfo.cleanup.AllAddsCleanupProcessorForBaseFareInfo" scope="job">
    <property name="headerRepo" ref="headerRepo" />
    <property name="allAddsCleanupCursor" ref="hibernateCursorForBaseFareInfoAllAddsCleanup" />
    <property name="dao" ref="baseFareInfoDao" />
    <property name="cacheNotificationService" ref="cacheNotificationService"/>
    <property name="resourceName" value="#{jobParameters['job.resource']}" />
    <property name="entityName" value="${baseFareInfo.baseEntityName:#{null}}" />
    <property name="expireThresholdInPercent" value="${basefareinfo.allAdds.expireThresholdInPercent}"/>
    <property name="metricRepo" ref="baseFareInfo.metricRepo"/>
    <property name="jobStartTime"
              value="#{jobExplorer.getJobExecution(jobOperator.getExecutions(jobExecution.jobInstance.instanceId)[jobOperator.getExecutions(jobExecution.jobInstance.instanceId).size()-1]).startTime}"/>
    <property name="additionalCursorParamValues">
        <map>
            <entry key="vendor" value="${vendor}" />
        </map>
    </property>
</bean>

为什么不再识别 allAddsCleanupProcessorForBaseFareInfo bean 的作业范围?他们是解决这个问题的方法吗?

【问题讨论】:

  • 请用批处理配置添加整个 XML,而不仅仅是您认为与问题相关的部分。谢谢。

标签: java spring spring-batch


【解决方案1】:

试试

 <bean id="allAddsCleanupProcessorForBaseFareInfo"
  class="com.sabre.aircontent.batch2.rule.basefareinfo.cleanup.AllAddsCleanupProcessorForBaseFareInfo" scope="step">
<property name="headerRepo" ref="headerRepo" />
<property name="allAddsCleanupCursor" ref="hibernateCursorForBaseFareInfoAllAddsCleanup" />
<property name="dao" ref="baseFareInfoDao" />
<property name="cacheNotificationService" ref="cacheNotificationService"/>
<property name="resourceName" value="#{jobParameters['job.resource']}" />
<property name="entityName" value="${baseFareInfo.baseEntityName:#{null}}" />
<property name="expireThresholdInPercent" value="${basefareinfo.allAdds.expireThresholdInPercent}"/>
<property name="metricRepo" ref="baseFareInfo.metricRepo"/>
<property name="jobStartTime"
          value="#{jobExplorer.getJobExecution(jobOperator.getExecutions(jobExecution.jobInstance.instanceId)[jobOperator.getExecutions(jobExecution.jobInstance.instanceId).size()-1]).startTime}"/>
<property name="additionalCursorParamValues">
    <map>
        <entry key="vendor" value="${vendor}" />
    </map>
</property>

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2018-06-20
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多