在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 MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...
在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉
在实际项目中,通常会采用DAO(数据访问对象)设计模式,DAO接口在Spring中定义,具体实现中使用Hibernate的Session进行数据库操作。服务层(Service层)则调用DAO接口,处理业务逻辑,最后由Struts2的Action将结果...
Spring还集成了其他框架,如MyBatis、Quartz等,形成了一个全面的企业级应用解决方案。 在这个"毕业设计struts+hibernate+spring添删改查示例源码"中,我们可以期待看到如何将这三个框架结合使用,完成对数据的添加...
SpringMVC + Spring3.1.1 + Hibernate4.1.0 是一个经典的Java Web开发技术栈,用于构建高效、可扩展的企业级应用程序。在这个组合中,SpringMVC作为前端控制器处理HTTP请求,Spring框架提供了服务层管理和依赖注入,...
例如,可以通过添加更多的实体类、Action和Service来增加新的功能模块,或者使用Spring Security进行权限管理,使用Quartz进行任务调度等。 总的来说,这个项目展示了SSH框架结合注解的使用,对于理解Java Web开发...
然后,定义一个定时任务类,这个类中包含执行定时任务的方法,并且这个方法内部可以使用Hibernate的Session来执行数据库操作。 例如,你可以使用Spring的`@Scheduled`注解来定义一个定时任务: ```java import org...
这包括Spring的相关jar(如spring-context、spring-webmvc、spring-tx等),Hibernate的核心jar以及定时任务库的jar(如quartz.jar)。然后,在Spring的配置文件中,我们需要配置Hibernate的数据源、SessionFactory...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自解决应用程序的不同问题,并通过整合可以构建出高效、可维护的大型企业级应用。在本项目"Struts2_Hibernate_Spring"中,我们将深入探讨这三个框架...
例如,Spring Modules的Hibernate模块可能包含自动管理SessionFactory和Session的配置,以及便捷的数据访问抽象,使得在Spring应用中使用Hibernate变得更加简单。 此外,Spring Modules还包含了对一些其他组件的...
本项目"Spring4.2_Struts2_Hibernate4.3框架整合"旨在演示如何将Spring 4.2、Struts2和Hibernate 4.3这三大流行Java Web框架结合使用。这些框架各自在应用开发中扮演着重要的角色: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来...
- **SessionFactory配置**:使用`LocalSessionFactoryBean`创建Hibernate的session工厂,配置数据源和映射文件。 - **AOP代理**:启用`<aop:aspectj-autoproxy>`,支持@AspectJ注解的AOP代理。 在整合Spring MVC...
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进行数据访问 ...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架,它整合了三个流行的开源组件,用于构建高效、可维护且易于扩展的企业级应用程序。下面将详细介绍SSH框架的各个组成部分及其工作原理。 1. ...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
1. 异步操作:通过集成Quartz或Spring的TaskExecutor,可以实现Hibernate操作的异步化,提高系统并发性能。 2. 批量操作:批量插入、更新和删除,例如使用bulk update和bulk delete语句,减少数据库交互次数,提升...