微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring 调度程序任务 - Cron Job 没有按计划在 Spring Batch 中工作,它只是继续运行?

如何解决Spring 调度程序任务 - Cron Job 没有按计划在 Spring Batch 中工作,它只是继续运行?

我有使用任务调度程序的 Spring Batch 应用程序,目前设置为每 3 分钟运行一次。

截至目前,应用程序计划(cron 作业)已硬编码,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd    
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd">

    <bean id="transactionManager"
          class="org.springframework.batch.support.transaction.ResourcelesstransactionManager" />

    <bean id="jobLauncher"  class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
        <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor" ref="simpleAsyncTaskExecutor" />
    </bean>

    <bean id="simpleAsyncTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryfactorybean" />

    <bean id="springSchedulingLauncher" class="com.javacodegeeks.example.scheduler.JobScheduler"></bean>

    <!-- -->
    <task:scheduler id="scheduler" />

    <task:scheduled-tasks scheduler="scheduler">

        <task:scheduled ref="springSchedulingLauncher"
                        method="launch"
                        cron="0 0/3 * ? * *"
        />
    </task:scheduled-tasks>
    <!-- -->

</beans>

下面是java代码

package com.javacodegeeks.example.scheduler;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClasspathXmlApplicationContext;
import org.springframework.scheduling.annotation.Scheduled;

public class JobScheduler {
    @Scheduled(cron = "0 0/3 * ? * *")
    public void launch() throws Exception {
        System.out.println("Starting Launch");
        String[] str = {"meta-inf/spring/context-config.xml","meta-inf/spring/job-config.xml"};
        ApplicationContext ctx = new ClasspathXmlApplicationContext(str);
        Job job = (Job) ctx.getBean("myJob");
        JobLauncher jobLauncher = (JobLauncher) ctx.getBean("jobLauncher");
        try{
            JobExecution execution = jobLauncher.run(job,new JobParameters());
            System.out.println("Job Execution Status: "+ execution.getStatus());
        }catch(Exception e){
            e.printstacktrace();
        }
        System.out.println("Completed Launch");
    }
}

下面给出了 App.java(主要方法

package com.javacodegeeks.example.app;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClasspathXmlApplicationContext;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.Date;

public class App {
    public static void main(String[] args) {
        System.out.println("Starting Main");
        String[] str = {"meta-inf/spring/context-config.xml",new JobParameters());
            System.out.println("Job Execution Status: "+ execution.getStatus());
        }catch(Exception e){
            e.printstacktrace();
        }
        System.out.println("Completed Main");
    }
}

看起来它正在启动多个作业,但不知道为什么?我该如何解决这个问题?

enter image description here

解决方法

您的 XML 元素 <task:scheduler><task:scheduled-tasks> 没有用 <!-- --> 正确注释。你认为他们被评论了,但事实并非如此。因此,该任务被安排了两次:一次在 XML 配置中,一次在 launch 方法内的 Java 配置中。

以下是正确注释 XML 部分的方法:

<!--
    <task:scheduler id="scheduler" />

    <task:scheduled-tasks scheduler="scheduler">

        <task:scheduled ref="springSchedulingLauncher"
                        method="launch"
                        cron="0 0/3 * ? * *"
        />
    </task:scheduled-tasks>
-->

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。