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
bindService後,onServiceConnected方法沒有執行
在體驗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