当前位置: 首页 > 知识库问答 >
问题:

Spring Batch 3.0.10-使用TaskExecutor的并行步骤-不理解作业范围bean

姚星宇
2023-03-14

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

我有一个有许多步骤的工作…在某一点上,我想并行地运行多个文件的项处理(读/验证/写)。在使这段代码并行之前,我同步运行了它,一切都很好。当我使用task-executor添加batch:split时,我现在得到的错误是:

2020-09-01 01:07:12,668[SimpleAsyncTaskExecutor-1]错误AbstractStep-在作业ATPRuleCombined org.springframework.beans.factory.beanCreationException中执行步骤loadBaseFareInfo时遇到错误:创建名为“ScopedTarget.AllAddScleanupProcessorForBaseFareInfo”的bean时出错:范围“job”对于当前线程不是活动的;如果您打算从单个对象引用这个bean,请考虑为它定义一个限定作用域的代理;嵌套异常是java.lang.IllegalStateException:没有可用于作业范围的上下文持有人

以下是相关代码:

        <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的作业范围?他们是解决这个问题的变通办法吗?

共有1个答案

谯皓君
2023-03-14

尝试…

 <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>
 类似资料:
  • 我正在处理一个使用Spring批处理的项目。在本项目中,我使用Spring批处理后期绑定,其中我使用JobParameters注入了一个参数(将用作SQL读取器查询的条件的字符串)。目前,我正在使用进行后期绑定,所有操作都非常正常。 这里我要问的是何时使用以及何时使用。我已经阅读了Spring批处理参考文件,并在谷歌上搜索了StepScope和jobscope。我得到的只是: a.StepScop

  • 我有一个有多个方法的TestNG测试。范围报告在主类中有效,但当我尝试为其他方法编写日志时,我得到了空指针异常。所有教程都指向在主方法中编写日志,但没有指向其他方法。我已经努力寻找解决方案一个星期了。有人能帮我吗?谢谢 我的代码是这样的 以下内容写在主测试中 我的完整代码在这里

  • null null 任何解决问题的帮助/指针都是非常感谢的。 谢谢,哈尔·克里尚

  • 我正在编写一个需要处理大量URL的java程序 每个URL将按顺序运行以下作业:下载、分析、压缩 我希望每个作业都有固定数量的线程,这样所有作业在任何给定时间都有并发运行的线程,而不是每个URL一次使用一个线程来完成所有作业。 例如,下载作业将有多个线程来获取和下载URL,一旦其中一个URL被下载,它就会将其传递给分析作业中的一个线程,一旦完成,它就会传递给压缩作业中的一个线程,等等。 我正在考虑

  • 我正在尝试在Spring批处理中并行运行多个作业。在谷歌上搜索了很多之后,我遇到了JobStep。有没有人使用过JobStep可以解释如何使用它来并行运行作业,或者有没有其他方法可以并行运行2个独立的作业,即当我启动批处理时,2个作业应该开始并行运行。我的要求就像 当我的应用程序启动时,两个作业都应该开始运行。使用spring batch是否可以这样做 编辑:我甚至试过这种方法 我面临着例外。sp

  • 你可以点击 “设置任务计划”来为一个批处理作业设置计划和点击 “删除任务计划”来移除计划。 如果你在“常规”选项卡选择“不管用户是否登录都要运行”,当你保存计划时你必须在 Windows 计划程序提供你的操作系统用户密码。 【注意】请在设置计划之前保存批处理作业。在运行计划之前,在连接窗口内的密码必须保存。