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的源码
++++%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>