2012-03-30 8 views
2

私は実際には1時間ごとにプロセスを実行し、1時間ごとにログファイルを作成するスケジューラであるメソッドを持っています。
アプリケーションライフサイクルでこのメソッドを1回呼び出すので、静的ブロックから呼び出す必要があります。
しかし、ファイルが1時間に生成されることがあり、時には早くなることがあるため、これは機能していないと感じています。私は静的ブロックが一度しか実行されないということを聞いたことが本当ではないのですか?
はいの場合はどうすればよいですか?メソッドはそのライフサイクルで一度だけ呼び出さなければならない

+0

アプリケーションコンテナを使用していますか? Weblogicのようないくつかのコンテナでは、クラスローダーの問題のないジョブを実行できるスタートアップタスクを定義できます(jabalの説明)。 –

答えて

2

クラスローダーがクラスをロードするときに、静的イニシャライザブロックが1回だけ実行されます。実行される時間はアプリケーションロジックに縛られます。より正確に言えば、異なるクラスローダーがクラスをロードして、静的ブロックを理論上複数回実行できるようにすることができます。

スケジューリングの目的で、スケジューラライブラリ(例:Quartzスケジューラ)をそのまま使用してみてください。 (http://quartz-scheduler.org)これは初めてのオーバーヘッドのように見えるかもしれませんが、これらのライブラリは最終的に必要な高度な機能を提供します。簡単な例:プログラムが1時間後に停止して再起動する場合はどうですか?その後、この特定の時間にプロセスが2回実行される可能性があります。石英を使用すると、このような状況にも対応できます。

+0

ありがとうございましたjabalしかし、私は石英のスケジューラを使用して、この問題に直面しています:) –

+0

あなたは石英の問題について別の質問をする必要があります。おそらく、あなたはちょうどそれが何百万人も使用されている非常に高品質の製品であるため、正しく使用していないでしょう。私はコミュニティがあなたを助けることができると確信しています。 – jabal

-1

静的メソッドは、1回だけ実行されるわけではありません。 staticはクラスのインスタンスをインスタンス化せずにメソッドの外部にアクセスできることを意味します。

私の頭の上からベストソリューション。静的変数を持ち、静的メソッドと共に更新することができるようにし、その静的変数をそのメソッドが実行されるとすぐにインクリメントします。このメソッドが実行されるたびに、変数がすでにインクリメントされているかどうかチェックしてください。

+0

静的ブロックは静的メソッドではありません – jabal

+0

私は信じています。私は「私はメソッドを持っています」と言いますが、OPがここで述べた最初のことです。 – Churk

+0

私はあなたのソリューションに同意しますが、2つのコメント:a)最初の段落は間違っているように見えますが、質問は静的メソッドではなくクラスの静的コードブロックを参照しています。 b)静的クラス*とは何ですか? – nwinkler

1

変数も必要です。

class ... 

    private static hasRun = false; 

    public static synchronize boolean runOnce() 
    { 
    if (hasRun) return false; 

    hasRun = true; 
    // do something 
    return true; 
    } 

このクラスが使用されていない場合は、静的ブロックが呼び出されないことがあります。

はアンクラスUnloading classes in java?

クラスをアンロードすると、複数のロードは、静的初期化子の複数のコールが起こるかもしれないよりも、可能なよりも、たまたま についての議論があります。しかし、この場合、私の解決策は失敗するでしょう。この場合、どんな解決策も失敗するはずです。

私はこれが非常にまれでありそうもないと感じます。しかし、あなたが環境を制御していないときには、大したことはないかもしれません。

+0

静的なブロックは静的メソッドではありません – jabal

+0

そうですが、クラスが使用中になると静的ブロックが実行されます。質問はこれを要求するようには聞こえません –

+0

彼は "私はそれを静的ブロックに入れます"と言います。 – jabal

関連する問題