`

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

阅读更多
查出来的解决方案,现在作一总结:

引发原因:定时器被启动了两次,重启了两个定时器线程(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 java 定时器 执行两次 quartz

    当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果你的应用部署在多个服务器或容器上,没有正确地配置集群,可能导致每个实例都独立调度任务。 2. **配置错误**:Spring配置中...

    java 定时器 spring 定时器

    Java定时器和Spring定时器是Java开发中用于执行周期性任务的重要工具,它们在系统维护、数据同步、报告生成等场景中发挥着关键作用。本文将深入探讨这两个概念,以及如何在Spring框架中配置和使用定时器。 首先,...

    SPRING 定时器的使用

    - `period`属性表示两次任务之间的间隔时间(单位为毫秒)。本例中设置为86400000毫秒,即24小时执行一次。 - 通过`&lt;ref&gt;`标签将定时任务对象与具体的业务服务(`jdbc1Service`和`jdbc2Service`)进行绑定。 ####...

    Spring定时器TimerTask用法

    **Spring定时器TimerTask用法** 在Java世界中,`java.util.Timer` 和 `java.util.TimerTask` 是用于实现定时任务的基本工具,但它们在多线程环境中的表现并不理想,容易引发内存泄漏。Spring框架提供了更强大的定时...

    spring定时器实例

    这个实例,"spring定时器实例",显然关注的是如何在Spring中实现定时任务。下面我们将深入探讨Spring中的任务调度机制以及如何创建和配置定时任务。 Spring提供了两种主要的调度组件:`org.springframework....

    spring定时器demo

    【Spring定时器Demo详解】 在Java开发中,Spring框架提供了强大的定时任务管理功能,通过`Spring Task`模块,我们可以方便地实现定时任务的设定和执行。这个“spring定时器demo”是一个完整的工作示例,涵盖了从...

    springMvc定时器执行两次

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

    spring 定时器

    Spring定时器主要支持两种方式来实现定时任务:基于注解的方式和基于Quartz集成的方式。 #### 二、Spring定时器的实现原理 ##### 2.1 基于注解的定时任务 Spring 3.0引入了`@Scheduled`注解,它可以直接添加到...

    spring定时器

    `fixedRate`参数定义了两次执行之间的间隔时间。此外,还可以使用`cron`表达式来实现更复杂的定时规则,如按小时、分钟、秒执行。 如果需要更高级的调度功能,可以自定义`TaskScheduler`实现。`TaskScheduler`接口...

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

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

    Spring自己的轻量级定时器的两种实现方式

    本篇文章将详细介绍两种使用Spring自身实现轻量级定时器的方法。 方法一:基于`@Scheduled`注解 1. `@Scheduled`注解:这是Spring提供的一个用于声明周期性任务的注解。在Java类中的方法上添加此注解,Spring会...

    spring定时器--代码解读

    总结来说,Spring定时器提供了两种方式来创建和执行定时任务:基于Timer的简单定时任务和基于Quartz的高级定时任务。Timer适用于简单的定时需求,而Quartz更适合需要精确控制任务执行时间和周期的复杂场景。在实际...

    spring定时器的动态设置

    Spring提供了一种灵活的方式来处理定时任务,那就是Spring Task,也被称为Spring的定时器。本文将深入探讨如何在Spring中动态地设置定时任务。 首先,Spring Task提供了两种主要的方式来创建定时任务:`@Scheduled`...

    spring定时器例子

    Spring定时器基于Spring的`TaskExecution`和`TaskScheduling`模块,提供了两种主要的方式来安排任务:基于cron表达式的`@Scheduled`注解和基于固定间隔的`ThreadPoolTaskScheduler`。下面我们将详细讲解这两个核心...

    spring2.5 定时器任务

    该触发器配置了一个延迟启动时间为10秒,然后每60秒重复执行一次的任务。 ##### 5. 定时任务调度器配置(`SchedulerFactoryBean`) ```xml &lt;bean class="org.springframework.scheduling.quartz....

    spring定时器的一个小示例

    这个“spring定时器的一个小示例”提供了一个简单的应用实例,演示了如何在Spring环境中设置和运行定时任务。由于压缩包中未包含jar包,我们需要额外添加依赖以确保程序正常运行。 首先,我们要了解Spring的定时...

    java Timer定时器实例 Spring实例.doc

    【Spring定时器】 Spring框架提供了更高级的定时任务管理方式,比如 `org.springframework.scheduling.TaskScheduler` 和 `org.springframework.scheduling.annotation.Scheduled` 注解。通过使用Spring的定时器,...

Global site tag (gtag.js) - Google Analytics