围绕这个主题似乎有很多问题,但我似乎找不到答案。如果这是个骗局,对不起!
我有一个有许多步骤的工作…在某一点上,我想并行地运行多个文件的项处理(读/验证/写)。在使这段代码并行之前,我同步运行了它,一切都很好。当我使用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的作业范围?他们是解决这个问题的变通办法吗?
尝试…
<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 计划程序提供你的操作系统用户密码。 【注意】请在设置计划之前保存批处理作业。在运行计划之前,在连接窗口内的密码必须保存。