最近遇到一个比较棘手的问题,由于场景需要,每天晚上11点执行一个定时任务,我用的是spring的定时器,具体的定时任务相关配置和代码如下,没啥毛病。。。
直接上代码:
1、项目下的配置文件servlet-context.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
-
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
-
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
-
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
-
xsi:schemaLocation="http://www.springframework.org/schema/mvc
-
http://www.springframework.org/schema/mvc/spring-mvc.xsd
-
http://www.springframework.org/schema/beans
-
http://www.springframework.org/schema/beans/spring-beans.xsd
-
http://www.springframework.org/schema/context
-
http://www.springframework.org/schema/context/spring-context.xsd
-
http://www.springframework.org/schema/tx
-
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
-
http://www.springframework.org/schema/aop
-
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
-
http://www.springframework.org/schema/task
-
http://www.springframework.org/schema/task/spring-task-3.2.xsd">
-
-
-
-
<context:component-scan base-package="cc.wangbang.mall.controller"
-
use-default-filters="false">
-
<context:include-filter type="annotation"
-
expression="org.springframework.stereotype.Controller" />
-
<context:include-filter type="annotation"
-
expression="org.springframework.stereotype.Component" />
-
</context:component-scan>
-
<aop:aspectj-autoproxy />
-
-
-
<task:annotation-driven/>
-
-
2、定时任务执行代码如下
-
import java.text.SimpleDateFormat;
-
-
-
import org.springframework.scheduling.annotation.Scheduled;
-
import org.springframework.stereotype.Component;
-
-
import cc.wangbang.mall.controller.ParentController;
-
-
-
public class TestTask extends ParentController {
-
-
-
-
@Scheduled(cron="0 0 23 * * ?")
-
-
SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");
-
System.out.println("当前时间:"+sdf.format(new Date()));
-
-
-
-
-
可以肯定的说,以上配置和代码写的都没啥毛病,因为在eclipse本地调试是OK的,定时任务也按照逻辑来每天23点执行一次操作。。。。但是,将代码部署到服务器(linux + tomcat8)上,却诡异的发现定时任务执行了两次操作,这是什么原因造成的?于是去伟大的互联网上寻找真相,大部分网友都说是定时任务实例化了两次,也给出了五花八门的说法,大部分都说配置文件出的问题,矛头都指向servlet-context.xml和web.xml,本人也相信网友说法,对配置文件做了各种修改和优化,最终还是无果。。。直到最近,我发现自己是不是蒙圈了,为啥本地定时任务好好的,放到服务器上就出问题?当时我就想到应该是服务器出问题了,准确的说应该是tomcat配置出问题了,于是我采取了linux上调试的做法,最终找到问题的根源。。。我仔细观察项目的log日志,发现tomcat在启动完成后隔了10秒左右又自行启动了一次,难怪定时任务实例化两次,罪魁祸首是tomcat下的server.xml文件。
有问题的server.xml写法如下:
在server.xml下面找到Host这行代码
-
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
-
-
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
-
prefix="localhost_access_log" suffix=".txt"
-
pattern="%h %l %u %t "%r" %s %b" />
-
<Context docBase="emall" path="/" reloadable="true" />
-
这几行代码问题是什么?是appBase="webroot"和docBase="emall",原因是tomcat加载完appBase="webapps"之后又去加载docBase,因此造成加载两次项目的问题。
找到问题的根源,下面讲解决办法:
方法一:
将 appBase="webapps"改成appBase="webroot",将docBase="emall" 改成项目的绝对路径docBase="/usr/local/src/tomcat-emall/webapps/emall" ,重启tomcat,问题解决!!
-
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true">
-
-
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
-
prefix="localhost_access_log" suffix=".txt"
-
pattern="%h %l %u %t "%r" %s %b" />
-
<Context docBase="/usr/local/src/tomcat-emall/webapps/emall" path="/" reloadable="true" />
-
方法二:
在/usr/local/src/tomcat-emall路径下新建文件夹webroot,将appBase="webapps"改成appBase="webroot",将docBase="emall" 改成项目的相对路径docBase="../webapps/emall" ,重启tomcat,问题解决!!
-
<Host name="localhost" appBase="webroot" unpackWARs="true" autoDeploy="true">
-
-
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
-
prefix="localhost_access_log" suffix=".txt"
-
pattern="%h %l %u %t "%r" %s %b" />
-
<Context docBase="../webapps/emall" path="/" reloadable="true" />
-
-
分享到:
相关推荐
一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。
当遇到Spring定时器执行两次的问题时,可能的原因有以下几点: 1. **多实例问题**:如果你的应用部署在多个服务器或容器上,没有正确地配置集群,可能导致每个实例都独立调度任务。 2. **配置错误**:Spring配置中...
标题中的“spring定时器启动两次原因及解决”指...总之,解决Spring定时任务启动两次的问题需要从配置、代码逻辑和环境设置等多个角度进行排查,结合源码理解和日志分析,才能准确找到问题的根源并提出有效的解决方案。
Spring 定时任务执行两次及 Tomcat 部署缓慢问题的解决方法 Spring 定时器执行两次问题重现和解析 在使用 Quartz 定时任务框架时,可能会出现定时任务执行两次的问题。这个问题可能会在开发环境中没有出现,但是...
在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...
一、Spring定时任务简介 Spring框架的定时任务功能主要依赖于`Spring Task`模块,也称为Spring的后台任务处理。它提供了基于`@Scheduled`注解和`TaskScheduler`接口的两种定时任务实现方式。`@Scheduled`适用于简单...
给定的压缩包可能包含了一个关于如何配置、使用和测试Spring定时任务的文档。这个文档应该详细介绍了每个步骤,包括如何在Spring环境中注册和启动定时任务,如何编写带有`@Scheduled`注解的方法,以及如何编写测试...
Spring定时任务基础 Spring的定时任务功能是通过`org.springframework.scheduling`包中的类来实现的,主要涉及`TaskScheduler`和`TaskExecutor`接口。`TaskScheduler`用于定时任务的调度,而`TaskExecutor`则处理...
在Spring框架中,定时任务是通过Spring的Task模块来实现的,这允许我们在应用程序中创建和管理定时任务,而无需依赖外部的调度器如Quartz或Cron。本例主要探讨如何在Spring中配置和执行定时任务。 首先,我们要引入...
`fixedRate`参数定义了两次执行之间的间隔时间。 如果需要更复杂的调度规则,如cron表达式,可以使用`cron`属性: ```java @Scheduled(cron = "0 0/5 * * * ?") public void executeTask() { // 执行任务代码 } `...
在Spring框架中,定时任务是实现周期性任务执行的关键特性,它允许开发者在特定时间间隔内执行特定的代码逻辑,而无需手动干预。本示例将深入探讨如何使用Spring的TaskScheduler或者Quartz Scheduler来创建和管理...
Spring定时任务是Spring框架中的一个强大特性,它允许开发者在应用程序中设置定时任务,以便在特定的时间点或按照预设的周期执行特定的业务逻辑。这个"spring定时任务demo包含jar包"提供了一个完整的示例,帮助我们...
首先,我们需要引入Spring Boot的`spring-boot-starter-quartz`或者`spring-boot-starter-task`依赖,这两个都是Spring框架提供的定时任务支持。`spring-boot-starter-quartz`基于Quartz库,而`spring-boot-starter-...
Spring通过`@Scheduled`注解提供了对定时任务的支持,该注解可以轻松地应用于任何Java方法上,使得开发者能够以声明式的方式来配置和执行定时任务。 ### @Scheduled 注解详解 `@Scheduled`注解主要用于方法级别,...
总结来说,这个资源为你提供了一个基础的Spring与Quartz集成案例,通过学习和实践,你可以掌握如何在Spring环境中利用Quartz实现高效、灵活的定时任务管理。同时,它也鼓励开发者之间的分享和交流,共同提升技术能力...
本文将详细讲解两种通过Spring实现定时任务的方法:Spring的`TimerTask`和`Spring Batch`的`Tasklet`。我们将涵盖这两种方法的基本原理、配置以及使用源码,确保你能全面理解如何在实际项目中应用。 ### 一、Spring...
### Spring3.2.6定时任务与线程池配置详解 #### 一、背景介绍 在现代软件开发中,为了提高系统的并发处理能力和资源利用率,往往需要利用到多线程技术来实现定时任务的处理。Spring框架作为Java企业级应用开发中的...
本文将深入探讨Spring框架下实现定时任务的几种主流方法,包括使用`java.util.Timer`(即Java定时器)、Spring定时器以及Quartz定时器,旨在帮助开发者根据具体业务场景选择最合适的技术方案。 ### 1. Java定时器...
这里的`executeTask`方法会被Spring定时任务框架自动调用,每60秒执行一次。 3. **集成iBatis** iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句写在XML配置文件中,与Java代码分离,提高可维护性。要在...
在Spring框架中,定时任务和自动执行方法是一个重要的特性,它允许我们在特定的时间间隔或预设的时刻执行特定的功能。...通过`myeclipse完整项目`,开发者可以直接运行和学习这些概念,加深对Spring定时任务的理解。