Пружинное пакетное задание случайным образом выбрасывает различные состояния выхода из состояния «СБОЙ» и «ЗАВЕРШЕНО». - PullRequest
0 голосов
/ 24 декабря 2018

Вот конфигурации весеннего пакетного проекта.

build.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: Ошибка создания компонента с именем 'scopedTarget.reader1', определенным в ресурсе пути к классу [spring / batch / jobs / spring-beans.xml]: Ошибка инициализации компонента;вложенным исключением является org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'org.springframework.data.mongodb.core.query.Query' для свойства 'query';Вложенное исключение: java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «org.springframework.data.mongodb.core.query.Query» для свойства «query»: нет подходящих редакторов или преобразованийстратегия нашла на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:584) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:498) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGetBean $ 1 (AbstractBeanFactory.java:356) в org.springframework.batch.core.scope.StepScope.get (StepScope.java:113) в org.springframework.suans.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:353) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:199) в org.springframework.aimparget.java: 35) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:193) в com.sun.proxy. $ Proxy18.open (неизвестный источник) в org.springframework.batch.item.support.CompositeItemStream.open (CompositeItemStream.java:103) в org.springframework.batch.core.step.tasklet.TaskletStep.open (TaskletStep.java:311) в org.springframework.batch.core.step.exp.Java: 200) в org.springframework.batch.core.job.SimpleStepHandler.handleStep (SimpleStepHandler.java:148) в org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep (Jobjlow:68).springframework.batch.core.job.flow.support.state.StepState.handle (StepState.java:67) в org.springframework.batch.core.job.flow.support.SimpleFlow.resume (SimpleFlow.java:169)в org.springframework.batch.core.job.flow.support.SimpleFlow.start (SimpleFlow.java:144) в org.springframework.batch.core.job.flow.FlowJob.doExecute (FlowJob.java:136) в организации.springframework.batch.core.job.AbstractJob.execute (AbstractJob.java:313) в org.springframework.batch.core.launch.support.SimpleJobLauncher $ 1.run (SimpleJobLauncher.java:144) в org.springframework.core.task.SyncTaskExutor (: 50) в org.springframework.batch.core.launch.support.SimpleJobLauncher.run (SimpleJobLauncher.java:137) в com.simba.tool.cacheserver.batchprocess.App.main (App.java:39)Вызвано: org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'org.springframework.data.mongodb.core.query.Query' для свойства 'query';Вложенное исключение: java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «org.springframework.data.mongodb.core.query.Query» для свойства «query»: нет подходящих редакторов или преобразованийстратегия, найденная в org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNeeded (AbstractNestablePropertyAccessor.java:590) в org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty.ImpraI: 219) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty (AbstractAutowireCapableBeanFactory.java:1697) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1653) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java: 1400) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:575) ... еще 22 причины: java.lang.IllegalSlang'к требуемому типу' org.springframework.data.mongodb.core.query.Query 'для свойства' query ': не найдены подходящие редакторы или стратегия преобразования в org.springframework.beans.TypeConverterDelegate.convertIfNeeded (TypeConverterDelegate.java:299) вorg.springframework.beans.AbstractNestablePropertyAccessor.convertIfNeeded (AbstractNestablePropertyAccessor.java:585) ... еще 28]

Бин, определяющий оба читателя, настроен следующим образом:

    <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>

Предыдущее исследование:

Мой поиск по сообщению об исключении: Cannot convert value of type 'java.lang.String' to required type 'org.springframework.data.mongodb.core.query.Query' for property '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, версия = 2, имя = step1, статус = 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: Ошибка создания бина с именем 'scopedTarget.reader', определенным в ресурсе пути к классу [spring / batch / jobs / spring-beans.xml]: инициализациябоб не удался;вложенным исключением является org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа 'com.sun.proxy. $ Proxy19, реализующее 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.Degradata.mongodb.core.query.Query 'для свойства' query ';вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа 'com.sun.proxy. $ Proxy19, реализующее 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.rag для получения необходимого типа.core.query.Query 'для свойства' query ': не найдены подходящие редакторы или стратегия преобразования в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:584ingf.su.su.su.su.su.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:498) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda $ doGet.Bean $ 1act.StepScope.java:113) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:353) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBean.Peaf.target.SimpleBeanTargetSource.getTarget (SimpleBeanTargetSource.java:35) в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:193) в com.sun.proxy.springframework.batch.item.support.CompositeItemStream.open (CompositeItemStream.java:103) в org.springframework.batch.core.step.tasklet.TaskletStep.open (TaskletStep.java:311) в org.spring.step.AbstractStep.execute (AbstractStep.java:200) в org.springframework.batch.core.job.SimpleStepHandler.handleStep (SimpleStepHandler.java:148) в org.springframework.batch.core.joblowSec.ec.JobFlowExecutor.java:68) в org.springframework.batch.core.job.flow.support.state.StepState.handle (StepState.java:67)в org.springframework.batch.core.job.flow.support.SimpleFlow.resume (SimpleFlow.java:169) в org.springframework.batch.core.job.flow.support.SimpleFlow.start (SimpleFlow.java:144)в org.springframework.batch.core.job.flow.FlowJob.doExecute (FlowJob.java:136) в org.springframework.batch.core.job.AbstractJob.execute (AbstractJob.java:313) в org.springframework.batch.core.launch.support.SimpleJobLauncher $ 1.run (SimpleJobLauncher.java:144) в org.springframework.core.task.SyncTaskExecutor.execute (SyncTaskExecutor.java:50) в org.springframework.SimpleJobLauncher.run (SimpleJobLauncher.java:137) в com.simba.tool.cacheserver.batchprocess.App.main (App.java:41)Вызывается: org.springframework.beans.ConversionNotSupportedException: не удалось преобразовать значение свойства типа 'com.sun.proxy. $ Proxy19, реализующее 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.Degradata.mongodb.core.query.Query 'для свойства' query ';вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа 'com.sun.proxy. $ Proxy19, реализующее 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.rag для получения необходимого типа.core.query.Query 'для свойства' query ': в org.springframework.beans не найдены подходящие редакторы или стратегия преобразования.: 604) в org.springframework.beans.BeanWrapperImpl.convertForProperty (BeanWrapperImpl.java:219) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProwireAAbleBeanFactory.java:1697) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1653) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1400) в орг.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:575) ... еще 22 Причины: java.lang.IllegalStateException: не удается преобразовать значение типа. j19.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 'для требуемого типа' org.springframework.data.mongodb.core.query.Query 'для свойства' query ': не найдено подходящих редакторов или стратегии преобразования в илиg.springframework.beans.TypeConverterDelegate.convertIfNeeded (TypeConverterDelegate.java:299) в org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNe Необходимый (AbstractNestablePropertyAccessor.42 * 28 * 10)

1 Ответ

0 голосов
/ 02 января 2019

Существует два метода setQuery в MongoItemReader: 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>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...