2013-03-19 1 views
6

私は、データベースからレコードのチャンクを引き出し、それらをキューに入れ続けるスレッドを生成しています。このスレッドはサーバーの負荷で開始されます。私はこのスレッドを常にアクティブにしたい。データベースにレコードがない場合、私はそれがしばらくして待ってから再度チェックしたいと思っています。私は春のタスクスケジューラを使用してこれをスケジュールすることを考えていましたが、それが正しいかどうかはわかりません。なぜなら、自分のタスクを一度しか開始したくないからです。これをSpringで実装する良い方法は何でしょうか?Spring/Javaのスケジューリングタスク

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

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

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

答えて

0

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

0

Springはスケジューリングタスクをサポートしています。 Here are for the docs最新の3.2.xバージョンの春には、使用しているバージョンのドキュメントを確認してください。スケジューリング作業のためにQuartzをフードの下で使用するように見えます。

+0

私はそれを通過しましたが、特定の時間の後に一度だけ実行されることは望ましくありません。私の仕事がいかにダウンしたらそれを復活させるかというシナリオを扱う必要があるだけです。 – Ashu

6

@Scheduled注釈を使用してジョブを実行できます。最初に@Scheduledと注釈されたメソッドを持つクラスを作成します。

クラス

public class GitHubJob { 

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

次に設定ファイルにこのクラスを登録します。

、ばねのcontext.xmlスケジューリング訪問Spring Docsの詳細については

<?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> 

0

あなたの要件は、石英またはスプリングスケジューリングフレームワークが非常にうまくサポートする正規のシナリオですと思います。しかし、あなたはそれを実装するための特定のアプローチを作りたいと思っています。私の提案は、それを単純で愚かに保つことです。春のスケジューリングは、常時実行するのではなく、プールすることでワーカースレッドを利用します。

統計では、ワーカークラスのログを確認するのは簡単です。 Webコンソールで統計情報を表示するには、ワーカーのログインをデータベースに記録する必要があります。私はあなたが通常の方法で簡単にそれを作ることができると確信しています。

4
@Scheduled(fixedDelay=3600000) 
private void refreshValues() { 
    [...] 
} 

これは、1時間に1回タスクを実行します。無効にして引数を受け入れる必要はありません。 SpringのJava設定を使用する場合は、@Configurationクラスのいずれかにアノテーション@EnableSchedulingを追加する必要があります。