6

データベースからレコードのチャンクを引き出してキューに入れ続けるスレッドを生成しています。このスレッドは、サーバーの負荷で開始されます。このスレはずっと活性化してほしい。データベースにレコードがない場合は、しばらく待ってからもう一度確認してください。春のタスクスケジューラを使用してこれをスケジュールすることを考えていましたが、タスクを一度だけ開始したいので、それが正しいかどうかはわかりません。これをSpringで実装する良い方法は何ですか?

また、(エラーまたは例外条件が原因で) スレッドがダウンした場合は、しばらくしてから再インスタンス化する必要があることを境界チェックする必要があります。

スレッド通信メソッドを使用して Java でこれをすべて行うことができますが、そのようなシナリオで Spring または Java で利用できるものがあるかどうかを試すだけです。

提案やポインタが役立ちます。

4

5 に答える 5

6

@Scheduledアノテーションを使用してジョブを実行できます。まず、 で注釈が付けられたメソッドでクラスを作成し@Scheduledます。

クラス

public class GitHubJob {

   @Scheduled(fixedDelay = 604800000)
   public void perform() {
      //do Something
    }
}

次に、このクラスを構成ファイルに登録します。

spring-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<tx:annotation-driven/>
<task:annotation-driven scheduler="myScheduler"/>

<task:scheduler id="myScheduler" pool-size="10"/>
<bean id="gitHubJob" class="org.tothought.spring.jobs.GitHubJob"/>

</beans>

スケジューリングの詳細については、Spring Docsを参照してください。

于 2013-03-20T00:50:57.373 に答える
0

Quartz スケジューラーを試してみることができます。http://quartz-scheduler.org/ これにより、タスク実行間の時間を指定できます。クラスが以前に実行されたかどうかを示すフラグ (ブール値) を設定して、「初回」のみ実行したいコードの重複を避けることができます。

于 2013-03-19T23:04:31.577 に答える
0

あなたの要件は、クォーツまたはスプリングスケジューリングフレームワークが非常によくサポートする通常のシナリオだと思います。しかし、それを実装するための特別なアプローチを作成したいと考えています。私の提案は、それを単純でばかげたものにすることです。spring scheudling は、ワーカー スレッドを常に実行するのではなく、プールすることで活用します。

統計の時点では、worker クラスのログを確認するのは簡単です。Web コンソールで統計を表示する場合は、ワーカーのログをデータベースに記録する必要があります。普通に簡単に作れると思います。

于 2013-03-20T01:09:38.730 に答える
0

Spring は、タスクのスケジューリングをすぐにサポートします。 これは、 Spring の最新の 3.2.x バージョンのドキュメントですが、使用しているバージョンのドキュメントを確認してください。タスクのスケジューリングに内部で Quartz を使用しているようです。

于 2013-03-19T23:15:29.403 に答える