查出来的解决方案,现在作一总结:
引发原因:定时器被启动了两次,重启了两个定时器线程(spring中timer定时器;quartz定时器);
第一次:web容器启动的时候,读取applicationContext.xml文件时,会加载一次。
第二次:Spring本身会加载applicationContext.xml一次。
根源定时器配置与其它spring配置全部写在applicationContext.xml文件里.
遗留问题:
web容器读取spring配置文件时是如何进行第一次加载定时器的?
解决方案:
1,通过程序设置标志变量方式改变,此种方式不建议,从根本上不能解决问题,不作介绍
2,将定时器配置从spring主配置文件中分离,进行分次加载定时功能只由web容器加载;
配置文件样例如下(spring用的是3.0,quartz用的是2.0):
web.xml配置文件主要涉及部分
<context-param>
<param-name>contextConfigLocation</param-name>
<!--spring主配置文件-->
<param-value>classpath:springConf/applicationContext.xml,
<!--Quartz定时器配置文件使用quartz时配置-->
classpath:springConf/timerQuartz-Context.xml,
<!--timer定时器配置文件使用spring timer时配置-->
classpath:springConf/timertask-Context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<display-name>springDispacher</display-name>
<servlet-name>springDispacher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springConf/applicationContext.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispacher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
主spring配置文件中说明applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="datasource-Context.xml" />
<import resource="user-Context.xml" />
<import resource="app-Context.xml" />
<!--如果将定时器配置在这里或直接import进这里就会导致启动两次-->
<!--<import resource="timertask-Context.xml"/> -->
<!--<import resource="timerQuartz-Context.xml"/> -->
</beans>
顺利也复习一下定时器如何配置:
spring中timer定时器的配置方法timertask-Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--定时器任务的主类-->
<bean id="timerTask" class="business.timertask.action.TimerTaskAction">
<property name="taskService" ref="taskService"></property>
</bean>
<!--aop事物配置 -->
<bean id="taskServiceAop" parent="serviceAop">
<property name="target" ref="taskService"></property>
</bean>
<!--任务处理的业务类-->
<bean id="taskService" class="business.timertask.services.IMPTaskService">
<property name="taskDao" ref="taskDao"></property>
</bean>
<!--任务处理的dao类 -->
<bean id="taskDao" class="business.timertask.dao.IMPTaskDAO">
<property name="dataSource" ref="dataSource"></property>
<property name="sqlMapClient" ref="sqlMapClient"></property>
</bean>
<!-- 启动定时器 -->
<bean id="start" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask" />
</list>
</property>
</bean>
<!--定时器启动参数配置-->
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!--延迟2秒执行 -->
<property name="delay">
<value>2000</value>
</property>
<!--每3百秒执行一次 -->
<property name="period">
<value>300000</value>
</property>
<property name="timerTask" ref="timerTask"></property>
</bean>
</beans>
quartz定时器配置方法:timerQuartz-Context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--调度工厂配置 -->
<bean id="schedulerFactory" class="org.quartz.impl.StdSchedulerFactory">
</bean>
<!--定时表达式 -->
<bean id="cronExc" class="org.quartz.CronExpression">
<constructor-arg>
<value>0/5 * * * * ?</value>
</constructor-arg>
</bean>
<!--表达式的触发器配置 -->
<bean id="cronTrigger" class="org.quartz.impl.triggers.CronTriggerImpl">
<!--触发器名 -->
<property name="name" value="cronTrigger" />
<!--触发器组 -->
<property name="group" value="cronTriggerGroup" />
<!--触发器执行参数,每5秒一次 -->
<property name="cronExpression">
<value>0/5 * * * * ?</value>
</property>
</bean>
<!--自定义任务类job -->
<bean id="customJob" class="business.timerTaskForQuatz.bean.CustomJob">
</bean>
<!--jobDetail类 -->
<bean id="jobDetail" class="org.quartz.impl.JobDetailImpl">
<!--jobDetail任务名 -->
<property name="name" value="cornJob" />
<!--jobDetail组名 -->
<property name="group" value="cornJobGroup" />
<!--自定义任务类job包classname -->
<property name="jobClass" value="business.timerTaskForQuatz.bean.CustomJob" />
</bean>
<!--quartz主类 -->
<bean id="quartzAction" class="business.timerTaskForQuatz.action.QuartzAction"
init-method="start">
<!--jobDetail类 -->
<property name="jobDetail" ref="jobDetail"></property>
<!--定时表达式 -->
<property name="cronExpression" ref="cronExc"></property>
<!--调度工厂-->
<property name="sFactory" ref="schedulerFactory"></property>
<!--触发器 -->
<property name="cronTrigger" ref="cronTrigger"></property>
</bean>
</beans>
项目源码
列出jar包附件图
- 大小: 142.1 KB
分享到:
相关推荐
当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果你的应用部署在多个服务器或容器上,没有正确地配置集群,可能导致每个实例都独立调度任务。 2. **配置错误**:Spring配置中...
Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...
- `period`属性表示两次任务之间的间隔时间(单位为毫秒)。本例中设置为86400000毫秒,即24小时执行一次。 - 通过`<ref>`标签将定时任务对象与具体的业务服务(`jdbc1Service`和`jdbc2Service`)进行绑定。 ####...
**Spring定时器TimerTask用法** 在Java世界中,`java.util.Timer` 和 `java.util.TimerTask` 是用于实现定时任务的基本工具,但它们在多线程环境中的表现并不理想,容易引发内存泄漏。Spring框架提供了更强大的定时...
这个实例,"spring定时器实例",显然关注的是如何在Spring中实现定时任务。下面我们将深入探讨Spring中的任务调度机制以及如何创建和配置定时任务。 Spring提供了两种主要的调度组件:`org.springframework....
【Spring定时器Demo详解】 在Java开发中,Spring框架提供了强大的定时任务管理功能,通过`Spring Task`模块,我们可以方便地实现定时任务的设定和执行。这个“spring定时器demo”是一个完整的工作示例,涵盖了从...
标题“springMvc定时器执行两次”涉及到的是Spring MVC与Quartz定时任务的集成问题,其中可能存在配置或逻辑上的错误导致定时任务被触发了两次。在Spring MVC应用中,Quartz是一个常用的库,用于实现定时任务的调度...
Spring定时器主要支持两种方式来实现定时任务:基于注解的方式和基于Quartz集成的方式。 #### 二、Spring定时器的实现原理 ##### 2.1 基于注解的定时任务 Spring 3.0引入了`@Scheduled`注解,它可以直接添加到...
`fixedRate`参数定义了两次执行之间的间隔时间。此外,还可以使用`cron`表达式来实现更复杂的定时规则,如按小时、分钟、秒执行。 如果需要更高级的调度功能,可以自定义`TaskScheduler`实现。`TaskScheduler`接口...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...
本篇文章将详细介绍两种使用Spring自身实现轻量级定时器的方法。 方法一:基于`@Scheduled`注解 1. `@Scheduled`注解:这是Spring提供的一个用于声明周期性任务的注解。在Java类中的方法上添加此注解,Spring会...
总结来说,Spring定时器提供了两种方式来创建和执行定时任务:基于Timer的简单定时任务和基于Quartz的高级定时任务。Timer适用于简单的定时需求,而Quartz更适合需要精确控制任务执行时间和周期的复杂场景。在实际...
Spring提供了一种灵活的方式来处理定时任务,那就是Spring Task,也被称为Spring的定时器。本文将深入探讨如何在Spring中动态地设置定时任务。 首先,Spring Task提供了两种主要的方式来创建定时任务:`@Scheduled`...
Spring定时器基于Spring的`TaskExecution`和`TaskScheduling`模块,提供了两种主要的方式来安排任务:基于cron表达式的`@Scheduled`注解和基于固定间隔的`ThreadPoolTaskScheduler`。下面我们将详细讲解这两个核心...
该触发器配置了一个延迟启动时间为10秒,然后每60秒重复执行一次的任务。 ##### 5. 定时任务调度器配置(`SchedulerFactoryBean`) ```xml <bean class="org.springframework.scheduling.quartz....
这个“spring定时器的一个小示例”提供了一个简单的应用实例,演示了如何在Spring环境中设置和运行定时任务。由于压缩包中未包含jar包,我们需要额外添加依赖以确保程序正常运行。 首先,我们要了解Spring的定时...
【Spring定时器】 Spring框架提供了更高级的定时任务管理方式,比如 `org.springframework.scheduling.TaskScheduler` 和 `org.springframework.scheduling.annotation.Scheduled` 注解。通过使用Spring的定时器,...