spring+hibernate上使用quartz出现no session的解决办法

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

%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B+TransactionalQuartzTask的源码
public+abstract+class+TransactionalQuartzTask+extends+QuartzJobBean+{
	private+static+final+Logger+log+%3D+Logger
			.getLogger(TransactionalQuartzTask.class)%3B

	%2F%2F+spring+injected+reference
	private+SessionFactory+sessionFactory%3B


	public+SessionFactory+getSessionFactory()+{
		return+sessionFactory%3B
	}

	public+void+setSessionFactory(SessionFactory+sessionFactory)+{
		this.sessionFactory+%3D+sessionFactory%3B
	}

	%2F**
	+*+Most+of+this+method+is+copied+from+the+HibernateInterceptor.
	+*%2F
	protected+final+void+executeInternal(JobExecutionContext+ctx)
			throws+JobExecutionException+{
		Session+session+%3D+SessionFactoryUtils.getSession(sessionFactory%2C+true)%3B
		boolean+existingTransaction+%3D+SessionFactoryUtils
				.isSessionTransactional(session%2C+getSessionFactory())%3B
		if+(existingTransaction)+{
			log.info("Found+thread-bound+Session+for+TransactionalQuartzTask")%3B
		}+else+{
			TransactionSynchronizationManager.bindResource(getSessionFactory()%2C
					new+SessionHolder(session))%3B
		}

		try+{
			executeTransactional(ctx)%3B
		}+catch+(HibernateException+ex)+{
			ex.printStackTrace()%3B
			throw+ex%3B
		}+finally+{
			if+(existingTransaction)+{
				log.debug("Not+closing+pre-bound+Hibernate+Session+after+TransactionalQuartzTask")%3B
			}+else+{
				TransactionSynchronizationManager
						.unbindResource(getSessionFactory())%3B
				SessionFactoryUtils
						.releaseSession(session%2C+getSessionFactory())%3B
			}
		}
	}

	%2F**
	+*+Implementing+classes%2C+implement+this+method.
	+*%2F
	protected+abstract+void+executeTransactional(JobExecutionContext+ctx)
			throws+JobExecutionException%3B

}
<%2Fpre>
+
%26nbsp%3B%26nbsp%3B%26nbsp%3B+具体的job类,继承了TransactionalQuartzTask。此处需要注意的是成员变量channelRssUtil不能通过标注%40Autowired来装配,否则会报错。
public+class+AutoBuildChannelRssTerminal+extends+TransactionalQuartzTask+{
	private+ChannelRssUtil+channelRssUtil%3B
	
	public+ChannelRssUtil+getChannelRssUtil()+{
		return+channelRssUtil%3B
	}

	public+void+setChannelRssUtil(ChannelRssUtil+channelRssUtil)+{
		this.channelRssUtil+%3D+channelRssUtil%3B
	}

	private+Logger+log+%3D+Logger.getLogger(getClass())%3B
	
	public+void+executeTransactional(JobExecutionContext+ctx)
			throws+JobExecutionException+{
		channelRssUtil.buildChannelRss()%3B
	}
}
<%2Fpre>

在spring中的配置
%26lt%3Bbean+id%3D"buildChannelRssJob"+class%3D"org.springframework.scheduling.quartz.JobDetailBean"%26gt%3B
		%26lt%3Bproperty+name%3D"jobClass"%26gt%3B
			%26lt%3Bvalue%26gt%3Bcn.com.people.tv.pvms.system.AutoBuildChannelRssTerminal
			%26lt%3B%2Fvalue%26gt%3B
		%26lt%3B%2Fproperty%26gt%3B
		%26lt%3Bproperty+name%3D"jobDataAsMap"%26gt%3B
			%26lt%3Bmap%26gt%3B
				%26lt%3Bentry+key%3D"sessionFactory"+value-ref%3D"sessionFactory"%26gt%3B%26lt%3B%2Fentry%26gt%3B
				%26lt%3Bentry+key%3D"channelRssUtil"+value-ref%3D"channelRssUtil"%26gt%3B%26lt%3B%2Fentry%26gt%3B
			%26lt%3B%2Fmap%26gt%3B
		%26lt%3B%2Fproperty%26gt%3B
	%26lt%3B%2Fbean%26gt%3B
%26lt%3Bbean+id%3D"simpleAutoBuildChannelRssTrigger"+class%3D"org.springframework.scheduling.quartz.SimpleTriggerBean"%26gt%3B
		%26lt%3Bproperty+name%3D"jobDetail"%26gt%3B
			%26lt%3Bref+bean%3D"buildChannelRssJob"+%2F%26gt%3B
		%26lt%3B%2Fproperty%26gt%3B
		%26lt%3Bproperty+name%3D"repeatInterval"%26gt%3B
			%26lt%3Bvalue%26gt%3B300000%26lt%3B%2Fvalue%26gt%3B
		%26lt%3B%2Fproperty%26gt%3B
	%26lt%3B%2Fbean%26gt%3B
<%2Fpre>


<%2Fdiv>

来自:http%3A%2F%2Fwww.verydemo.com%2Fdemo_c146_i19984.html<%2Fa><%2Fb>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值