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

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

胡光霁
2023-03-14

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");
}

定义两个读取器的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>

以前的研究:

我对异常消息的搜索:无法将“java.lang.String”类型的值转换为属性“query”所需的类型“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>

现在以以下跟踪结束:

共有1个答案

江衡
2023-03-14

MongoItemReader中有两个setQuery方法:setQuery(Query)setQuery(String)。因此,当使用XML配置时,使用哪种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>
 类似资料:
  • 我有两个不同的工作(实际上更多,但为了简单起见,假设2)。每个作业可以与另一个作业并行运行,但同一作业的每个实例应该顺序运行(否则实例将共享彼此的资源)。 基本上,我希望这些作业中的每一个都有自己的作业实例队列。我想我可以使用两个不同的线程池作业启动程序(每个都有一个线程),并将一个作业启动程序与每个作业相关联。 在从Spring Batch Admin web UI中启动作业时,是否有一种方法可

  • 我最近使用。我对DB表进行了必要的更改,并对一些与参数API相关的微小代码进行了更改。 现在,当我运行应用程序时,它正在工作,但是如果一个步骤的退出状态为失败,则作业的存在状态设置为完成。这会导致一些问题,因为我们的应用程序代码将其视为成功执行。我通过在中添加一个代码片段来解决这个问题,在这里我检查列表并手动设置作业退出状态,但是Spring批处理框架不应该处理退出状态吗?

  • ...there are dark corners in the Bourne shell, and people use all of them. Chet Ramey exit 命令一般用于结束一个脚本,就像C语言的exit一样。它也能返回一个值给父进程。 每一个命令都能返回一个退出状态(有时也看做 返回状态 ).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零值,此值通常可以被解释

  • 我有一个Spring批处理tasklet,我不知道如何从中失败。我想检查某些参数,如果它们不存在,则在该步骤中使作业失败。 注释掉的行是我试图让工作退出的行。有人有过这样的经历吗?

  • > 我试图在作业完成之前返回Spring Batch作业ID。 我当前的实现只在作业完成后返回信息。 我使用批处理程序控制器和批处理服务,发布在下面。谢谢,我是新来的Spring Batch,经过详尽的搜索,找不到太多与我的问题相关的。有一个帖子有人使用Apache骆驼,但我没有。 控制器 服务 再次感谢。 编辑 我已将其添加到批处理配置中 编辑 在马哈茂德·本·哈辛的评论的帮助下,我解决了这个问