在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>
分享到:
相关推荐
在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉
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来...
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. ...
9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...
9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 ...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
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 ...
Spring(IOC DI AOP 声明式事务处理) SpringMVC(支持Restful风格) Hibernate Validate(参数校验) Mybatis(最少配置方案) Quartz时间调度 统一的异常处理 Redis缓存(ProtoStuff序列化) Redis Sentinel主从高...
包括JavaSE基础(多态、异常处理、常用API、数据类型、IO操作、集合、多...Session、jsp、xml、)JavaWeb高级(filter&listener、ajax、linux、常见的前端框架)、数据库(mysql、oracal)、框架(SpringMvc、Spring、...
框架:struts2 spring3 hibernate4 freemarker2.3 mysql5 quartz flazr 1.系统内置了几套模块,可自由切换,通过修改WEB-INF\classes\spring-core.xml 文件的28行,现有可选的模版有:bbs、blogBaby、blogBlack...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................