gpt4 book ai didi

java - Spring Batch 作业随机抛出 FAILED 和 COMPLETED 之间的不同退出状态

转载 作者:行者123 更新时间:2023-11-30 05:51:06 25 4
gpt4 key购买 nike

以下是 spring-batch 项目的配置。

构建.gradle:

apply plugin: 'java'

repositories {
jcenter()
mavenCentral()
maven { url "http://repo.spring.io/libs-milestone" }
}

dependencies {

// https://mvnrepository.com/artifact/org.springframework/spring-core
compile group: 'org.springframework', name: 'spring-core', version: '5.1.3.RELEASE'

// https://mvnrepository.com/artifact/org.springframework/spring-context
compile group: 'org.springframework', name: 'spring-context', version: '5.1.3.RELEASE'

// https://mvnrepository.com/artifact/org.springframework/spring-web
compile group: 'org.springframework', name: 'spring-web', version: '5.1.3.RELEASE'

compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.3.RELEASE'

// https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-core
compile group: 'org.springframework.batch', name: 'spring-batch-core', version: '4.1.0.RELEASE'

// https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-infrastructure
compile group: 'org.springframework.batch', name: 'spring-batch-infrastructure', version: '4.1.0.RELEASE'

// https://mvnrepository.com/artifact/org.springframework.batch/spring-batch-test
testCompile group: 'org.springframework.batch', name: 'spring-batch-test', version: '4.1.0.RELEASE'

// https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb
compile group: 'org.springframework.data', name: 'spring-data-mongodb', version: '2.1.3.RELEASE'

compile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.9.1'

compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6'

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.7'

}

作业配置:

<batch:job id="batchUpdateJob" job-repository="jobRepository">
<batch:step id="step1" next="step2">
<batch:tasklet allow-start-if-complete="true">
<batch:chunk reader=“reader1”
writer="compositeWriter" processor=“processor1” commit-interval="10" />
</batch:tasklet>
</batch:step>

<batch:step id="step2">
<batch:tasklet allow-start-if-complete="true">
<batch:chunk reader=“reader2”
writer=“writer2” processor=“processor2” commit-interval="10" />
</batch:tasklet>
</batch:step>
</batch:job>

运行批处理作业的main():

public static void main(String[] args) {
// Loading The Bean Definition From The Spring Configuration File
contextObj = new ClassPathXmlApplicationContext(springConfig);
jobObj = (Job) contextObj.getBean(JOB_NAME);
jobLauncherObj = (JobLauncher) contextObj.getBean(JOB_LAUNCHER_NAME);
try {
JobParametersBuilder jobBuilder = new JobParametersBuilder();
JobExecution execution = jobLauncherObj.run(jobObj, jobParameters);
System.out.println("Exit Status : " + execution.getStatus());
} catch (Exception exceptionObj) {
exceptionObj.printStackTrace();
}
System.out.println("Done");
}

对于 main() 的每次运行,所执行作业的 exitStatus 要么是 COMPLETED 要么是 FAILED,尽管没有更改项目是在运行之间进行的。

当退出状态为 FAILED 时,stepExecutions 具有以下跟踪:

[StepExecution: id=1, version=2, name=step1, status=FAILED, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=0, exitDescription=org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.reader1’ defined in class path resource [spring/batch/jobs/spring-beans.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:584) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356) at org.springframework.batch.core.scope.StepScope.get(StepScope.java:113) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:193) at com.sun.proxy.$Proxy18.open(Unknown Source) at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:103) at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:311) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:68) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:136) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:313) at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:144) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:137) at com.simba.tool.cacheserver.batchprocess.App.main(App.java:39) Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:590) at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:604) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:219) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1697) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1653) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1400) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575) ... 22 more Caused by: java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:299) at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:585) ... 28 more ]

定义两个阅读器的 Bean 的配置如下:

    <bean id="reader"
class="org.springframework.batch.item.data.MongoItemReader" scope="step">
<property name="template" ref="mongoTemplate" />
<property name="collection" value="Collection" />
<property name="targetType" value="com.example.SomeObject" />
<property name="query" value="{ $and : [ { 'Field1': /.*#{jobParameters['Param1']}.*/ }, { 'Field2': { $gte: ISODate('9999-12-30T00:00:00Z') } }, { 'Field3': { '$eq': 'Open' } } ] }" />
<property name="sort">
<util:map>
<entry key="Field4" value="#{T(org.springframework.data.domain.Sort.Direction).ASC}" />
</util:map>
</property>
<property name="fields" value="{ 'Field5': 1, 'Field6': 1, 'Field7': 1 }" />
</bean>

之前的研究:

我对异常消息的搜索:无法将属性“query”的类型“java.lang.String”的值转换为所需类型“org.springframework.data.mongodb.core.query.Query” 没有获取任何相关结果。使用本问题标题中的关键字进行的研究也没有提供太多线索。

为什么批处理作业执行有时失败,有时完成?解决这个问题的方法是什么?

<小时/>

更新:尝试将读者的定义更改为:

<bean id="query" class="java.lang.String">
<constructor-arg value="your json query here"/>
</bean>

<bean id="mongoItemReader" class="org.springframework.batch.item.data.MongoItemReader">
<property name="query" ref="query"/>
<!-- define other properties of the reader here -->
</bean>

现在最终得到以下跟踪:

[StepExecution: id=1, version=2, name=step1, status=FAILED, exitStatus=FAILED, readCount=0, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=0, exitDescription=org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.reader' defined in class path resource [spring/batch/jobs/spring-beans.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.sun.proxy.$Proxy19 implementing java.io.Serializable,java.lang.Comparable,java.lang.CharSequence,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'com.sun.proxy.$Proxy19 implementing java.io.Serializable,java.lang.Comparable,java.lang.CharSequence,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:584) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$1(AbstractBeanFactory.java:356) at org.springframework.batch.core.scope.StepScope.get(StepScope.java:113) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:353) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:193) at com.sun.proxy.$Proxy18.open(Unknown Source) at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:103) at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:311) at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:68) at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:136) at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:313) at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:144) at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:137) at com.simba.tool.cacheserver.batchprocess.App.main(App.java:41) Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.sun.proxy.$Proxy19 implementing java.io.Serializable,java.lang.Comparable,java.lang.CharSequence,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'com.sun.proxy.$Proxy19 implementing java.io.Serializable,java.lang.Comparable,java.lang.CharSequence,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:590) at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:604) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:219) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1697) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1653) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1400) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:575) ... 22 more Caused by: java.lang.IllegalStateException: Cannot convert value of type 'com.sun.proxy.$Proxy19 implementing java.io.Serializable,java.lang.Comparable,java.lang.CharSequence,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'org.springframework.data.mongodb.core.query.Query' for property 'query': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:299) at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:585) ... 28 more ]

最佳答案

MongoItemReader 中有两个 setQuery 方法:setQuery(Query)setQuery(String) 。因此,当使用 XML 配置时,使用哪一种可能会存在歧义。在您的情况下,Spring 似乎正在尝试将您的 String 查询转换为 org.springframework.data.mongodb.core.query.Query 对象,但它找不到一个转换器。

您需要指定要使用的查询类型并将其设置在阅读器上。

在您的示例中,您需要使用以下内容配置查询和阅读器:

<bean id="query" class="java.lang.String">
<constructor-arg value="your json query here"/>
</bean>

<bean id="mongoItemReader" class="org.springframework.batch.item.data.MongoItemReader">
<property name="query" ref="query"/>
<!-- define other properties of the reader here -->
</bean>

希望这有帮助。

关于java - Spring Batch 作业随机抛出 FAILED 和 COMPLETED 之间的不同退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53912923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com