1. 程式人生 > >Tomcat啟動真正完成後,執行方法

Tomcat啟動真正完成後,執行方法

本文主要介紹Tomcat啟動真正完成後(即在eclipse的控制檯上出現類似於Server started in 2300ms這樣的訊息後)執行一個操作。
如下的3種方法都是在Tomcat啟動過程中執行的,這樣會影響Tomcat的啟動時間,從而造成Tomcat不能啟動成功: 
1.配置一個Servlet預設自動啟動。 
2.配置一個Listener來啟動 
3.實現Spring的InitializingBean介面 
要想不影響Tomcat的啟動,便聯想到了非同步呼叫 。即無非就是新建立了一個執行緒來單獨執行,這樣Tomcat執行到相應的操作就可以直接繼續下去了,不會處於等待的狀態,避免了啟動超時。基於這樣的思想,可以有兩種方法來完成:

方法一: 使用如上三種方式中的任何一種來在啟動Tomcat的過程中執行相應的方法,然後在執行的過程中使用另一個執行緒來執行:比如說將要執行的方法所在的類繼承HttpServlet並在web.xml中配置,然後在該Servlet的init中去呼叫想要執行的方法時(假設這個方法名叫start()),啟動另一個執行緒來執行,具體程式碼如下。

/**
 * 
 */
package com.ebay.montage.pm;


import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.ebay.montage.pm.collector.NucleonEventDataCollector;
import com.ebay.montage.pm.constants.CMConstants;
import com.ebay.montage.pm.utils.ConfigurationUtils;
import com.ebay.montage.pm.utils.LoggerUtils;
import com.ebay.system.ShutdownAwaitLatch;

/**
 * Trigger to consume data from Nucleon Event Bus
 * 
 * @author Josh Wang(Sheng)
 *
 * @email  
[email protected]
*/ @Component("processor") public class NucleonEventProcessor extends HttpServlet { private static final long serialVersionUID = -9045451275234606838L; private static final Logger log = Logger.getLogger(NucleonEventProcessor.class); // Servlet的init方法會在Tomcat啟動的時候執行 @Override public void init() throws ServletException { FutureTask<String> task = new FutureTask<String>(new Callable<String>(){ @Override public String call() throws Exception { start(); // 使用另一個執行緒來執行該方法,會避免佔用Tomcat的啟動時間 return "Collection Completed"; } }); new Thread(task).start(); } private void start() {// 希望Tomcat啟動結束後執行的方法 } }

 web.xml中的配置

<servlet>
		<servlet-name>event-collector</servlet-name>
		<servlet-class>com.ebay.montage.pm.NucleonEventProcessor</servlet-class>
		<load-on-startup>5</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>event-collector</servlet-name>
		<url-pattern>/event-collect</url-pattern>
	</servlet-mapping>

方法二: 使用Spring的Timer或者是著名的Quartz在Tomcat啟動後再執行該方法,Spring中的Timer非常簡單,這個地方不想講解了,Quartz相對更復雜些

工作中遇到的,其它方式 implements      ServletContextListener(實現兩個方法  啟動時,關閉時  或 Job

相關推薦

Tomcat啟動真正完成執行方法

本文主要介紹Tomcat啟動真正完成後(即在eclipse的控制檯上出現類似於Server started in 2300ms這樣的訊息後)執行一個操作。 如下的3種方法都是在Tomcat啟動過程中執行的,這樣會影響Tomcat的啟動時間,從而造成Tomcat不能啟動成功

SpringCloud 配置中心服務啟動真正完成再去啟動client服務吧

一、場景簡述 如題,筆者在啟動配置中心的服務的時候,沒等它真正的啟動完成,就去啟動client服務,導致出現如下報錯! 這樣的結果就是導致你再一次去啟動UserApplication這個client服務是可以成功啟動的。 二、解決方案 因為再一次啟動是可以成功啟動

spring專案啟動完成自動執行一次指定方法

背景 因為需要保證所有排程相關的依賴注入spring容器才建立所以定時排程任務,所以需要實現在Spring容器將所有的Bean都初始化完成之後才自動執行一次執行方法(建立一個排程任務) 實現 實現ApplicationListener介面,並實現 on

ssh專案啟動完成自動執行一次需要程式

1.建立一個類存放自動執行的發放,如圖: 2.建立完成後,實現介面,實現方法,如圖: if語句裡面就是要執行的方法 3.在spring配置檔案applicationContext.xml裡面新增 <bean class="com.jandar.netcrime.ca

js中如何控制所有頁面載入完成執行某些方法

做頁面時經常會遇到當前頁面載入完成後,執行某些初始化工作。這時候就要知道如何判斷頁面(包括IFRAME)已經載入完成,程式碼如下: <script language="javascript">       document.onreadystatechange

spring啟動立即執行方法

per 作用 spring容器 隨著 pri after proto 一次 繼承 1、方法所屬的類繼承InitializingBean接口。 2、重寫afterPropertiesSet()方法。 afterPropertiesSet方法會在bean被初始化時執行。 當be

ubuntu16.04安裝eclipse完成啟動不顯示選單欄

在安裝Kdevelop失敗後(缺少下載源,估計被我誤刪),果斷轉戰eclipse。扎心的是安裝後開啟竟然沒有選單,不能認不能忍。 有兩種解決方法: (1)方法一 1. 新建一個eclipse.sh檔案,加入如下內容,下面的路徑是ecipse的路徑 #!/bin/bash expo

appium 連結真機執行程式碼但是APP並沒有啟動

要淡定,連結真機後,問題一下多出來這麼多,還沒有啟動程式,就碰到接二連三的問題。 爽到家了。慢慢解決吧。 具體問題是這樣的: # coding=utf-8from appium import webdriverimport timefrom selenium.common.exceptions impo

正確實現子執行緒任務全部完成執行緒關閉的四種方法

方法一 Thread.sleep 方法二 ExecutorService 方法三 thread.join 方法四 Thread.yield and Thread.

執行執行如果一個邏輯需要等若干個執行執行完成執行怎麼實現?

實際開發過程中,尤其是大型的業務系統中或批量處理系統中,我們通常會用到多執行緒來進行任務拆分,來提高系統的處理能力。當對業務不斷拆分時,多執行緒各自任務之間也形成了錯綜複雜的關係。 我們常常遇到這樣的情況,業務模組A 拆分成了 A1 、A2.....An個多執行緒,來提高處理速度,可是 Ak(1<k&

安裝docker成功啟動docker報錯解決方法

[[email protected] ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. Se

java如何在多執行執行完成執行某個方法

package com.whj.feign.client; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concur

objective-c 等待多個非同步函式完成執行某段程式碼--GCD Group 的使用

有個 API 如下: + (void)updateByUser:(ALUser *)user completion:(void (^)(void))completion { AVQuery *query = [AVQuery queryWithClassNam

JAVA線程池原理源碼解析—為什麽啟動一個線程池提交一個任務Main方法不會退出?

ces 內部 pools let 實例 工作 cte hello rep 起因 public static void main(String[] args) { ExecutorService service = Executors.newFixedThr

java開啟多個執行執行完成執行執行

博主昨天去一家公司面試,被面試官問到一個問題,如果開啟10個執行緒,但是需要這10個執行緒都執行完成後,再交由主執行緒統一輸入,如何實現?當時我沒有回答,我對多執行緒並不是那麼的熟悉,面試結束後,我通過查閱資料找到了解決方案,下面我貼出程式碼: i

bindServiceonServiceConnected方法沒有執行

在體驗bindService功能時候,執行過bindService後,也返回繫結成功,但是發現獲取Service的物件mBoundService一直為空,onServiceConnected沒有執行,一個晚上沒想明白,也嘗試了網上的一些做法,直到看到了下面的方法

Tomcat效能調優 啟動出現警告問題 [did not find a matching property.]

2013-5-22 16:29:48 org.apache.catalina.core.AprLifecycleListener init 資訊: Loaded APR based Apache Tomcat Native library 1.1.23 using APR

所有input輸入完成改變按鈕顏色

ffffff nbsp rim fff val car cti chang rop $(function(){ $(‘input‘).on(‘input propertychange‘,function(){ if(($.trim($(‘.add1

安裝VMware,出現Microsoft Runtime DLL 安裝程序未能完成安裝解決方法

程序 runtime time 找到 .com 運行 src 文件夾 color   安裝VMware Workstation 12 Player出現如下問題:      解決方法:     1.出現這個問題的時候不要點確定(如果點了確定,會找不到步驟4中的文件夾)    

數據庫安裝完成必改系統參數之一

數據庫 完成後 參數之一 一、環境Oracle 11.2.0.4Rhel 6.6 二、修改tmpfs數據庫安裝完成之後,需要修改很多參數,包括數據庫參數和系統參數,操作系統必須修改參數之一。按照操作系統60%到80%進行改動。[[email protected] ~]# df -hFil