`
isoloist
  • 浏览: 62048 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring+hibernate下使用quartz出现no session的解决方法

阅读更多
    在google上找了很久没有合适的解决办法,通常的建议是把hibernate的lazy改成false或者直接写sql。为了调度而启用lazy显然是不划算的。自己写sql,那就弃用了hibernate,两种方式都让人难以接收。最后看到一提示,spring可以使用OpenSessionInViewFilter和hibernateInterceptor来扩展hibernate的session,避免了我们在web请求的过程中出现no session的问题。借鉴hibernateInterceptor的做法,扩展QuartzJobBean就可以实现在非web环境下使用Quartz而不会出现no session的问题。

     TransactionalQuartzTask的源码
public abstract class TransactionalQuartzTask extends QuartzJobBean {
	private static final Logger log = Logger
			.getLogger(TransactionalQuartzTask.class);

	// spring injected reference
	private SessionFactory sessionFactory;


	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	/**
	 * Most of this method is copied from the HibernateInterceptor.
	 */
	protected final 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 {
			executeTransactional(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());
			}
		}
	}

	/**
	 * Implementing classes, implement this method.
	 */
	protected abstract void executeTransactional(JobExecutionContext ctx)
			throws JobExecutionException;

}


    具体的job类,继承了TransactionalQuartzTask。此处需要注意的是成员变量channelRssUtil不能通过标注@Autowired来装配,否则会报错。
public class AutoBuildChannelRssTerminal extends TransactionalQuartzTask {
	private ChannelRssUtil channelRssUtil;
	
	public ChannelRssUtil getChannelRssUtil() {
		return channelRssUtil;
	}

	public void setChannelRssUtil(ChannelRssUtil channelRssUtil) {
		this.channelRssUtil = channelRssUtil;
	}

	private Logger log = Logger.getLogger(getClass());
	
	public void executeTransactional(JobExecutionContext ctx)
			throws JobExecutionException {
		channelRssUtil.buildChannelRss();
	}
}


在spring中的配置
<bean id="buildChannelRssJob" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass">
			<value>cn.com.people.tv.pvms.system.AutoBuildChannelRssTerminal
			</value>
		</property>
		<property name="jobDataAsMap">
			<map>
				<entry key="sessionFactory" value-ref="sessionFactory"></entry>
				<entry key="channelRssUtil" value-ref="channelRssUtil"></entry>
			</map>
		</property>
	</bean>
<bean id="simpleAutoBuildChannelRssTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
		<property name="jobDetail">
			<ref bean="buildChannelRssJob" />
		</property>
		<property name="repeatInterval">
			<value>300000</value>
		</property>
	</bean>



分享到:
评论
3 楼 jinbao7869 2016-03-07  
ChannelRssUtil 这个类的包找不到呀
2 楼 yanfang0814 2016-01-22  
说的个啥了这是,谁能看懂啊
1 楼 zhangjialu_vip 2014-05-30  
楼主有没有完整的配置文件说明阿

相关推荐

    Spring+hibernate+quartz 定时操作数据库

    在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    Spring 2.0 开发参考手册

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    Spring中文帮助文档

    9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...

    Spring API

    9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...

    spring-boot-reference.pdf

    41. Spring Session 42. Monitoring and Management over JMX 43. Testing 43.1. Test Scope Dependencies 43.2. Testing Spring Applications 43.3. Testing Spring Boot Applications 43.3.1. Detecting Web ...

    "优雅的SSM框架"进行完善(页面分离+nginx负载均衡+tomcat集群)

    Spring(IOC DI AOP 声明式事务处理) SpringMVC(支持Restful风格) Hibernate Validate(参数校验) Mybatis(最少配置方案) Quartz时间调度 统一的异常处理 Redis缓存(ProtoStuff序列化) Redis Sentinel主从高...

    Java面试宝典PLUS.pdf

    包括JavaSE基础(多态、异常处理、常用API、数据类型、IO操作、集合、多...Session、jsp、xml、)JavaWeb高级(filter&listener、ajax、linux、常见的前端框架)、数据库(mysql、oracal)、框架(SpringMvc、Spring、...

    JavaFan 建站系统 v3.9.16.rar

    框架:struts2 spring3 hibernate4 freemarker2.3 mysql5 quartz flazr 1.系统内置了几套模块,可自由切换,通过修改WEB-INF\classes\spring-core.xml 文件的28行,现有可选的模版有:bbs、blogBaby、blogBlack...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

Global site tag (gtag.js) - Google Analytics