Java 作业在quartz计划程序中被多次调用

Java 作业在quartz计划程序中被多次调用,java,spring,spring-mvc,quartz-scheduler,spring-batch,Java,Spring,Spring Mvc,Quartz Scheduler,Spring Batch,我正在使用quartz调度器和cron表达式运行一个批处理作业,但该作业在循环中被多次调用 这里是配置 public static void main(String[] args) { String[] springConfig = { "classpath:/execs/execJob.xml" }; ApplicationContext con

我正在使用quartz调度器和cron表达式运行一个批处理作业,但该作业在循环中被多次调用

这里是配置

public static void main(String[] args) {            
        String[] springConfig  = 
            {   
                "classpath:/execs/execJob.xml" 
            };

        ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);       

}
在execJob.xml中-

<import resource="classpath:/schedulers/BatchLaunch.xml" />
下面是日志文件:

    2015-02-06 11:44:27  INFO   jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver 
2015-02-06 11:44:28  INFO   launch.support.SimpleJobLauncher - No TaskExecutor has been set, defaulting to synchronous executor. 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2015-02-06 11:44:29  INFO   context.support.DefaultLifecycleProcessor - Starting beans in phase 2147483647 
2015-02-06 11:44:29  INFO   scheduling.quartz.SchedulerFactoryBean - Starting Quartz Scheduler now 
Done
2015-02-06 11:44:29  INFO   launch.support.SimpleJobLauncher - Job: [FlowJob: [name=Job]] launched with the following parameters: [{reconTimestamp=2014-03-01 00:00:00, timestamp=1423203269076}] 
2015-02-06 11:44:29  INFO   launch.support.SimpleJobLauncher - Job: [FlowJob: [name=Job]] launched with the following parameters: [{reconTimestamp=2014-03-01 00:00:00, timestamp=1423203269075}] 
2015-02-06 11:44:29  INFO   core.job.SimpleStepHandler - Executing step: [deleteFromLineImport] 
2015-02-06 11:44:30  INFO   core.job.SimpleStepHandler - Executing step: [deleteFromLineImport] 
2015-02-06 11:44:30  INFO   launch.support.SimpleJobLauncher - Job: [FlowJob: [name=Job]] launched with the following parameters: [{reconTimestamp=2014-03-01 00:00:00, timestamp=1423203270003}] 
2015-02-06 11:44:30  INFO   core.job.SimpleStepHandler - Executing step: [deleteFromLineImport] 
2015-02-06 11:44:30  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - Inside DeleteLineImportTasklet:::::: PC - 1 
2015-02-06 11:44:30  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:30  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - Inside DeleteLineImportTasklet:::::: PC - 1 
2015-02-06 11:44:30  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:30  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - Inside DeleteLineImportTasklet:::::: PC - 1 
2015-02-06 11:44:30  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - process Executed 
2015-02-06 11:44:31  INFO   launch.support.SimpleJobLauncher - Job: [FlowJob: [name=Job]] launched with the following parameters: [{reconTimestamp=2014-03-01 00:00:00, timestamp=1423203271002}] 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - process Executed 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - process Executed 
2015-02-06 11:44:31  INFO   core.job.SimpleStepHandler - Executing step: [deleteFromLineImport] 
2015-02-06 11:44:31  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - Inside DeleteLineImportTasklet:::::: PC - 1 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.delLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.tasklet.DeleteLineImportTasklet - process Executed 
2015-02-06 11:44:31  INFO   core.job.SimpleStepHandler - Executing step: [insertIntoLineImport] 
2015-02-06 11:44:31  INFO   core.job.SimpleStepHandler - Executing step: [insertIntoLineImport] 
2015-02-06 11:44:31  INFO   core.job.SimpleStepHandler - Executing step: [insertIntoLineImport] 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Inside ReadReconDataForProcessorTasklet Tasklet  ::: PC - 2 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>0 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>1 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>2 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>3 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>4 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>5 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>6 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>7 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>8 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>9 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Writting successfull 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Inside ReadReconDataForProcessorTasklet Tasklet  ::: PC - 2 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>10 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>11 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>12 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>13 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>14 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>15 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>16 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>17 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>18 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>19 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Inside ReadReconDataForProcessorTasklet Tasklet  ::: PC - 2 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Writting successfull 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>20 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>21 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>22 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>23 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>24 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>25 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>26 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>27 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>28 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>29 
2015-02-06 11:44:31  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:31  INFO   reconandsettlement.writer.ReconLineWritter - Writting successfull 
2015-02-06 11:44:31  INFO   core.job.SimpleStepHandler - Executing step: [insertIntoLineImport] 
2015-02-06 11:44:32  INFO   reconandsettlement.writer.ReconLineWritter - Inside ReadReconDataForProcessorTasklet Tasklet  ::: PC - 2 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Entry into com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>30 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>31 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>32 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>33 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>34 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>35 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>36 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>37 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>38 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Reading Record NO ==============>39 
2015-02-06 11:44:32  INFO   launch.support.SimpleJobLauncher - Job: [FlowJob: [name=Job]] launched with the following parameters: [{reconTimestamp=2014-03-01 00:00:00, timestamp=1423203272001}] 
2015-02-06 11:44:32  INFO   dao.impl.ReconDaoImpl - Exit from com.abc.reconandsettlement.dao.impl.insertLineImport() 
2015-02-06 11:44:32  INFO   reconandsettlement.writer.ReconLineWritter - Writting successfull 
在这里,一次又一次地调用微线程。 有人能告诉我这里发生了什么吗?
我是否缺少任何配置或有任何错误?

我们遇到了此问题。我们的情况是,我们在applicationContext.xml中配置了一个bean,但我们还使用了:

ApplicationContext context = new ClassPathXmlApplicationContext("/config/applicationContext.xml");
总共有两个bean,所以我们的任务执行两次。 最近,我们改变了这一点:

MyBean myBean = (MyBean) BeanUtils.getBean("beanName", MyBean.class); 
一切都好

这是海狸:

public final class BeanUtils implements ApplicationContextAware {

private static ApplicationContext applicationContext;

public static Object getBean(String beanName) {
    return applicationContext.getBean(beanName);
}

public static <T> T getBean(String beanName, Class<T> clazs) {
    return clazs.cast(getBean(beanName));
}

public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    BeanUtils.applicationContext = applicationContext;
}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}
public final类BeanUtils实现ApplicationContextAware{
私有静态应用上下文应用上下文;
公共静态对象getBean(字符串beanName){
返回applicationContext.getBean(beanName);
}
公共静态T getBean(字符串beanName,类CLAZ){
return clazs.cast(getBean(beanName));
}
public void setApplicationContext(ApplicationContext ApplicationContext)
抛出BeansException{
BeanUtils.applicationContext=applicationContext;
}
公共静态应用程序上下文getApplicationContext(){
返回applicationContext;
}
}

希望这有帮助

Opps!!! 我在做一件蠢事。 这一切都是用cron表达的,
我每秒钟都在安排它。

你能确保
com.abc.scheduler.JobLauncherDetails
类在
springBatchDbContext.xml
simpleJobEnvironment.xml
中没有声明为bean吗?不,它没有在那里声明。这两个xml仅包含db和与作业相关的bean。能否请您共享
类路径:/jobs/job.xml
的详细信息?xml包含Tasklet和支持bean,没有其他内容。事实上,当我通过一个主类运行它或从UI触发它时,它可以完美地工作。当我集成quartz来调度作业时,这个问题就开始了。在我的例子中,它被执行了很多次(不是两次或三次),而且我没有多次调用任何bean。感谢您的回复。请使用“0 0/1***?”,每10分钟运行一次。我只是在不知不觉中将*而不是0保留在秒的位置。
MyBean myBean = (MyBean) BeanUtils.getBean("beanName", MyBean.class); 
public final class BeanUtils implements ApplicationContextAware {

private static ApplicationContext applicationContext;

public static Object getBean(String beanName) {
    return applicationContext.getBean(beanName);
}

public static <T> T getBean(String beanName, Class<T> clazs) {
    return clazs.cast(getBean(beanName));
}

public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
    BeanUtils.applicationContext = applicationContext;
}

public static ApplicationContext getApplicationContext() {
    return applicationContext;
}