`
Max_1106
  • 浏览: 21896 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类

spring下quartz启动两次的问题

阅读更多

最近正在做的项目,测试的时候发现定时调度任务会执行两次,于是乎查资料呀,都说是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 java 定时器 执行两次 quartz

    当我们遇到Spring定时器执行两次或者更多次的问题时,这通常是由于配置不当或者多线程并发导致的。下面将详细介绍如何使用Spring集成Quartz,以及解决定时任务重复执行的问题。 首先,让我们了解Spring如何配置...

    spring+quartz demo

    Spring 和 Quartz 是两个在 Java 开发领域中非常重要的框架。Spring 是一个全面的、开源的应用框架,提供依赖注入(DI)、面向切面编程(AOP)以及用于简化企业级应用开发的其他功能。而 Quartz 是一个开源的作业...

    quartz 随tomcat启动执行一次

    通过对题目中提供的信息进行分析,我们可以了解到如何利用 Spring 与 Quartz 进行集成,从而实现 Tomcat 启动时调用 Quartz 执行一次任务的需求。通过合理配置 `SchedulerFactoryBean`、`CronTriggerBean` 和 `...

    quartz和spring-quartz

    Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...

    spring定时器启动两次原因及解决

    标题中的“spring定时器启动两次原因及解决”指的是在Spring框架中使用了定时任务功能,如Spring Boot的`@Scheduled`注解或者Spring Task模块,但遇到了定时任务被触发执行了两次的问题。这种情况可能是由于配置不当...

    Spring+Quartz2

    Spring 和 Quartz2 是两个在 Java 开发中广泛使用的框架,它们在企业级应用中承担着重要的角色。Spring 是一个全面的、开源的应用框架,而 Quartz2 是一个强大的、开源的作业调度库,常用于实现定时任务。下面我们将...

    spring3整合quartz1.8和spring3整合quartz2.2两个版本示例

    本示例将探讨如何将 Spring 3 与 Quartz 1.8 和 2.2 版本进行整合,以实现高效的任务调度。 首先,我们来看 Spring 3 整合 Quartz 1.8 的步骤: 1. **引入依赖**:在项目中添加 Quartz 和 Spring 相关的库,确保...

    Spring+Quartz定时任务学习文档+实例+jar包

    Spring和Quartz是Java开发中常用的两个框架,它们在企业级应用中被广泛用于实现定时任务的管理和执行。Spring提供了一个轻量级的容器来管理Bean,而Quartz则是一个强大的作业调度库,能够帮助开发者定义和执行定时...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...

    spring+quartz需要的4个jar包 不需要6个

    在Java开发领域,Spring框架和Quartz库是两个非常重要的组件。Spring是一个全面的企业级应用框架,它提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,帮助开发者构建高效、灵活的Java应用程序...

    spring-quartz-02

    Spring 和 Quartz 是两个在 Java 开发中非常重要的框架。Spring 是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等众多功能;而 Quartz 是一个强大的作业调度库,可以用于...

    springMvc定时器执行两次

    标题“springMvc定时器执行两次”涉及到的是Spring MVC与Quartz定时任务的集成问题,其中可能存在配置或逻辑上的错误导致定时任务被触发了两次。在Spring MVC应用中,Quartz是一个常用的库,用于实现定时任务的调度...

    转:spring多个定时任务quartz配置

    7. **启动和关闭Quartz**:在应用启动时,Spring会自动初始化并启动调度器。你也可以通过`SchedulerFactoryBean`的`start()`和`shutdown()`方法手动控制。 通过以上步骤,你可以在Spring应用中配置和运行多个Quartz...

    Spring整合Quartz后的简单定时任务示例

    在Java开发领域,Spring框架和Quartz库是两个非常重要的工具。Spring是一个全面的企业级应用框架,而Quartz则是一个强大的任务调度库。本资源"Spring整合Quartz后的简单定时任务示例"提供了如何将这两者结合使用的...

    Spring整合Quartz定时发送邮件

    标题“Spring整合Quartz定时发送邮件”涉及到两个主要技术领域:Spring框架和Quartz调度库。这个场景的应用是使用Quartz来安排任务,而Spring则提供了集成环境和邮件服务支持。 首先,Quartz是一个开源的作业调度...

    Spring+Quartz实现任务调度的小例子

    Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...

    spring3.1 与 quartz 1.8.6 整合 所有jar

    在Java企业级应用开发中,Spring框架和Quartz是两个非常重要的组件。Spring是一个全面的、模块化的应用程序框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的数据访问和事务管理功能。而Quartz则是一个...

    Spring-quartz.zip

    Spring框架和Quartz是Java开发中的两个重要工具,Spring用于管理对象(如bean)的生命周期,而Quartz则是一个强大的任务调度库。本项目结合两者,展示了如何在Spring中使用静态任务和动态任务,以及如何利用Spring的...

    基于spring+mybatis的quartz应用

    5. **配置Job和Trigger**:在Spring配置文件中,使用`org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean`和`org.springframework.scheduling.quartz.CronTriggerFactoryBean`配置Job和...

    定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)

    本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...

Global site tag (gtag.js) - Google Analytics