Java 作业在quartz计划程序中被多次调用
我正在使用quartz调度器和cron表达式运行一个批处理作业,但该作业在循环中被多次调用 这里是配置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
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;
}