Tomcat啟動時自動加載Servlet

轉自:http://zhaoyongpan.blog.51cto.com/2714930/676239

想實現這樣的功能:

????? 1.?? Tomcat啟動時隨即啟動Servlet;

????? 2.?? Servlet啟動時定時執行一個任務。

要點:

????? 1、Tomcat中啟動Servlet時,只需要在Servlet所在的工程的配置文件web.xml中寫成如下即可;

???? <servlet>

??????????<servlet-name>TimeServlet</servlet-name>
????????? <servlet-class>TimeServlet</servlet-class>
??????????<load-on-startup>1</load-on-startup>
???? </servlet>

???? <servlet-mapping>
???????? ?<servlet-name>TimeServlet</servlet-name>
??????????<url-pattern>/servlet/TimeServlet</url-pattern>
???? </servlet-mapping>

???????所以最主要的是加一句:<load-on-startup>1</load-on-startup>

?????? 2、在Servlet中寫一個定時器和要執行的任務即可。

?????? 我的Servlet叫這個名字: TimeServlet,定時輸出一句話,System.out.println("____ok____");也就是用來測試一下定時任務執行情況正常而已。

?

java 代碼:

?

復制代碼
import java.io.IOException;
import java.util.Timer;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TimeServlet extends HttpServlet 
{    
    private static final long serialVersionUID = 1L;    public TimeServlet() 
    {
        super();
    }    public void init() throws ServletException 
    {
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 1000, 2000);// 在1秒后執行此任務,每次間隔2秒,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.// 這個是用來停止此任務的,否則就一直循環執行此任務了
        while (true) 
        {
            try 
            {
                int ch = System.in.read(); //輸入字符“c”,回車即停止執行
                if (ch - 'c' == 0) 
                {
                    timer.cancel();// 使用這個方法退出任務
                }            } catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }    //具體執行的任務
    class MyTask extends java.util.TimerTask 
    {
        public void run() 
        {
            System.out.println("____ok____");
        }
    }    public void destroy() 
    {
        super.destroy(); 
    }    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
            {    }    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
            {    }
}
復制代碼

?

有關定時器的知識補充:

?

復制代碼
import java.io.IOException;
import java.util.Timer;public class TimerTest 
{
    public static void main(String[] args) 
    {
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 1000, 2000);// 在1秒后執行此任務,每次間隔2秒,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.// 這個是用來停止此任務的,否則就一直循環執行此任務了
        while (true) 
        {
            try 
            {
                int ch = System.in.read();
                if (ch - 'c' == 0) 
                {
                    timer.cancel();// 使用這個方法退出任務
                }            } catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
    }    static class MyTask extends java.util.TimerTask 
    {
        public void run() 
        {
            System.out.println("____ok____");
        }
    }
}
復制代碼

?

java定時器的使用【轉載】

定時器類Timer在java.util包中。使用時,先實例化,然后使用實例的schedule(TimerTask task, long delay)方法,設定指定的任務task在指定的延遲delay后執行。定時器任務類TimerTask是抽象類,繼承并重寫其run()方法,可實現具體任務。

schedule(TimerTask task, Date time)設定指定任務task在指定時間time執行。

cancel()方法結束這個定時器。

schedule(TimerTask task, long delay, long period)方法設定指定任務task在指定延遲delay后進行固定延遲peroid的執行。

scheduleAtFixedRate(TimerTask task, long delay, long period)方法設定指定任務task在指定延遲delay后進行固定頻率peroid的執行。

要實現一個定時任務,運用java中的Timer和TimerTask類可以非常容易實現實時調用處理函數。這兩個類使用起來非常方便,可以完成我們對定時器的絕大多數需要。

看個簡單的例子:

復制代碼
import java.io.IOException;
import java.util.Timer;
public class TimerTest {
public static void main(String[] args){
  Timer timer = new Timer();
  timer.schedule(new MyTask(), 1000, 2000);//在1秒后執行此任務,每次間隔2秒,如果傳遞一個Da<wbr>ta參數,就可以在某個固定的時間執行這個任務.
   while(true){//這個是用來停止此任務的,否則就一直循環執行此任務了
      try {
         int ch = System.in.read();
         if(ch-'c'==0){
           timer.cancel();//使用這個方法退出任務
       }
       } catch (IOException e) {
         // TODO Auto-generated catch block
        e.printStackTrace();
       }
   }
}
static class MyTask extends java.util.TimerTask{
    @Override
    public void run() {
    // TODO Auto-generated method stub
      System.out.println("________");
    }
  }
}
復制代碼

Servlet偵聽器結合Java定時器實現任務計劃調度【轉】

????好多朋友用過Windows的任務計劃,也有不少程序迷自己曾寫過時鐘報警、系統自動關機等趣味程序,可卻很少有朋友在Web工程中實現過類似功能。今天有空把筆者先前曾在Tomcat上實現的類似功能,搬出來與大家共享。

????早在幾年前,我公司跟某市財政局合作項目開發,為加強財政局對所屬單位財務狀況的有效監管,開發、實施了財政局數據中心項目。此項目采用B/S加C/S混合結構模式。財政局Web服務器上架設數據同步接收裝置,由市屬單位每天下班前把財務信息通過HTTP協議上傳至財政局中心服務器,與Web服務器上的接收裝置對接。財政局內部各部門需要查閱大量財務信息,獲取完備的市屬單位當前財務狀況信息,各部門按職能劃分,需要準確的獲取各部門各自所關注的匯總信息,以財政報表的形式提供。?

????因財政數據量大,實時計算財政報表速度較慢,當初就考慮用報表緩存來減輕服務器的負擔,但用緩存需要一個合理的緩存更新機制。考慮到各市屬單位每天下班前才把財務數據上傳,財政局每天所查看到的財務信息其實并不包括當天(除非有某位領導等到所屬單位全部上傳完之后才來查看信息,應該已經下班了),所以要是能實現任務計劃調度,在每晚深夜把當天及歷史財務信息匯總,更新緩存,速度瓶頸不就解決了嗎。

????當時由于系統核心是基于Web部署的,報表計算引擎也相應的部署在Tomcat容器上,因此如果想要借用Windows的任務計劃來實現定時計算,就需要額外編寫普通桌面應用程序接口,稍顯復雜。于是就琢磨著想在Web上實現,經過查閱較多相關資料,發現Java定時器(java.util.Timer)有定時觸發計劃任務的功能,通過配置定時器的間隔時間,在某一間隔時間段之后會自動有規律的調用預先所安排的計劃任務(java.util.TimerTask)。另外,由于我們希望當Web工程啟動時,定時器能自動開始計時,在整個Web工程的生命期里,定時器能在每晚深夜觸發一次報表計算引擎。因此定時器的存放位置也值得考查,不能簡單的存在于單個Servlet或JavaBean中,必須能讓定時器宿主的存活期為整個Web工程生命期,在工程啟動時能自動加載運行。結合這兩點,跟Servlet上下文有關的偵聽器就最合適不過了,通過在工程的配置文件中加以合理配置,會在工程啟動時自動運行,并在整個工程生命期中處于監聽狀態。

????下面就Servlet偵聽器結合Java定時器來講述整個實現過程。要運用Servlet偵聽器需要實現javax.servlet.ServletContextListener接口,同時實現它的contextInitialized(ServletContextEvent?event)和contextDestroyed(ServletContextEvent?event)兩個接口函數。考慮定時器有個建立和銷毀的過程,看了前面兩個接口函數,就不容置疑的把建立的過程置入contextInitialized,把銷毀的過程置入contextDestroyed了。

????我把ServletContextListener的實現類取名為ContextListener,在其內添加一個定時器,示例代碼如下所示(為考慮篇幅,僅提供部分代碼供讀者參考):

復制代碼
private java.util.Timer timer = null; 
public void contextInitialized(ServletContextEvent event) {
    timer = new java.util.Timer(true); 
    event.getServletContext().log("定時器已啟動");        
    timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
    event.getServletContext().log("已經添加任務調度表");
}
public void contextDestroyed(ServletContextEvent event) {
    timer.cancel();
    event.getServletContext().log("定時器銷毀");
}
復制代碼

?  以上代碼中,?timer.schedule(new?MyTask(event.getServletContext()),?0,?60*60*1000)這一行為定時器調度語句,其中MyTask是自定義需要被調度的執行任務(在我的財政數據中心項目中就是報表計算引擎入口),從java.util.TimerTask繼承,下面會重點講述,第三個參數表示每小時(即60*60*1000毫秒)被觸發一次,中間參數0表示無延遲。其它代碼相當簡單,不再詳細說明。

????? 下面介紹MyTask的實現,上面的代碼中看到了在構造MyTask時,傳入了javax.servlet.ServletContext類型參數,是為記錄Servlet日志方便而傳入,因此需要重載MyTask的構造函數(其父類java.util.TimerTask原構造函數是沒有參數的)。在timer.schedule()的調度中,設置了每小時調度一次,因此如果想實現調度任務每24小時被執行一次,還需要判斷一下時鐘點,以常量C_SCHEDULE_HOUR表示(晚上12點,也即0點)。同時為防止24小時執行下來,任務還未執行完(當然,一般任務是沒有這么長的),避免第二次又被調度以引起執行沖突,設置了當前是否正在執行的狀態標志isRunning。示例代碼如下所示:

  1. ????private?static?final?int?C_SCHEDULE_HOUR???=?0;
  2. ????private?static?boolean?isRunning?=?false;
  3. ?????????private?ServletContext?context?=?null;
  4. ????public?MyTask(ServletContext?context)?{
  5. ????????this.context?=?context;
  6. ????}
  7. ????public?void?run()?{
  8. ????????Calendar?cal?=?Calendar.getInstance();????????
  9. ????????if?(!isRunning)??{???????????
  10. ????????????if?(C_SCHEDULE_HOUR?==?cal.get(Calendar.HOUR_OF_DAY))?{????????????
  11. ????????????????????isRunning?=?true;????????????????
  12. ????????????????context.log("開始執行指定任務");
  13. ????????????????
  14. ????????????????//TODO?添加自定義的詳細任務,以下只是示例
  15. ????????????????int?i?=?0;
  16. ????????????????while?(i++?<?10)?{
  17. ????????????????????context.log("已完成任務的"?+?i?+?"/"?+?10);
  18. ????????????????}
  19. ?
  20. ????????????????isRunning?=?false;
  21. ????????????????context.log("指定任務執行結束");???????????????
  22. ????????????}????????????
  23. ????????}?else?{
  24. ????????????context.log("上一次任務執行還未結束");
  25. ????????}
  26. ????}

????上面代碼中“//TODO……”之下四行是真正被調度執行的演示代碼(在我的財政數據中心項目中就是報表計算過程),您可以換成自己希望執行的語句。到這兒,ServletContextListener和MyTask的代碼都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去,在您工程的web.xml配置文件中加入如下三行:

???? <listener></listener>

?????<listener>com.test.ContextListener</listener>

????當然,上面的com.test得換成您自己的包名了。保存web.xml文件后,把工程打包部署到Tomcat中即可。任務會在每晚12點至凌晨1點之間被執行,上面的代碼會在Tomcat的日志文件中記錄如下:

2003-12-05?0:21:39?開始執行指定任務

2003-12-05?0:21:39?已完成任務的1/10

????……

2003-12-05?0:21:39?已完成任務的10/10

2003-12-05?0:21:39?指定任務執行結束


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

更多的Java,Angular,Android,大數據,J2EE,Python,數據庫,Linux,Java架構師,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

internal java compiler error_Java異常處理總結

背景 最近專門負責團隊的項目質量。我在治理異常日志過程中&#xff0c;總結了一下Java的異常處理。上面是我整理的最近自己比較常見的異常知識地圖。異常知識地圖概述 從異常知識地圖最左邊的根開始看&#xff0c;地圖從左到右的連線連接的類之間有實實在在的父…

java異步刷新集合,同步和異步集合的性能測試,異步集合性能測試,package cn.o

同步和異步集合的性能測試&#xff0c;異步集合性能測試,package cn.opackage cn.outofmemory.snippets.core;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Vector;import java.util.concurrent.TimeUnit;public class Co…

cuda nvcc版本不一致_windows 驗證CUDA和CUDNN是否安裝成功

安裝完成CUDA&#xff0c;使用 nvcc -V 驗證是否安裝成功&#xff0c;看到如下信息說明安裝成功接下來就可以安裝 cuDNN 了。安裝cuDNN下載 cuDNN&#xff0c;下載之前需要先注冊一下 Nvidia 的賬號&#xff0c;下載地址為&#xff1a;https://developer.nvidia.com/rdp/cudnn-…

Nova Cell

Nova Cell V2 詳解 現在 &#xff0c;OpenStack 在控制平面上的性能瓶頸主要在 Message Queue 和 Database 。 尤其是 Message Queue , 隨著計算節點的增加 &#xff0c; 性能變的越來越差 。 為了應對這種情況 &#xff0c; Nova 很早之前提出來 nova-cell ( 以下以 cellv1 代…

Android 通過WIFI狀態監聽廣播,判斷進入指定wifi范圍

原文地址&#xff1a;http://blog.csdn.net/kongxiuqi/article/details/52524500 --------------------------------------------- WIFI狀態變化會發送廣播&#xff0c;一些可用的廣播在WifiManger.java中可以看到。 廣播一&#xff1a;WIFI 狀態開關變化的監聽&#xff0c;en…

2018年度最佳網頁設計與開發教程

任何一個網站從開發到最終上線&#xff0c; 都是需要團隊協作且謹慎的一個過程&#xff0c;而實際中往往會遇到各類問題&#xff0c;所以網頁設計師通常需要扮演多種角色&#xff0c;除了掌握必備的網頁設計技能外&#xff0c;更應該對后期的開發流程及內容有所了解&#xff0c…

mysql_ping()函數的作用以及返回值的類型正確的是,[單選] mysql_ping()函數的作用以及返回值的類型正確的是:()...

[單選] mysql_ping()函數的作用以及返回值的類型正確的是&#xff1a;()更多相關問題中華田園犬&#xff0c;雄性&#xff0c;2歲&#xff0c;昨晚外出未歸&#xff0c;今晨發現患犬精神沉郁&#xff0c;呼吸急促&#xff0c;體溫39℃&#xff0c;左胸側壁中下部有創1884年新疆…

java 截取byte數組_2020年的秋招已經開始了!最新Java面試題大全(文末附參考答案)送給大家...

包含的模塊本文分為十九個模塊&#xff0c;分別是&#xff1a;Java 基礎、容器、多線程、反射、對象拷貝、Java Web 、異常、網絡、設計模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM共包含 208 道面…

MVP模式在Android項目中的使用

煩了在Activity中編寫太多的代碼&#xff0c;該app由我來主導。就選擇用MVP模式。 概述 MVP是模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、主持人&#xff08;Presenter&#xff09;的縮寫&#xff0c;分別代表項目中3個不同的模塊。 模型&#…

運行時錯誤7內存溢出_C++程序運行時的內存模型

C程序在運行時會將內存劃分為4個區域&#xff1a;1代碼區&#xff1a;存放函數體的二進制代碼&#xff0c;由操作系統進行管理2全局區&#xff1a;存放程序的全局變量、靜態變量、常量3棧區&#xff1a;由編譯器進行自動分配和釋放&#xff0c;存放函數的參數值&#xff0c;局部…

php strip_tags 少,詳解PHP函數 strip_tags的用法不足之處

這篇文章主要介紹了詳解PHP函數 strip_tags 處理字符串缺陷bug的相關資料,需要的朋友可以參考下詳解PHP函數 strip_tags 處理字符串缺陷bugPHP 函數 strip_tags() 是一個常用函數&#xff0c;該函數可以剝去字符串中的 HTML、XML 以及 PHP 的標簽。極大方便了對字符串的操作&am…

玩轉Android之MVVM開發模式實戰,炫酷的DataBinding!

原文&#xff1a;http://blog.csdn.net/u012702547/article/details/52077515 --------------------------------------------------------- MVP可以結合android的DataBinding -------------------------以下轉載--------------- C# 很早就有了MVVM的開發模式&#xff0c;An…

打造一款便攜版的Sublime Text

https://segmentfault.com/a/1190000000707661 https://www.cnblogs.com/52cik/p/sublime-diy.html 直接安裝Sublime Text&#xff0c;不要打開 大家可以參照上文提到的《Sublime Text 全程指引》中的步驟去進行安裝。我這里使用的是Sublime Text 2&#xff0c;其實3也是一樣的…

confluence創建頁面加載緩慢_樹莓派4B使用docker安裝confluence

說明confluence是一個專業的企業知識管理與協同軟件&#xff0c;可以用于構建企業wiki。通過它可以實現團隊成員之間的協作和知識共享。現在大多數公司都會部署一套confluence&#xff0c;用作內部wiki。另外confluence也可以作為個人的知識管理工具來用&#xff0c;只需要花10…

python用map提取一個數的個十百位數_如何使用python中的map函數?

我們在使用python過程中&#xff0c;為了避免錯誤刪除&#xff0c;會選擇做好一個序列后可以插入另外的序列中做為新序列的一部分內容。方便完成一些復雜的工程或多個片段分別編輯后再串成一個完整工程的操作。之前小編向大家介紹了在序列中起到累計作用的reduce函數(https://w…

matlab粒子加速器仿真,粒子群算法優化PID參數 仿真不出結果 程序如下

用的是《MATLAB智能算法30個案例分析》中的程序1.文件名為PSO_PID.mfunction z PSO_PID(x)assignin(base,Kp,x(1)); % 粒子群依次賦值給Kp 這部分運行結果> PSO_PIDassignin(base,Ki,x(2)); …

CentOS5、6的啟動流程

CentOS5/6的啟動流程啟動流程畫了張圖,看著更清晰些: (centos7的啟動流程變化挺大的,這部分待補充)補充(/etc/rc.d/rc.local 不屬于任何服務,為特殊文件,可將不能定義為服務又想開機運行的命令定義在此文件中)添加自定義服務:[rootel5 init.d]# vi /etc/init.d/testsrv #!/bin…

Spark交互式分析平臺Apache Zeppelin的安裝

Zeppelin介紹 Apache Zeppelin提供了web版的類似ipython的notebook&#xff0c;用于做數據分析和可視化。背后可以接入不同的數據處理引擎&#xff0c;包括Spark, Hive, tajo等&#xff0c;原生支持Scala, Java, shell, markdown等。它的整體展現和使用形式和Databricks Cloud是…

win7 php zend,win7系統打開WZend Studio PHP出錯的解決方法

很多朋友安裝win7系統后&#xff0c;在使用的過程中會遇到win7系統打開WZend Studio PHP出錯的情況&#xff0c;可能有很多用戶還是不能自己處理win7系統打開WZend Studio PHP出錯的問題&#xff0c;其實簡單的來說處理win7系統打開WZend Studio PHP出錯的問題只需要按照 1、在…

9個元素換6次達到排序序列_C語言必學的12個排序算法:希爾排序(第3篇)

基本思想希爾排序&#xff08;Shells Sort&#xff09;&#xff0c;以發明人命名&#xff0c;又稱為縮小增量排序&#xff0c;也是一種插入排序算法。主要思想&#xff1a;直接插入排序算法時間和待排數據有關&#xff0c;其平均復雜度是O(n^2)&#xff0c;但是在待排數據已經有…