Spring+hibernate+quartz 通过sessionFactory定时操作数据库

来源:互联网 发布:淘宝店铺能叫旗舰店吗 编辑:程序博客网 时间:2024/05/16 07:19

spring+hibernate框架中要做一个定时任务,需要查询或是更新数据库内容,直接配置sessionFactory是会报错的,会出现no session的问题、或是transaction non-bound等问题。这里直接给一个实现的示例吧!下载链接  

主要是建立了模板模式的抽象类AutoQuartzTask,继承至QuartzJobBean类;在这个类中声明sessionFactory变量。

<span style="font-family: Arial, Helvetica, sans-serif;">package com.quartz.task;</span>
import org.apache.log4j.Logger;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.orm.hibernate3.SessionFactoryUtils;import org.springframework.orm.hibernate3.SessionHolder;import org.springframework.scheduling.quartz.QuartzJobBean;import org.springframework.transaction.support.TransactionSynchronizationManager;public abstract class AutoQuartzTask extends QuartzJobBean {private SessionFactory sessionFactory;private static final Logger log=Logger.getLogger(AutoQuartzTask.class);public SessionFactory getSessionFactory() {return sessionFactory;}public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}@Overrideprotected void executeInternal(JobExecutionContext ctx)throws JobExecutionException {        Session session = SessionFactoryUtils.getSession(sessionFactory, true);          boolean existingTransaction = SessionFactoryUtils                  .isSessionTransactional(session, getSessionFactory());          if (existingTransaction) {              log.info("Found thread-bound Session for TransactionalQuartzTask");          } else {              TransactionSynchronizationManager.bindResource(getSessionFactory(),                      new SessionHolder(session));          }            try {          executeTask(ctx);          } catch (HibernateException ex) {              ex.printStackTrace();              throw ex;          } finally {              if (existingTransaction) {                  log.debug("Not closing pre-bound Hibernate Session after TransactionalQuartzTask");              } else {                  TransactionSynchronizationManager                          .unbindResource(getSessionFactory());                  SessionFactoryUtils                          .releaseSession(session, getSessionFactory());              }          }  }public abstract void executeTask(JobExecutionContext ctx) ;}
真正的业务操作就放在AutoQuartzTask的子类中实现了

package com.quartz.task;import java.util.List;import org.hibernate.Query;import org.quartz.JobExecutionContext;import com.quartz.model.User;@SuppressWarnings("unchecked")public class QuartzSession extends AutoQuartzTask {private FirstQuartz firstQuartz;//这是一个普通的类,不操作数据库,(可去掉)@Overridepublic void executeTask(JobExecutionContext ctx) {firstQuartz.doTestJob();Query query=getSessionFactory().getCurrentSession().createQuery("from User");List<User> list = query.list();for (User user : list) {System.out.println(user.toString());}}public FirstQuartz getFirstQuartz() {return firstQuartz;}public void setFirstQuartz(FirstQuartz firstQuartz) {this.firstQuartz = firstQuartz;}}
spring的配置:

<?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:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><bean id="firstQuartz" class="com.quartz.task.FirstQuartz"></bean><bean id="buildSessionJob" class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass"><value>com.quartz.task.QuartzSession</value></property><property name="jobDataAsMap"><map><entry key="sessionFactory" value-ref="sessionFactory"></entry><entry key="firstQuartz" value-ref="firstQuartz"></entry></map></property></bean><bean id="simpleAutoBuild" class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail"><ref bean="buildSessionJob" /></property><property name="repeatInterval"><value>5000</value></property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="simpleAutoBuild" /></list></property></bean></beans>

详细的介绍,可查看以下连接:

http://john521.iteye.com/blog/1294149

http://kevin19900306.iteye.com/blog/1397744

http://isoloist.iteye.com/blog/785033

示例代码


0 0