2011-07-26 13 views
0

私は、サーブレット(これはjspから呼び出されます)を最初に実行すると、そのサービスのエントリを入れている間に、毎日conf.iファイル内のスケジューラを実行したいと思っています。毎日そのサービスのプログラム(サーブレット - 実行してメールを送信する)を呼び出します。以下 毎日schedularを呼び出す方法

が、私は、サーバーを停止するとtask.but問題がある実行するのに使用したコードで、スケジューラが停止し、何もJDKタイマーがないオペレーティングシステムでは、JVMで実行さ

public class Schedule 
{ 
    public static final String CONF_PATH = "../webapps/selen/WEB-INF/scheduling.properties"; 
    public static Properties schProps = null; 
    public static FileInputStream sis = null; 
    public static long period; 
    public static Timer timer = new Timer(); 
    public static String servicename = null; 
    public static String keyValues = null; 
    public static String reValues[] = null; 
    public static String schedulingValue = null; 
    public static String service_url = null; 
     public static String browserlist = null; 
     public static String testType = null; 
    public static String mailCheacked = null; 
     public static String toaddr = null; 
    public static HttpServletRequest request = null; 
    public static HttpServletResponse response = null; 
    public static String serversURL = null; 
    public static String contextPath = null; 
     public static Date delay = null; 
    public void scheduleLoad(String serviceValue) throws Exception 
    { 
     try 
      { 
      schProps = new Properties(); 
      sis = new FileInputStream(CONF_PATH); 
      schProps.load(sis); 
      servicename = SServlet.serviceName; 
      keyValues = schProps.getProperty(serviceValue); 
      reValues = keyValues.split(","); 
      String request = reValues[0]; 
      String response = reValues[1]; 
      schedulingValue = reValues[2]; 
      service_url = reValues[3]; 
      browserlist = reValues[4]; 
      testType = reValues[5]; 
      mailCheacked = reValues[6]; 
      toaddr = reValues[7]; 
      serversURL = reValues[8]; 
      contextPath = reValues[9]; 
      if(reValues[2].equals("Daily")) 
      { 

       Calendar cal =Calendar.getInstance(); 
       cal.set(Calendar.HOUR,10); 
       cal.set(Calendar.MINUTE,20); 
       cal.set(Calendar.SECOND,0); 
       delay = cal.getTime(); 
       period = 1000 * 60 * 60 * 24; 
       schedule(); 
      } 
      else if(reValues[2].equals("Stop")) 
      { 
       stop(); 
      } 
     } 
     catch(NullPointerException npe) 
     { 
      System.out.println("null point exception "); 
     } 
     finally 
     { 
      if(sis !=null) 
      { 
       sis.close(); 
      } 
     }   

    } 
    public static void schedule() 
    { 
     MyTimerTask mt = new MyTimerTask(request,response,servicename,service_url,browserlist,mailCheacked,testType,schedulingValue,toaddr,serversURL,contextPath); 
     timer.schedule(mt,delay,period); 
    } 
    public static void stop() 
    { 
     timer.cancel(); 
    } 

} 
class MyTimerTask extends TimerTask 
{ 
    public HttpServletRequest request; 
    public HttpServletResponse response;  
    public String servicename; 
    public String service_url; 
    public String browserlist; 
    public String mailCheacked; 
    public String testType; 
    public String schedulingValue; 
    public String toaddr; 
    public String serversURL; 
    public String contextPath; 
    public MyTimerTask(HttpServletRequest request,HttpServletResponse response, String servicename,String service_url,String browserlist,String mailCheacked,String testType,String schedulingValue,String toaddr,String serversURL, String contextPath) 
    { 
     this.request = request; 
     this.response = response; 
     this.servicename = servicename; 
     this.service_url = service_url; 
     this.browserlist = browserlist; 
     this.mailCheacked = mailCheacked; 
     this.testType = testType; 
     this.schedulingValue = schedulingValue; 
     this.toaddr = toaddr; 
     this.serversURL = serversURL; 
     this.contextPath = contextPath; 
    } 
    public void run() 
    { 
     SServlet sservlet = new SServlet(); 
     sservlet.sServerloading(request,response,servicename,service_url,browserlist,mailCheacked,testType,schedulingValue,toaddr,false,1,serversURL,contextPath); 
    } 
} 
+0

スケジューラはJVM内で実行されるため、サーバを停止するとすぐに停止します。たぶん外部スケジューラ(JVM単独)が必要でしょうか? – home

+0

どのようにそれを行うにはどのようなアイデア? – sasikumar

答えて

1

起こりません。 CRONまたはWindowsスケジューラーではありません。したがって、サーバーを停止すると(Tomcat?JBoss?Glassfish?)、Timerが存続するJVMを効果的に停止しているので、それ以上は実行されません。サーバーとは独立して動作するタイマー(スケジューラー)が必要な場合は、javaコマンドを使用するスタンドアロンJavaプログラムとして、または別のサーバーインスタンス内で、独自のJVMで起動する必要があります。サイドノートでは

、あなたには、いくつかの批判、あなたのコードの小さな見直しに開放している場合:可能な場合は、静的および非静的コンテキストを混合

  • は避けてください。 ScheduleクラスのインスタンスメソッドscheduleLoad()は、ステートフルストレージに静的メンバー変数を頻繁に使用します。変数はメソッドの実行時にのみ使用されます(その場合、そのメソッド内で宣言される必要があります)。またはオブジェクトの状態を記述するために使用されます(この場合、クラスのプライベートインスタンスメンバである必要があります)。グローバル定数または不変グローバル変数です(この場合、static finalとして宣言する必要があります)。これらの例外は存在しますが、あまり一般的ではありません。

  • メンバー変数publicも、finalでない場合は、宣言しないでください。 JavaBeanパターンに従い、gettersとsetterを使用します。変数が実際には定数であれば、それはpublic static finalでなければなりません。

  • スコープ外のクラスまたはパラメータの使用は避けてください。たとえば、MyTimerTaskは、メンバ変数とメソッドパラメータとしてHttpServletRequestHttpServletResponseを使用します。 MyTimerTaskがサーブレットリクエストの範囲で使用されていない(そしてその後は常にnullになる、というのも)意味がない。また、実際にそうである場合、あるサーブレットのScheduleの静的メンバーを明示的に設定してからscheduleLoad()を呼び出す場合は、静的コンテキストの不適切な使用についての私の最初の点を参照してください。あなたのコードはスレッドセーフではなく、Scheduleを使用しているサーブレットを同時に呼び出すと、予期しない動作が発生します。

UPDATE: それは私が専門知識のあなたのレベルがJavaであるかはわからないとして開始する場所を知るのは難しいです。スタンドアロンのJavaアプリケーションを実行する方法に慣れていない場合は、チュートリアルを参照することをお勧めします。オラクルはhttp://download.oracle.com/javase/tutorial/に束縛されています。 http://download.oracle.com/javase/tutorial/getStarted/index.htmlは、mainメソッドを使用した非常に基本的な「hello world」タイプのアプリケーションと、javaコマンドを使用して実行する方法、およびいくつかの一般的な間違いや問題点を説明します。

これをすべて理解したら、アプリケーションが行うべきこと、必要とするリソース、そして「外部」システムを呼び出す必要があるかどうかを確認するのに数分を要します。あなたはそれが "メールを送るためにサーブレットを実行する"べきだと言いました。これは、特定のサーブレットを呼び出さなければならないことを意味しますか、それとも実際にあなたが後にしているメールだけですか?その場合、スタンドアロンプ​​ログラムにすべてのメール送信ロジックを移動するだけでよいでしょうか?そうでなければ、ブラウザのようにhttpリクエストを使ってサーブレットを呼び出さなければなりません。このようなことをするための既存のフレームワークがいくつかあります。 Apache HttpClientは非常に普及したものです。

+0

フィードバックをいただきありがとうございます、私は上記のコメントを心に留めておきます! "あなたはjavaコマンドを使用するスタンドアロンのJavaプログラムとして、または別のサーバーインスタンス内で、独自のJVMで起動する必要があります。どのようにこれを行うには、Windowsサービスを持っていることを意味ですか?上記のクラスを呼び出しますか?私は明確ではない助けてください – sasikumar

+0

@サシクマール:私の更新を参照してください。 – pap

0

プログラムを停止すると機能しません。これはバグではありません。それは機能です。あなたがコンピュータをシャットダウンしても、何も起こらないのです。

しかし、私のスケジュールされたタスクをよりロバストにする方法があれば、サーバーが停止してからタスクを再開するには、スケジューラーの状態のどこか、つまりタスク実行の最後の時間を維持する必要があります。あなたはこれを自分で実装することができます:特別なファイルを作成し、そこにデータを保存します。あなたはこれを行うためにクロスプラットフォームの純粋なJava Preferences APIを使うことができます:データはUnixのファイルシステムとWindowsのレジストリに保存されます。 DBに状態を保存することもできます。

しかし、既にこの機能を実装している他の製品を使用することもできます。最も一般的でよく知られているのはQuartzです。

しかし、Quartzはまだ起動して実行するには、いくつかのJavaプロセスが必要です。 Javaプロセスが実行されていなくてもタスクを実行できるようにしたい場合は、Unixの場合はcron tab、Windowsの場合はスケジューラーAPIを使用します(VBScript、JScript、コマンドラインからアクセスできます)。 UNIXはcron

+0

あなたは、プロパティファイル(例えば)で最後に実行時間があると言っていますか?上記のプログラムを毎日午前10時に呼び出すcron/windowsスケジュールを使用する必要がありますか? – sasikumar

関連する問題