私は実際には1時間ごとにプロセスを実行し、1時間ごとにログファイルを作成するスケジューラであるメソッドを持っています。
アプリケーションライフサイクルでこのメソッドを1回呼び出すので、静的ブロックから呼び出す必要があります。
しかし、ファイルが1時間に生成されることがあり、時には早くなることがあるため、これは機能していないと感じています。私は静的ブロックが一度しか実行されないということを聞いたことが本当ではないのですか?
はいの場合はどうすればよいですか?メソッドはそのライフサイクルで一度だけ呼び出さなければならない
答えて
クラスローダーがクラスをロードするときに、静的イニシャライザブロックが1回だけ実行されます。実行される時間はアプリケーションロジックに縛られます。より正確に言えば、異なるクラスローダーがクラスをロードして、静的ブロックを理論上複数回実行できるようにすることができます。
スケジューリングの目的で、スケジューラライブラリ(例:Quartzスケジューラ)をそのまま使用してみてください。 (http://quartz-scheduler.org)これは初めてのオーバーヘッドのように見えるかもしれませんが、これらのライブラリは最終的に必要な高度な機能を提供します。簡単な例:プログラムが1時間後に停止して再起動する場合はどうですか?その後、この特定の時間にプロセスが2回実行される可能性があります。石英を使用すると、このような状況にも対応できます。
ありがとうございましたjabalしかし、私は石英のスケジューラを使用して、この問題に直面しています:) –
あなたは石英の問題について別の質問をする必要があります。おそらく、あなたはちょうどそれが何百万人も使用されている非常に高品質の製品であるため、正しく使用していないでしょう。私はコミュニティがあなたを助けることができると確信しています。 – jabal
静的メソッドは、1回だけ実行されるわけではありません。 staticはクラスのインスタンスをインスタンス化せずにメソッドの外部にアクセスできることを意味します。
私の頭の上からベストソリューション。静的変数を持ち、静的メソッドと共に更新することができるようにし、その静的変数をそのメソッドが実行されるとすぐにインクリメントします。このメソッドが実行されるたびに、変数がすでにインクリメントされているかどうかチェックしてください。
変数も必要です。
class ...
private static hasRun = false;
public static synchronize boolean runOnce()
{
if (hasRun) return false;
hasRun = true;
// do something
return true;
}
このクラスが使用されていない場合は、静的ブロックが呼び出されないことがあります。
はアンクラスUnloading classes in java?
クラスをアンロードすると、複数のロードは、静的初期化子の複数のコールが起こるかもしれないよりも、可能なよりも、たまたま についての議論があります。しかし、この場合、私の解決策は失敗するでしょう。この場合、どんな解決策も失敗するはずです。
私はこれが非常にまれでありそうもないと感じます。しかし、あなたが環境を制御していないときには、大したことはないかもしれません。
- 1. srand() - なぜそれを一度だけ呼び出すのですか?
- 2. KnockoutJs - なぜinitバインディングハンドラは一度だけ呼び出されますか?
- 3. なぜUITableViewデリゲートメソッドは一度だけ呼び出されますか?
- 4. なぜデストラクタは一度だけ呼び出されましたか?
- 5. イベントのディスパッチャは一度だけ呼び出されますC#
- 6. Windowsフックは一度だけ呼び出されます
- 7. OnDraw()はループ後に一度だけ呼び出されます
- 8. Loader:onLoadFinishedは一度だけ呼び出されます
- 9. DependencyProperties:PropertyChangedCallBackは一度だけ呼び出されます
- 10. Androidサービスクラス - OnCreateは一度だけ呼び出されます
- 11. Angular2:setTimeoutは一度だけ呼び出されます
- 12. RecyclerView.onBindViewHolderは一度だけ呼び出されます
- 13. ディレクティブは一度だけ呼び出されます
- 14. Android:FastScrolling SectionIndexer getSections()は一度だけ呼び出されます
- 15. BluetoothGattCallBack関数onCharacteristicReadは一度だけ呼び出されます
- 16. AuthorizeAttributeは一度だけ呼び出されます
- 17. heightForHeaderInSectionは一度だけ呼び出されます
- 18. Android - サービス - 開始コマンドで一度だけ呼び出される
- 19. 観測可能なサブスクライブメソッドが一度だけ呼び出される
- 20. @Scheduleメソッドを一度に1回だけ呼び出す方法
- 21. iOS:一度だけメソッドを呼び出す
- 22. qpid陽子on_sendableが一度だけ呼び出される
- 23. スーパーを呼び出さなければならないインターフェイス関数のアノテーション
- 24. 私のasynctaskからの呼び出しメソッドは静的でなければならない
- 25. 特定の順序で呼び出さなければならないメソッドの命名規則
- 26. Javascript - オブジェクトの中からメソッドを呼び出す(単純な解決策でなければならない)
- 27. アンドロイドで一度だけブロードキャストレシーバを呼び出すには?
- 28. rvalue referenceでmoveを呼び出さなければならないのはなぜですか?
- 29. super-deallocを最後に呼び出さなければならないのはなぜですか?
- 30. 依存プロパティのRaisePropertyChangedは一度だけ呼び出されます
アプリケーションコンテナを使用していますか? Weblogicのようないくつかのコンテナでは、クラスローダーの問題のないジョブを実行できるスタートアップタスクを定義できます(jabalの説明)。 –