JAvaタスクタイマ


Webエンジニアリングが開始されると、タイマーは自動的に計時を開始することができ、Webエンジニアリングのライフサイクル全体で、タイマーは毎晩深夜にタスクをトリガーすることができます.したがって,タイマの格納位置も調べる価値があり,単一サーブレットやJavaBeanに単純に存在することはできず,タイマホストの生存期間をWebエンジニアリングライフサイクル全体とし,エンジニアリング起動時に自動的にロード運転できるようにしなければならない.この点を組み合わせると、サーブレットコンテキストに関連するリスナーが最適であり、エンジニアリングのプロファイルで合理的に構成することで、エンジニアリングの開始時に自動的に実行され、エンジニアリングライフサイクル全体でリスニングされます.次に、サーブレットリスナーとJavaタイマを組み合わせて、実装プロセス全体について説明します.サーブレットリスナーを運用するにはjavaxを実現する必要がある.servlet.ServiceletContextListenerインタフェースは、そのcontextInitialized(ServiceletContextEvent event)とcontextDestroyed(ServiceletContextEvent event)の2つのインタフェース関数を同時に実装します.タイマの確立と破棄の過程を考慮して、前の2つのインタフェース関数を見て、確立の過程をcontextInitializedに入れて、破棄の過程をcontextDestroyedに入れました.サーブレットContextListenerの実装クラスをContextListenerと名付け、その中にタイマーを追加しました.サンプルコードは以下の通りです.
import java.util.Timer; 

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 

public class ContextListener 
extends HttpServlet 
implements ServletContextListener { 
public 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.getServiceletContext),0,60*60*1000)という動作タイマスケジューリング文で、MyTaskはスケジューリングが必要な実行タスク(私の財政データセンタープロジェクトではレポート計算エンジンのエントリ)をカスタマイズし、java.util.TimerTaskから継承されます.次に、3番目のパラメータは1時間(すなわち60*60*1000ミリ秒)に1回トリガーされることを示します.中間パラメータ0は、遅延がないことを示します.他のコードはかなり簡単で、詳細は説明しません.以下、MyTaskの実装について説明するが、上記のコードではMyTaskを構築する際にjavaxが転送されるのを見た.servlet.サーブレットContextタイプパラメータは、サーブレットログを記録するのに便利であるため、MyTaskのコンストラクション関数をリロードする必要がある(親java.util.TimerTask元コンストラクション関数にはパラメータがない).timer.schedule()のスケジューリングでは、1時間に1回のスケジューリングが設定されているため、スケジューリングタスクを24時間ごとに実行するには、クロックポイントを判断して定数C_SCHEDULE_HOURは(夜12時、つまり0時)を表します.同時に、24時間の実行を防止するために、タスクがまだ実行されていない(もちろん、一般的なタスクはそれほど長くない)ため、2回目の実行競合を引き起こすようにスケジューリングされないように、現在実行中かどうかのステータスフラグisRunningが設定されています.サンプルコードは以下の通りです.
import java.util.*; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.*; 

public class MyTask extends TimerTask { 
  private static final int C_SCHEDULE_HOUR = 0; 
  private static boolean isRunning = false; 
  private ServletContext context = null; 

  public MyTask() { 
  } 
  public MyTask(ServletContext context) { 
    this.context = context; 
  } 

  public void run() { 
    Calendar cal = Calendar.getInstance(); 
    if (!isRunning) { 
      if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) { 
        isRunning = true; 
        context.log("        "); 
        //TODO           ,       
        //         
        Email email=new Email(); 
        email.recieve(); 

        isRunning = false; 
        context.log("        "); 
      } 
    } 
    else { 
      context.log("           "); 
    } 
  } 

} 
   ,ServletContextListener MyTask        。       ServletContextListener     Web    ,     web.xml           : 

<listener> 
<listener-class>com.test.ContextListener</listener-class> 
</listener> 
もちろん、上のcom.testは自分のバッグ名に変えなければなりません.Webを保存します.xmlファイルの後、プロジェクトをTomcatにパッケージして配置すればいいです.タスクは毎晩12時から午前1時まで実行されます.