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時まで実行されます.