最近正在做的项目,测试的时候发现定时调度任务会执行两次,于是乎查资料呀,都说是Tomcat配置问题,哥改了还是不行,后来无奈使用了一个网上说的方法,将JOB中的方法使用同步,通过一个静态变量进行控制,配置如下:
<bean id="sendOffMailTimerBean" class="com.c35.rouen.job.OffMailReportJob">
<property name="isolationAreaService">
<ref bean="isolationAreaService" />
</property>
</bean>
<bean id="offMailReportJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="sendOffMailTimerBean"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>doSend</value>
</property>
<property name="concurrent">
<value>false</value>
</property>
</bean>
<bean id="deleteOffMailTimerBean" class="com.c35.rouen.job.OffMailDestroyJob">
<property name="isolationAreaService">
<ref bean="isolationAreaService" />
</property>
</bean>
<bean id="offMailDestroyJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="deleteOffMailTimerBean"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod">
<value>doDelete</value>
</property>
<property name="concurrent">
<value>false</value>
</property>
</bean>
<!-- 每天整点发送隔离邮件报告 -->
<bean id="offMailReportSendTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="offMailReportJob"></property>
<property name="cronExpression">
<value>0 0 * * * ?</value>
</property>
</bean>
<!-- 每天凌晨三点检查删除过期的隔离邮件 -->
<bean id="offMailDestroyTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="offMailDestroyJob"></property>
<property name="cronExpression">
<value>0 0 3 * * ?</value>
</property>
</bean>
<!-- 启动定时器 -->
<bean id ="schedulerFactory" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="offMailReportSendTrigger" />
<ref bean="offMailDestroyTrigger" />
</list>
</property>
</bean>
JOB如下:
public class OffMailReportJob extends QuartzJobBean {
private IIsolationAreaService isolationAreaService;
public IIsolationAreaService getIsolationAreaService() {
return isolationAreaService;
}
public void setIsolationAreaService(IIsolationAreaService isolationAreaService) {
this.isolationAreaService = isolationAreaService;
}
private static JLogger log = LoggerFactory.getLogger(OffMailReportJob.class);
static int sendIndexFlag =0;//由doSend修改,其他方法不要修改此参数
public void doSend() {
// 定时器同时调用两次的问题需要查找原因
if (sendIndexFlag > 0)
return;// 保证同一时刻只有一个定时器运行,通过这种方式保证每次定时时间到时,只执行一个线程
sendIndexFlag = 1;// 锁定
try {
isolationAreaService.sendOffMailReport();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
sendIndexFlag = 0;// 锁定解除
}
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
}
照此修改时可以解决问题滴
后台又查啊查的,发现问题的根本:
web容器启动的时候,读取applicationContext.xml文件时,会加载一次。
第二次:Spring本身会加载applicationContext.xml一次。
一般来说,我们的quartz配置就是写在applicationContext.xml文件里的。
解决办法很简单
先把quartz配置信息提取出来,单独存成一个文件,比如applicationContext-quartz.xml
然后修改web.xml,让web容器启动时,可以加载该文件
这样quartz只会在web容器启动时加载一次,Spring不会再加载了。
分享到:
相关推荐
当我们遇到Spring定时器执行两次或者更多次的问题时,这通常是由于配置不当或者多线程并发导致的。下面将详细介绍如何使用Spring集成Quartz,以及解决定时任务重复执行的问题。 首先,让我们了解Spring如何配置...
Spring 和 Quartz 是两个在 Java 开发领域中非常重要的框架。Spring 是一个全面的、开源的应用框架,提供依赖注入(DI)、面向切面编程(AOP)以及用于简化企业级应用开发的其他功能。而 Quartz 是一个开源的作业...
通过对题目中提供的信息进行分析,我们可以了解到如何利用 Spring 与 Quartz 进行集成,从而实现 Tomcat 启动时调用 Quartz 执行一次任务的需求。通过合理配置 `SchedulerFactoryBean`、`CronTriggerBean` 和 `...
Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...
标题中的“spring定时器启动两次原因及解决”指的是在Spring框架中使用了定时任务功能,如Spring Boot的`@Scheduled`注解或者Spring Task模块,但遇到了定时任务被触发执行了两次的问题。这种情况可能是由于配置不当...
Spring 和 Quartz2 是两个在 Java 开发中广泛使用的框架,它们在企业级应用中承担着重要的角色。Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将...
本示例将探讨如何将 Spring 3 与 Quartz 1.8 和 2.2 版本进行整合,以实现高效的任务调度。 首先,我们来看 Spring 3 整合 Quartz 1.8 的步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的库,确保...
Spring和Quartz是Java开发中常用的两个框架,它们在企业级应用中被广泛用于实现定时任务的管理和执行。Spring提供了一个轻量级的容器来管理Bean,而Quartz则是一个强大的作业调度库,能够帮助开发者定义和执行定时...
在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...
在Java开发领域,Spring框架和Quartz库是两个非常重要的组件。Spring是一个全面的企业级应用框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,帮助开发者构建高效、灵活的Java应用程序...
Spring 和 Quartz 是两个在 Java 开发中非常重要的框架。Spring 是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等众多功能;而 Quartz 是一个强大的作业调度库,可以用于...
标题“springMvc定时器执行两次”涉及到的是Spring MVC与Quartz定时任务的集成问题,其中可能存在配置或逻辑上的错误导致定时任务被触发了两次。在Spring MVC应用中,Quartz是一个常用的库,用于实现定时任务的调度...
7. **启动和关闭Quartz**:在应用启动时,Spring会自动初始化并启动调度器。你也可以通过`SchedulerFactoryBean`的`start()`和`shutdown()`方法手动控制。 通过以上步骤,你可以在Spring应用中配置和运行多个Quartz...
在Java开发领域,Spring框架和Quartz库是两个非常重要的工具。Spring是一个全面的企业级应用框架,而Quartz则是一个强大的任务调度库。本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的...
标题“Spring整合Quartz定时发送邮件”涉及到两个主要技术领域:Spring框架和Quartz调度库。这个场景的应用是使用Quartz来安排任务,而Spring则提供了集成环境和邮件服务支持。 首先,Quartz是一个开源的作业调度...
Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...
在Java企业级应用开发中,Spring框架和Quartz是两个非常重要的组件。Spring是一个全面的、模块化的应用程序框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的数据访问和事务管理功能。而Quartz则是一个...
Spring框架和Quartz是Java开发中的两个重要工具,Spring用于管理对象(如bean)的生命周期,而Quartz则是一个强大的任务调度库。本项目结合两者,展示了如何在Spring中使用静态任务和动态任务,以及如何利用Spring的...
5. **配置Job和Trigger**:在Spring配置文件中,使用`org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean`和`org.springframework.scheduling.quartz.CronTriggerFactoryBean`配置Job和...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...