精华内容
下载资源
问答
  • 我在spring的配置文件中添加上这条,这个配置只能在启动项目是执行一遍。 还有一点 要注意 这个方法不能是controller层的方法 <-- class是类的全名加包名 这是指定运行的方法在那个类里面 --> <-- scope ...
    spring项目如何在启动项目是执行一些操作,在spring中能通过那些操作实现这个功能呢。
    
    1.方法一
    
    我在spring的配置文件中添加上这条,这个配置只能在启动项目是执行一遍。 
    还有一点 要注意 这个方法不能是controller层的方法
    
    <-- class是类的全名加包名 这是指定运行的方法在那个类里面   -->
    <-- scope 值得范围 这里给的参数是 singleton   -->
    <-- inti-method 是指要执行的方法  -->
    <bean id="startRun" class="com.shr.bojs.StartRun" scope="singleton" init-method="test"></bean>
    
    package com.shr.jobs;
    
    public class StartRun {
        public void test(){
            System.out.println("开始执行 startRun 方法!!!");
        }
    
    }
    
    log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    开始执行 startRun 方法!!!
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    
    2.方法二 
    使用@PostContruct ,在方法上添加@PostConstruct注解 
    注意 一定要放在能被扫面到的地方,如果你写在一个无法被扫描到的位置是不能执行的。(service层肯定能被扫描到)
    
    @Service
    public class TestRun{
        @PostConstruct
        public void text(){
            System.out.println("项目开始运行我也就执行!!");
        }
    }
    
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
    项目开始运行我也就执行!!
    五月 19, 2018 12:21:14 上午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring FrameworkServlet 'springMVC'
    
    3.方法三 
    实现initiailzingBean接口。
    
    afterPropertiesSet这个方法就会在项目启动时执行。
    
    
    @Service
    public class ArraignedLogService implements InitializingBean {
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("我是通过实现接口 initializingBean来执行的!!!");
    
        }
    }
    
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-log4j12-1.5.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/D:/tomcat7.manage/webapps/newBLManager/WEB-INF/lib/slf4j-nop-1.5.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
    Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
    我是通过实现接口 initializingBean来执行的!!!
    五月 19, 2018 12:38:33 上午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring FrameworkServlet 'springMVC'
    
    4.
    
    因为需要保证所有调度相关的依赖注入spring容器才创建所以定时调度任务,所以需要实现在Spring容器将所有的Bean都初始化完成之后才自动执行一次执行方法(创建一个调度任务)
    
    实现
    实现ApplicationListener接口,并实现 onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)方法
    
    @Service
    public class SearchReceive implements  ApplicationListener<ContextRefreshedEvent> {
        @Override
        public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
            if (contextRefreshedEvent.getApplicationContext().getParent() == null) {//保证只执行一次
                //需要执行的方法
            }
        }
    }
    至于为什么先做判断,因为Spring存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理
    !

     

    展开全文
  • 有些人会遇到自己写了个监听器,继承了ServletContextListener,在Tomcat等服务器启动的时候contextInitialized方法被执行了两,百思不得其解。其实,实际上不是简单的contextInitialized方法被调用两,是Tomcat...

    有些人会遇到自己写了个监听器,继承了ServletContextListener,在Tomcat等服务器启动的时候contextInitialized方法被执行了两次,百思不得其解。

    其实,实际上不是简单的contextInitialized方法被调用两次,是Tomcat被启动了两次(或者说放到Tomcat的webapps中的Web应用被启动了两次)

    为什么这么说呢?(上面红色加粗的观点),因为像下面配置的一个Servlet,也是会被new两次的(可以在其init方法内打印语句,可以看到打印了两条!)。这就说明并不仅仅是contextInitialized被执行了两次,说明的是在web.xml中配置的启动Tomcat就new出Servlet的对象也被new了两次。进而可以把结论更加推广-------------------其实是整个Web应用被启动了两次,或者在网上有种更加通俗但我认为不准确的说法:Tomcat被启动了两次。

    ProxyBean

    work.servlet.ServletProxy

    targetBean

    toHtml

    40

    ProxyBean

    /ToHtml.do

    下面转载别人的文章,解决问题了。我是采用了把Web应用不放在Tomcat的webapps上,而放到与webapps之外与webapps文件夹同级的文件夹WEBROOT下

    这个做法顺带还解决了以前一个矛盾的、纠结了很久的问题:为什么我的log4j记录日志会出现昨天的日志被今天的日志覆盖,用于只有一份最新的,log4j的配置文件是绝对绝对正确的。

    前提:

    1、存在某个应用:hello

    2、该应用存放路径:D:\apache-tomcat-5.5.17\webapps\hello

    3、Tomcat的server.xml部分配置信息如下:

    ...

    ...

    (这么做的目的就是为了将hello应用设为根,访问IP时就直接访问该应用)

    4、hello下有一个 servlet(目的是为了系统在启动时执行某些初始化的操作),该servlet里存在init()方法,目前该方法里只打印“hello word”字符串;

    5、hello 应用的 web.xml 部分配置信息如下:

    HelloServlet

    HelloServlet

    1

    问题:

    在启动 tomcat5 时,控制台窗口会打印出两行“hello word”字符串?

    问题原因:

    因为hello应用本来就放在Tomat的默认webapp目录下(tomcat在启动时肯定会加载1次),然后又在server.xml中做了配置,为了达到访问根就可以访问hello应用(这样tomcat就又加载1次);结果,Tomcat就会加载两次。

    解决办法:

    办法1、不要将 hello 应用放在Tomat的默认webapp目录下,把它移出去,然后在server.xml中修改docBase的值为hello应用在新位置的绝对路径就可以了;

    办法2、删除掉server.xml中 Context 的手动配置,这样就不会加载两次,因为hello应用在webapp下,所以在访问时,就只能是: 这样来访问了。

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • 这个会随Tomcat启动启动tomcat重启以后它也重启。不知道行不行?具体的方法:my.TreeServerContextListener--------------------------------------------然后你写个TreeServerContextListener放在WEB...

    每个tomcat的应用有一个web.xml文件。

    在里面可以配置ContextLinstner。这个会随Tomcat的启动而启动。

    tomcat重启以后它也重启。

    不知道行不行?

    具体的方法:

    my.TreeServerContextListener

    --------------------------------------------

    然后你写一个TreeServerContextListener放在WEB-INF目录的classes目录下。

    例子:

    public class TreeServerContextListener implements ServletContextListener

    {

    private TreeServerDataManager dataManagerThread = null;

    public TreeServerContextListener()

    {

    dataManagerThread = TreeServerDataManager.getInstance();

    }

    public void contextInitialized(ServletContextEvent sce)

    {

    System.out.println("-----------------Init-------------------");

    dataManagerThread.start();

    }

    public void contextDestroyed(ServletContextEvent sce)

    {

    dataManagerThread.close();

    System.out.println("-----------------Destroy-----------------");

    }

    }

    ----------------------------------------------------------------------------------

    其中dataManagerThread 我的为一个线程。

    你可以换成TimeTask,这样子就可以定时执行任务。

    public class TimeListener implements ServletContextListener {

    //拦截得到DataCheckTemplateService

    private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

    private DataCheckTemplateService dataCheckService = (DataCheckTemplateService) applicationContext.getBean("dataCheckTemplateService");

    private Timer timer=null;

    //设置执行的时间为小时,每minute执行一次看是否到设置执行的时间

    private static final long PERIOD_TIME = 60 * 1000;

    private Log log = LogFactory.getLog(getClass());

    @Override

    public void contextInitialized(ServletContextEvent event) {

    if(DataCheckConfigration.getIsRun().equals("true")) {

    timer = new Timer(true);

    timer.schedule(new DataCheckTask(dataCheckService), 0, PERIOD_TIME);

    }

    else

    {

    log.info("此机器不执行定时任务");

    }

    }

    @Override

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    timer.cancel();

    }

    }

    public class DataCheckTask extends TimerTask {

    private DataCheckTemplateService dataCheckService;

    public DataCheckTask(DataCheckTemplateService dataCheckService) {

    this.dataCheckService = dataCheckService;

    }

    private Log log = LogFactory.getLog(getClass());

    public void run() {

    log.info("定时任务启动,没有到运行时间!");

    }

    }

    展开全文
  • 最近遇见了个很搞得事情,在tomcat启动项目自己写的定时程序被执行了两,导致程序启动了两个线程,使定时任务在几秒间隔内执行了两,后来通过日志查到,原来是tomcat将项目启动了两,为什么呢?...

    最近遇见了一个很搞得事情,在tomcat下启动项目时自己写的定时程序被执行了两次,导致程序启动了两个线程,使定时任务在几秒间隔内执行了两次,后来通过日志查到,原来是tomcat将项目启动了两次,为什么呢?我的问题原因是由于tomcat下配置的问题;为了让程序可以通过域名直接访问,而不用输入项目名,所有要对tomcat配置项目的映射,由于客户那里配置的有问题所有导致程序启动两次。

    错误配置:

     

     
    1. <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"

    2. xmlValidation="false" xmlNamespaceAware="false">

    3.  
    4. <Context docBase="/usr/local/apache-tomcat-6.0.29/webapps/XXX"

    5. path="" reloadable="true"></Context>

    6. <Context docBase="/usr/local/apache-tomcat-6.0.29/webapps/XXX"

    7. path="/admin" reloadable="true"></Context>

    8. </Host>

    以上配置,由于host节点配置了appBase为webapps,所有tomcat会加载webapps里的所有项目,下面又配置了webapps里的项目,导致项目又加载一次,所以会导致项目重复加载,定时程序会在几秒之内重复执行,后来改了一下配置好了,

     

    如下正确配置:

     
    1. <Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"

    2. xmlValidation="false" xmlNamespaceAware="false">

    3.  
    4. <Context docBase="/usr/local/apache-tomcat-6.0.29/webapps/XXX"

    5. path="" reloadable="true"></Context>

    6. <Context docBase="/usr/local/apache-tomcat-6.0.29/webapps/XXX"

    7. path="/admin" reloadable="true"></Context>

    8. </Host>

     

    展开全文
  • docker+tomcat 启动非常慢,一般正常启动几十秒的,发现docker+tomcat启动竟需要几分钟,不可思议根本原因是SecureRandom 这个 jre 的工具类的问题。那为什么 SecureRandom generateSeed 这么慢,甚至挂在 Linux ...
  • 步骤1:解压Tomcat命令:unzip apache-tomcat-8.5.20.zip步骤2:将tomcat 移动到“/usr/local/src/java/tomcat8.5”下并重命名命令:mv apache-tomcat-8.5.20 /usr/local/src/java/tomcat8.5步骤3: 授予执行权限,...
  • 文章目录SpringBoot 是如何通过jar包启动的java -jar做了什么疑惑出现Jar包的打包插件及核心方法jar包目录结构META-INF内容Archive的概念JarLauncherURLStreamHandlerSpring Boot的Jar应用启动流程总结总结...
  • spring整合springmvc中web.xml配置如下,tomcat启动过程中会加载web.xml中的内容,ContextLoaderListener实现了tomcat里面的ServletContextListener接口,所以在tomcat容器启动过程通过ContextLoaderListener来...
  • 让IDEA启动tomcat时默认加载指定页面

    千次阅读 2021-03-08 09:31:47
    最近开学在做课设,不得不说下,一年两度的课设真的是让人煞费苦心,可以说的上是每做一次课设都能用尽毕生所学,不过还好每次课设结束后也会有很多的收获,毕竟是技术层面的知识,多少都会为自己以后找工作打下一定...
  • 前言最近在工作中遇到个问题,在Linux下Tomcat 8启动很慢,且日志上无任何错误,在日志中查看到如下信息:Log4j:[2017-08-2715:47:11] INFO ReadProperty:172 - Loading properties file from class path resource...
  • 其中告诉tomcat,在启动的时候加载webapps下的所有项目工程文件,又让tomcat再加载了遍(一般情况下配置,主要是由于想域名访问将工程名去掉的原因配置),这种情况下会导致工程中的quartz定时被两触发,执行两...
  • ​ 刚开始做项目的时候就觉得tomcat这个东西很神奇,就给项目打个包就能当个网站来访问,那时候就产生了个疑惑,为什么tomcat要用servlet来搭配着使用才行,而且为什么servlet没有主方法就能直接运行出结果来...
  • tomcat启动多实例

    2020-12-29 02:27:23
    最近在玩jenkins+maven+git,用jenkins构建好jenkins的war包后想看看构建的war包能不能用,于是想着在台机器上面启动多个tomcat实例。首先,来看看解压后的tomcat根目录中含有什么东西吧:bin 目录:包含所有运行...
  • Java web项目启动Tomcat报错解决方案点击运行项目显示 A Java Exception has occurred.'Starting Tomcat v9.0 Server at localhost' has oncountered a problem.Server Tomcat v9.0 Server at localhost failed to...
  • 当前位置:我的异常网» Linux/Unix»linux下tomcat启动后出现多个java进程解决办法linux下tomcat启动后出现多个java进程解决办法www.myexceptions.net网友分享于:2013-02-25浏览:199linux下tomcat启动后出现多个...
  • } } } 做完上面这些我们只是完了个个定时器的设定,如果想要在tomcat启动时就加载,必须要配置web.xml还不够, web.xml配置的内容如下 com.tjsoft.buisness.util.ContextListener 以上为个人在项目中所得,忘与各...
  • 作为个开发,使用Spring Boot ,和传统的Tomcat 部署相比,我们需要关注业务的开发,项目的启动和部署变的十分简单, 那么它背后是怎么实现的, 隐藏着什么? 本文先从个嵌入式Tomcat的应用开发,再到Spring ...
  • tomcat启动成功但没有跳转到浏览器,已解决 ) 多启动tomcat后发现突然不能跳转到浏览器页面了 (本人新手,经验不足,言语不专业,按实际情况说明,多包涵!) 1.在idea中多Rebuild Project结果还是没有跳转到...
  • 使用过tomcat的都知道,可以直接从官网下载tar压缩包然后解...最简单的方法,需要添加行代码到/etc/rc.d/rc.local的最后:/alidata/apache-tomcat-7.0.57/bin/startup.sh上面的路径就是要启动的tomcat启动文件路...
  • 概述Tomcat 的三个最重要的启动脚本:startup.batcatalina.batsetclasspath.bat上篇咱们分析了 startup.bat 脚本这篇咱们来分析 catalina.bat 脚本.至于 setclasspath.bat 这个脚本, 相信看完这篇, 就可以自己...
  • 1.想启动Tomcat:先进入...
  • 文章目录《史上最全Tomcat源码解析》Tomcat启动过程前言、启动过程二、使用步骤1.引入库2.读入数据总结 前言 在上章对Tomcat的架构进行了分析,这章,我们来看一下Tomcat的启动过程 、启动过程 二、使用...
  • 近期有使用nacos的小伙伴在使用遇到tomcat警告内存泄漏的问题。 相关警告信息: 2020-11-03 16:59:46.088 [main] WARN o.a.c.loader.WebappClassLoaderBase [173] - The web application [ROOT] appears to ...
  • 前提:tomcat版本是8和9,先用service.bat install安装了服务 大坑1: 使用tomcat_home/...2.百度到tomcat_home/bin/目录下有个tomcatXw.exe(x指版本)文件,可以在里面配置service的各种属性——注意,需要先用se
  • 1.如何启动?main方法是程序的入口,tomcat也不例外,查看tomcat源码,发现main是在Bootstrap类中的;2.如何建立连接?要通讯,必须要建议socket连接,我们需要使用哪种socket,是根据它使用的哪种协议进行判断的。...
  • 升级Tomcat10后应用无法启动解决方法

    千次阅读 2021-05-31 11:00:56
    操作:tomcat官网下载到Tomcat10.0.4免安装版,解压之后将程序放在Webapps下启动Tomcat 结果:【7456】毫秒之后服务将启动,就一直卡着没反应。但是Tomcat10已经启动,能够访问到tomcat内置的页面 验证1:将静态...
  • Tomcat 8 或 SpringBoot集成Tomcat8启动后,请求连接一直超时,且后端无任何日志输出,如下:09:34:24.654 [main] INFO org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer - Tomcat...
  • CentOS tomcat6_jdk1.6_安装配置_开启自动运行,普通用户执行 (转)秀脱linux笔记之CentOS tomcat6实战篇由于前段时间一直在外头出差,没有完成CentOS tomcat以普通用户执行,开机自动运行的文章现在整理好后,包括...
  • 在项目开发过程中,往往需要一些功能随着项目启动而优先启动,下面我总结几种方式(非spring boot) spring boot的参考spring boot 学习之路9 (项目启动后就执行特定方法)方式: ServletContextListener监听器,不懂...
  • 由于篇幅的原因, 很难把Tomcat所有的知识点都放到同一篇文章中, 我将把Tomcat系列文章分为Tomcat启动, Tomcat中各模块的介绍和Tomcat中的设计模式三部分, 欢迎阅读与关注. :通过idea搭建Tomcat源码阅读环境 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,862
精华内容 41,944
关键字:

tomcat启动时只执行一次