5

JPAプロバイダーとしてHibernateを備えたQuartz、Springを使用しています。データベースはオラクルです。

ファイルをファイルシステムに書き込み、データベースを詳細で更新する方法があります。このメソッドは、次の 2 つの方法で呼び出すことができます。

  1. Web サービスの使用
  2. または、スケジュールされた quatrz ジョブとして。

私はクォーツを次のように設定しました:

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" scope="singleton">
        <property name="autoStartup" value="true"/>
        <property name="waitForJobsToCompleteOnShutdown" value="true"/>
        <property name="overwriteExistingJobs" value="true"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.scheduler.instanceName">FileScheduler</prop>
                <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
                <prop key="org.quartz.jobStore.misfireThreshold">6000</prop>
                <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                <prop key="org.quartz.jobStore.driverDelegateClass">${driverDelegateClass}</prop>
                <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
                <prop key="org.quartz.jobStore.isClustered">true</prop>
                <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
                <prop key="org.quartz.threadPool.threadCount">5</prop>
                <prop key="org.quartz.threadPool.threadPriority">5</prop>
            </props>
        </property>
    </bean>

このメソッドは、Spring マネージド トランザクションを使用しています。

問題は、このメソッドが Quartz スケジューラによって呼び出されたときに、ファイルが作成されてもデータベースが更新されないことです (2 つのテーブルが更新され、1 つのテーブルが挿入されるはずです)。

休止状態の show_SQL も有効にしましたが、スケジューラの場合、update\insert ステートメントはログに記録されません。

ただし、このメソッドが Web サービス要求によって呼び出された場合、これは正常に機能します。ログには update\insert ステートメントも表示されます。

更新 1

私の問題を要約すると、これは私が達成しようとしていることです:

  1. 従業員テーブルに新しいレコードを作成します。
  2. employee_id を job_store (quartz) に保存します。
  3. トリガーが起動されると、クォーツは employee_id を返します
  4. このキーに基づいて従業員レコードを取得 (ロード) します。
  5. 従業員にメールを送信
  6. ステータスが「送信済み」の通知を更新します(ステートメントを挿入)

最後に、すべてのテーブルが更新されることを期待しています。

Quartz がジョブをトリガーすると、ポイント 6 を除いてすべてが機能します。Web サービス呼び出しを使用してこのメ​​ソッドを呼び出すと、テーブルが更新されるため、コードは正しいです。

更新 2

使用するコードを更新しました

<prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>

しかし、これも役に立ちません。

助けてください。ありがとう。アディ

4

3 に答える 3

3

Quartz は、Spring の便利なメソッドによって開始された場合でも、独自のコンテキストで実行されるためJobDataMap、Bean を明示的に渡さない限り、Spring アプリケーションのコンテキスト全体を実際に取得することはありません ( http://forum.springsource. org/showthread.php?76974-Why-autowired-doesn-t-work-on-a-QuartzJobBean-bean )。そのため、Spring で管理された Bean を渡すことができますが、Quartz の全機能を必要としない場合、すべてが面倒に思えます。

スケジューリングのニーズがそれほど複雑でない場合は、@ScheduledSpring アノテーション (こちらを参照) の使用を検討することをお勧めします。これにより、メソッド呼び出し全体が Spring コンテキストでネイティブに発生し、トランザクションは Web サービスでの動作と同じように機能します。電話。

于 2012-05-29T16:02:25.020 に答える
-4

@Transactionalアノテーションを試してください。( http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/annotation/Transactional.htmlを参照)

于 2012-06-13T13:04:50.317 に答える