5

我正在使用石英、Spring 和 Hibernate 作为 JPA 提供程序。数据库是甲骨文。

我有一种将文件写入文件系统并使用详细信息更新数据库的方法。该方法可以通过两种方式调用:

  1. 使用网络服务
  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>

此方法使用弹簧托管事务。

问题是当石英调度程序调用此方法时,文件被创建但数据库没有更新(应该有两个表更新和一个表插入)。

我也启用了hibernate show_SQL,但是在调度程序的情况下,没有更新\插入语句被记录。

尽管当 Web 服务请求调用此方法时,这可以正常工作。日志也显示 update\insert 语句。

更新 1

总结一下我的问题,这就是我想要实现的目标:

  1. 在员工表中创建一条新记录。
  2. 将employee_id 保存在job_store(石英)中。
  3. 当触发触发时,quartz 会返回employee_id
  4. 根据此键检索(加载)员工记录。
  5. 向员工发送电子邮件
  6. 更新状态为“已发送”的通知(插入语句)

最后,我希望所有的表都会更新。

当石英触发工作时,除了第 6 点外,一切都在工作。代码是正确的,因为当我使用 Web 服务调用调用此方法时,表正在更新。

更新 2

我更新了要使用的代码

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

但这也无济于事。

请帮忙。谢谢。阿迪

4

3 回答 3

3

Quartz 在它自己的上下文中运行,即使是由 Spring 便利方法启动的,所以实际上你最终不会得到整个 Spring 应用程序上下文,除非你明确JobDataMap地传入 bean(参见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 回答
1

这里有两点要检查:

  • 数据源必须是非 XA 数据源。如果您正在使用来自 Java EE 应用程序服务器的连接池,那么您很有可能拥有 XA 数据源。将该数据源配置为非 XA(如果您的应用程序设置和服务器允许)或创建第二个非 XA 数据源并将其传递到nonTransactionalDataSource属性中。如果您使用该属性,有一个小问题nonTransactionalDataSource- 请记住保持dataSource属性设置。您也无法在nonTransactionalDataSource不设置 (transactional)的情况下定义 a dataSource

  • 确保您的代码确实在 Spring 事务中运行。使用. schedulerContextAsMap_ SchedulerFactoryBean如果您运行带有注释的代码,@Transactional则需要自动装配。如果您对该 bean 的实例化进行硬编码,Spring 将无法应用@Transactional注释并默默地忽略它。

此外,删除该org.quartz.jobStore.class属性。在任何情况下SchedulerFactoryBean都会覆盖该设置。它放了一个LocalDataSourceJobStore,如果工厂的新版本决定放别的东西,它可能会变得混乱。

最后但并非最不重要的一点是,我想知道您是否可能忽略了某处记录的任何异常?确保您正在监视来自应用程序服务器的所有 Spring 日志消息和所有错误消息。

于 2013-07-05T10:47:18.157 回答
-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 回答