我使用石英,Spring和Hibernate作为JPA提供程序。数据库是Oracle。Quartz with Spring not commiting
我有一个方法,它将文件写入文件系统并用细节更新数据库。 这种方法可以称为有两种方式:
- 使用Web服务
- 或者,作为计划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管理的事务:
我已经为建立石英。
问题是石英调度程序调用此方法时,文件被创建但数据库未更新(应更新两个表和一个表插入)。
我也启用了hibernate show_SQL,但是在调度程序的情况下,没有更新\ insert语句正在被记录。
虽然此方法由Web服务请求调用时可以正常工作。日志还显示update \ insert语句。
更新1
要总结一下我的问题,这就是我想实现:
- 创建雇员表的新纪录。
- 将job_id保存在job_store(石英)中。
- 当触发器被触发时,石英返回employee_id
- 基于此密钥检索(加载)员工记录。
- 员工发送一封电子邮件
- 更新通知与地位“已发送”(INSERT语句)
最后,我希望所有的表进行更新。
当石英触发作业时,所有工作除了第6点。 代码正确,因为当我使用Web服务调用调用此方法时,表正在更新。
更新2
我更新的代码使用
<prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>
但这也doest'nt帮助。
请帮忙。谢谢。 阿迪
谢谢,但作业正在从调度程序正确地从数据库检索。 JobMap包含'User'表的primayKey,并且在使用此密钥调用加载后填充User类。这是'合并',不起作用。这就是为什么我说我无法在日志中看到“插入”SQL。我可以看到所有正确的'select'语句。 – adi
我同意亚伦,但如果你仍然想使用石英确保Entitymanager正确传递给石英工作。 – ayengin