2

Web アプリケーションに Java Spring フレームワークを使用しており、特定の時間にサーバーで実行するタスクをスケジュールしたいと考えています。時間はアプリケーションのユーザーによって与えられます。

調べてみるTaskSchedulerと、次のような例が見つかりました。

@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {
       System.out.println("Scheduled Task");
    }
}

同じタスクが定期的に何度も発生します。5秒ごとに「スケジュールされたタスク」を印刷しますが、それを1回だけ印刷したい(例:午前11時35分)

誰でもそれで私を助けることができますか?

4

2 に答える 2

1

タスクを 1 回だけ実行する場合は、日付と時刻全体 (年を含む) が含まれるように cron 式を指定して、1 回だけ一致するようにする必要があります。

于 2016-05-01T06:12:37.313 に答える
0

最も簡単な修正、おそらく練習には最適ではない

簡単な修正方法は、if ステートメントをメソッドに追加し、現在の時刻が印刷したい時刻と一致する場合にのみ印刷することです。

Java は常に最高の時刻/日付の実装を持っているわけではありませんが、Java 8 の時点で、新しいライブラリが呼び出されLocalDateTime、うまく機能します。このシンプルなソリューションには、それを使用するのが最善の策だと思います。

LocalDateTime現在の時、分、秒を取得するために使用する例を次に示します。年、月、日などにも同様の方法があります。

LocalDateTime now = LocalDateTime.now();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();

これを現在のコードと組み合わせて、必要なときにのみ print ステートメントを実行することができます。

@Configuration
@EnableAsync
@EnableScheduling
public class MyComponent {

    @Async
    @Scheduled(fixedDelay=5000)
    public void doSomething() {

        LocalDateTime now = LocalDateTime.now();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();

        if(hour == 10 &&
           minute == 34 &&
           second < 6) {

            System.out.println("Scheduled Task");

        }
 
    }

}

時間と 10、分と 34 を比較します。これらの関数は 0 から n-1 までの数値を返すためです。ここで、n は 1 日の時間数または 1 時間の分数です。秒を <6 と比較して、このジョブがいつ開始されても (5 秒ごとに実行されるため)、少なくとも毎日午前 11 時 35 分に印刷されるようにします。


これが最良の選択肢であると断言しようとしているわけではありませんが、間違いなく選択肢の 1 つです。5 秒ごとに LocalDateTime の新しいインスタンスを作成するのは理想的ではありませんが、リソースに問題がなければ問題ありません。

これは、最も美しいまたは最適に設計されたソリューションではありませんが、機能します。これは、迅速な解決策が必要で、このタスクを達成するための正しい「実践」を気にしない場合のオプションです。

于 2016-05-01T06:41:39.190 に答える