1

SpringFrameworkを使用してTomcatで実行されているWebアプリケーションがあります。定期的な操作のためにいくつかのスケジュールされたジョブを追加する必要があります。このためにQuartzSchedulerに出くわし、SpringでQuartzを使用してジョブを構成するためのチュートリアルに従い、ジョブをスケジュールして期待どおりに実行しました。

そのため、アプリケーションの起動時にスケジュールされるタスクがいくつかあります。ここで、ユーザーが手動でジョブを実行し、ジョブのトリガーを変更する必要がありますが、これらの変更はデータベースに保持される必要があります。そのため、アプリケーションが起動すると、永続化されたタスクが読み取られ、存在しない場合は、Spring記述子ファイルからデフォルトのタスクが読み込まれます。

わかりやすくするために、次の例のbeans.xmlファイルを使用していると仮定します。

<bean id="processToExecute" class="com.mycompany.ProcessToExecute" />

<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.mycompany.ProcessToExecuteJob" />
    <property name="jobDataAsMap">
        <map>
            <entry key="processToExecute" value-ref="processToExecute" />
        </map>
    </property>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="processToExecuteJob" />
    <property name="cronExpression" value="0/5 * * * * ?" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="jobDetails">
        <list>
            <ref bean="processToExecuteJob" />
        </list>
    </property>
    <property name="triggers">
        <list>
            <ref bean="simpleTrigger" />
        </list>
    </property>
</bean>

したがって、デフォルトのタスクには引き続きBeanのような構成を使用しますが、すでにスケジュールされている場合はデータベースからそれらをロードするオプションを使用します。

ここでのクォーツは必須ではありません。Springを使用してクォーツを実現する簡単な方法を誰かが知っている場合は、@Scheduledそれも役立つ可能性があります。

御時間ありがとうございます。

4

1 に答える 1

5

私は最終的に望ましい動作を得るのに苦労しました。最初の実行時に、アプリケーションはタスクをスケジュールし、データベースに永続化します。これは、 SchedulerFactoryBeanオブジェクトでdataSourceプロパティを指定するだけで実行できます。

新しく作成されたジョブが古いジョブを上書きするため、スケジュールされたタスクに対して実行された変更はシステムの再起動時に失われるため、現時点では、ジョブを永続化しても意味がありません。したがって、動作はまったく同じです。

新しいジョブが古いジョブを上書きしないようにするには、SchedulerFactoryBeanオブジェクトでoverwriteExistingJobsプロパティをfalseに設定するだけです。それと同じくらい簡単です。新しいジョブはデータベースに既に存在するため、無視されます。

上記の構成の完全な例を次に示します。

<!-- Jobs -->
<bean name="processToExecuteJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- JobDetailBean on Quartz 1.X -->
    <property name="jobClass" value="com.mycompany.quartz.ProcessToExecuteJob" />
    <property name="name" value="processToExecuteJob"/>
    <property name="group" value="default"/>
</bean>


<!-- Triggers -->
<bean id="demoTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- CronTriggerBean on Quartz 1.X -->
    <property name="jobDetail" ref="processToExecuteJob" />
    <property name="cronExpression" value="0/15 * * * * ?" />
</bean>


<!-- Database -->
<jee:jndi-lookup id="quartzDataSource" jndi-name="jdbc/imsQuartzDS" resource-ref="true" />


<!-- Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="dataSource" ref="quartzDataSource"/>
    <property name="overwriteExistingJobs" value="false"/>
    <property name="triggers">
        <list>
            <ref bean="demoTrigger" />
        </list>
    </property>
</bean>
于 2013-02-28T18:15:55.530 に答える