Spring定时器会初始化两次终于找到原因了!!!

news2024/9/27 17:27:31

使用idea编译器中的Tomcat时写在逻辑业务层的定时器会执行两次,最开始我认为是Tomcat的问题,后面做了个测试在出现该现象的业务层类中定义了一个测试定时器方法:

@Scheduled(cron ="0/5 * * * * ?")  //每隔5秒执行一次这个方法
    public void test(){
        System.out.println(this);
    }

控制台输出:

可以看到该对象会输出两个不同地址,我意识到了该类被实例化了两次 ,在网上查找了相关信息,总结了出现该问题的原因:

 原因1.使用了Tomcat实例中的配置的应用程序,而其中的配置文件中的server.xml文件中的

<Host name="localhost"  appBase="webapp"
            unpackWARs="true" autoDeploy="false"> 
<Context path="/user/header" docBase="F:/uploadfile/user/header"/> 

appBase为webapp的同时下面的docBase不为空,为了查到原因,我特意去看了下HOST标签与Context标签代表的作用:
    <Host>元素
    作用:表示一个虚拟主机,为特定的虚拟主机处理所有请求
    <context>元素
    作用:一个WEB应用程序,处理当前WEB应用程序的所有请求,每一个<Context>必须使用唯一的上下文路径。
    如果docBase指定的WAR包或应用目录就在docBase中,则不需要指定,因为Tomcat会自动扫描appBase中的WAR包和应用目录,指定了反而会造成问题。
    这也是有人会出现问题的所在,我看了下出现这个
    问题的小伙伴的配置docBase路径多是相对路径,Tomcat在执行时会出现扫描两次的时候,所以出现了两次或多次的初始化定时器

关于server.xml详解

原因2:没有使用了Tomcat实例中的配置的应用程序,会自动部署场景,配置文件多会自动部署,而自动部署的server.xml文件中的appBase值为webapps,没有docBase,但也会出现两次
初始化定时器,有人已经知道是容器的问题有的人,网上有的解释的是ContextLoaderListener与DispatcherServlet会创建出两个容器,这样会导致初始化两个bean,于是他们就删掉其中的一个,

其中的原理是什么呢?,我们先来简单看看ContextLoaderListener与DispatcherServlet两者的关系与区别:

ContextLoaderListener是上下文加载监听器用于加载应用中所有的bean,是父容器,

DispatcherServlet是前端控制器是用于对前端请求关系与对应的Controler层的bean对象的映射关系

他俩的关系:

ContextLoaderListener 创建根应用程序上下文
DispatcherServlet 条目为每个servlet条目创建一个子应用程序上下文。
子上下文可以访问根上下文中定义的bean。
根上下文中的Bean无法直接访问子上下文中的bean。
所有上下文都被添加到ServletContext。
你可以使用WebApplicationContextUtils类访问根上下文。

通过getbean获取bean时先回从子容器中查找,如果子容器没有就会去父容器,而查找的过程中会扫描相对应的配置文件,里面的扫描器多会开启扫描,将扫描到的bean转载到容器中,而SSM整合的过程中我们习惯将Spring与Springmvc配置文件合并为application.xml,正是因为这样在对,通过web.xml:

application.xml:

 会先在子容器中找,此时目的是为了去进行子容器的bean装箱,也就是去执行

<context:component-scan base-package="Controller"></context:component-scan>

也就是因为两个配置文件合并了在对子容器的bean装箱的时候开启了父容器的bean的装箱

这是因为定时器写在了除Control层的bean上,如持久层、逻辑业务层才会出现的错误,

而写在控制层却不会出现问题的原因了,现在大家知道出现这种情况的原因了吧。而上面讲的网友的解决方法是不全对的,如果你删掉的是DispatcherServlet,就会报一下错:

如果你删掉 ContextLoaderListener不会报错,定时器也只执行了一次,那么就是说明ContextLoaderListener没用咯?其实不然,因为在对子容器进行初始化的时候会对父容器进行初始化,在tomcat启动过程中,创建了DispatcherServlet,该servlet继承FrameworkServlet:

在这里插入图片描述

这里有个initServletBean方法,该方法会在tomcat启动时被调用!从而创建spring容器(WebApplicationContext),删除ContextLoaderListener和将两个配置文件分开写多测试成功:

 大功告成!!!

所以说其实两个容器多是应用程序的必须,以上就是 使用idea编译器中的Tomcat时写在逻辑业务层的定时器会执行两次的原因。

如果对你有用,那就:

 本文参考的资料有:

https://blog.csdn.net/qq_37063860/article/details/97275997

https://blog.51cto.com/u_15064650/3769909?b=totalstatistic

web.xml只需配置DispatcherServlet无需配置ContextLoaderListener的原因_Rico_Yip的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为再次入选2022年Gartner® SIEM魔力象限

近日&#xff0c;全球IT研究与顾问咨询机构Gartner正式发布《Magic Quadrant™ for Security Information and Event Management》报告&#xff0c;全球共有16家厂商入选了Gartner SIEM魔力象限&#xff0c;华为凭借HiSec Insight和华为云安全云脑技术能力进入了Gartner SIEM魔…

javascript中this的指向问题

this的五种绑定问题 1&#xff0c;默认绑定 默认绑定通常是指函数独立调用&#xff0c;不涉及其他绑定规则。 非严格模式下&#xff0c;this指向window严格模式,下&#xff0c;this指向undefined. 在普通函数内部的thislet/const定义的变量存在暂时性死区&#xff0c;而目不…

elk实践

1、背景 鉴于现在项目中的日志比较乱&#xff0c;所以建议使用现在较为流行的elk收集日志并展示&#xff1b; 2、下载、配置与启动 在下载 Elastic 产品 | Elastic 官网下载filebeat、logstash、elasticSearch、kibana 版本要一致 本人测试用的7.14 mac版本 实际生产使用7.14…

甘特图来搞定跨部门协作难的问题!项目经理必备

在很多大的工程项目、IT项目、市场项目中&#xff0c;都会涉及诸多对人员、时间、质量等的控制&#xff0c;这往往需要跨部门协作。但目前大多数企业跨部门协作还是通过微信、口口相传的方式进行&#xff0c;也导致了以下这些问题的频现&#xff1a; 辗转多个群聊提取有用的信息…

笔试强训(三十九)

目录一、选择题二、编程题2.1 字符串计数2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;/etc/resolv.conf的用途是&#xff08;C&#xff09; A.邮件服务的配置文件 B.DHCP的设置文件 C.DNS解析的设置文件 D.网络路由的设置文件 &#xff08;2&#xff09;能够pin…

Redis 通用指令

文章目录一、key通用指令1-1 基本操作1-2 时效性控制1-3 查询操作1-4 扩展操作二、数据库通用指令提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 一、key通用指令 ● 特征&#xff1a;key是一个字符串&#xff0c;通过key获取redis中保存的数…

警惕 “格机软件” 格式化手机全字库..不要轻易给不明觉厉的软件给root权限

以前的玩机界中有【锁机】软件。就是你安装一个软件后他会锁住屏幕。导致你无法操作手机。屏幕出现QQ联系方式等 勒索钱财。目前刷机界中的【格机】更胜一筹&#xff0c;直接格式化你手机全部分区没商量............ 警惕&#xff1a;不要给不明觉厉的软件 模块 刷机包等等给r…

Flink的状态持久化和状态后端

状态持久化 检查点的保存离不开 JobManager 和 TaskManager&#xff0c;以及外部存储系统的协调。在应用进行检查点保存时&#xff0c;首先会由 JobManager 向所有 TaskManager 发出触发检查点的命令&#xff1b;TaskManger 收到之后&#xff0c;将当前任务的所有状态进行快照保…

搭建自己Kindle电子书图书馆,并可远程访问

在电子书风靡的时期&#xff0c;大部分人都购买了一本电子书&#xff0c;虽然这本电子书更多的时候是被搁置在储物架上吃灰&#xff0c;或者成为盖泡面的神器&#xff0c;但当亚马逊发布消息将放弃电子书在中国的服务时&#xff0c;还是有些令人惋惜&#xff0c;毕竟谁也不想大…

【虾神白话空间统计】笔记:置信度、零假设、PZ值、随机分布

以下内容摘录节选学习自虾神专栏 很重要的一个概念&#xff1a;在空间统计中&#xff0c;随机和均匀经常是一个意思 一个随机抽样的例子 新版白话空间统计&#xff08;9&#xff09;&#xff1a;置信度的初探 这里面讲经研究&#xff0c;有72%的男生喜欢打篮球&#xff0c;…

【Vue】基础语法(创建项目|数据绑定|事件绑定|声明方法|插值表达式|属性值绑定|循环数组|v-if控制||计算属性|监听器|过滤器)

文章目录1. Vue 思想&#xff1a;2. VUE 的基本使用2.1 创建项目并进行基础测试2.2 数据绑定2.3 事件绑定2.4 声明方法2.5 插值表达式2.6 给任意属性绑定值2.7 v-for 循环数组或对象的使用2.8 v-if 和 v-show 控制是否显示2.9 计算属性和监听器属性2.10 过滤器属性3. 总结 Vue …

智慧工程安监物联网+云平台解决方案-最新全套文件

智慧工程安监物联网云平台解决方案-最新全套文件一、建设背景监管部门所处困境建筑施工业存在难点工程现场安全现象二、建设思路实现目标三、建设方案四、获取 - 物联网全套最新解决方案合集一、建设背景 智慧工地 是指运用 信息化 手段&#xff0c;通过 三维 设计平台对 工程…

Linux发行版---常用命令操作快速熟悉

针对linux发行版&#xff08;如ubuntu、raspian等&#xff09;的基础使用说明&#xff0c;以快速熟悉linux发行版的操作。 一、系统信息 查看处理器架构&#xff1a;arch查看内核版本&#xff1a;cat /proc/version; uname -a查看操作系统版本&#xff1a;head -n 1 /etc/iss…

c语言:初识结构体

初识结构体一.结构体声明1.结构体的概念2.声明二.结构体的基础使用三.结构体变量的定义和初始化一.结构体声明 1.结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 这里与数组做出区分&#xff1a;数组是一组相同类型元…

上海 Meetup | 一键获取 11 大云原生热门开源项目技术分享入场券

活动介绍 微服务 x 容器开源开发者 Meetup 是由阿里云飞天 club 与云原生应用平台共同打造&#xff0c;面向一线开发者的技术交流活动&#xff0c;整体内容聚焦容器 & 微服务方向&#xff0c;旨在通过热门的开源技术、云原生在企业的应用实践案例、架构设计思维等&#xf…

CopyOnWriteArrayList 是如何保证线程安全的?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了ArrayList 的线程安全问题&#xff0c;其中提到了 CopyOnWriteArrayList 的解决方法。那么 CopyOn…

倒计时9天|Zabbix中国峰会15位重磅嘉宾抢先看!

2022Zabbix峰会演讲嘉宾 &#xff08;有奖互动&#xff1a;转发本文或任一讲师海报至朋友圈&#xff0c;保留5分钟&#xff0c;即可获得Zabbix定制周边礼品一份&#xff0c;仅限100份&#xff0c;先到先得&#xff0c;详情联系文末小Z) 第7届Zabbix中国峰会将于12月2-3日举行…

腾讯产品经理的自动化工作流

作为腾讯产品经理的一员&#xff0c;Johnny中扬每天需要面对来自各方繁琐的需求。如何管理好用户需求、并及时规划、完成、反馈&#xff0c;上周中扬和我们分享了他的工作流。如果你也是产品经理&#xff0c;或者对腾讯产品经理的工作日常比较感兴趣&#xff0c;错过了上次的直…

【数据结构】堆的实现

堆1.堆&#xff1a;一种二叉树2.堆的概念及结构3.堆的实现3.1 创建堆的结构3.2 堆的初始化3.3 堆的插入3.4 堆的向上调整法&#xff08;up&#xff09;3.5 打印堆的数据3.6 到这里就可以实现一个基本的堆了3.7 向下调整法down&#xff08;非常重要的一个方法&#xff09;3.8 最…

Java项目:JSP校园运动会管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含三种角色&#xff1a;运动员、裁判员、管理员&#xff1b; 运动员角色包含以下功能&#xff1a; 运动员登录,个人信息修改,运动成绩…