Quartz 事务管理

问题背景:  
项目中使用到了spring来管理bean,事务,以及hibernate的session。同时又用到quartz,执行几个任务如:csv文件解析,将文件数据保存到数据库以及调用ptv服务的geocoding等。在没有使用spring的时候,quartz中job用到的service都是手动new出来的,所以不会有问题,因为加了spring,所以需要spring来生成bean,同时保证事务正常工作。因为hibernate底层调用的是facotry.getCurrentSession()方法获得session,所以如果不加事务,那么就会报错。
问题描述:  
如何在生成的job中通过spring获得service,并添加事务管理? 
解决方法:  
1. 自定义一个Listenner类,继承QuartzInitializerListener类,并把listener配置到web.xml中。(这个原理和spring启动的时候配置的ContextLoaderListener是一个道理,都是实现了ServletContextListener接口。所以在启动的时候可以获得servletContext). 
(详细介绍可以参考:http://www.xuebuyuan.com/2041126.html) 
2. 重写Listenner类的contextInitialized方法,并把ServletContext放到SchedulerContext中。(SchedulerContext可以看做类似ServletContext的类,多个sheduler共享同一个SchedulerContext) 

3. 在job类中获得servletContext,再通过servletContext获得webApplicationContext.然后获得transactionmanager添加编程式事务,在业务代码中getBean获得service.


  1. public class MyQuartZInitializerListener extends QuartzInitializerListener {  
  2.     @Override  
  3.     public void contextInitialized(ServletContextEvent sce) {  
  4.         // TODO Auto-generated method stub  
  5.         super.contextInitialized(sce);  
  6.         ServletContext sc = sce.getServletContext();  
  7.         StdSchedulerFactory fac = (StdSchedulerFactory) sc.getAttribute(QUARTZ_FACTORY_KEY);  
  8.         try {  
  9.             fac.getScheduler().getContext().put("sct", sc);  
  10.         } catch (SchedulerException e) {  
  11.             // TODO Auto-generated catch block  
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15. }  
 

web.xml 


  1. <listener>  
  2.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3. </listener>  
  4. <listener>  
  5.         <listener-class>  
  6.            de.haiberg.adman.portal.util.VmapQuartZInitializerListener  
  7.         </listener-class>  
  8.     </listener>  
  9.   
  10. <context-param>  
  11.     <param-name>contextConfigLocation</param-name>  
  12.     <param-value>  
  13.         WEB-INF/springdef/spring-datasource.xml  
  14.     </param-value>  
  15. </context-param>  

  1. <!-- Hibernate Tranaction Manager -->  
  2. <bean id="transactionManager"  
  3.     class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  4.     <property name="sessionFactory" ref="sessionFactory" />  
  5. </bean>  

  1. @Service  
  2. public class MyJob implements StatefulJob {  
  3.   
  4.     private static Logger log = Logger.getLogger(MyJob.class);  
  5.   
  6.     XDaoImpl xDaoImpl;  
  7.   
  8.     public void execute(JobExecutionContext jobContext) throws JobExecutionException {  
  9.   
  10.         ServletContext sct = null;  
  11.         try {  
  12.             sct = (ServletContext) jobContext.getScheduler().getContext().get("sct");  
  13.         } catch (SchedulerException e) {  
  14.             // TODO Auto-generated catch block  
  15.             e.printStackTrace();  
  16.         }  
  17.         WebApplicationContext webctx = (WebApplicationContext) sct  
  18.                 .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);  
  19.         xDaoImpl = webctx.getBean("xDaoImpl", XDaoImpl.class);  
  20.   
  21.         // add transaction manually  
  22.         HibernateTransactionManager transactionManager = (HibernateTransactionManager) webctx  
  23.                 .getBean("transactionManager");  
  24.         DefaultTransactionDefinition def = new DefaultTransactionDefinition();  
  25.         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);  
  26.         TransactionStatus status = transactionManager.getTransaction(def);  
  27.   
  28.         // business code  
  29.         //xxxxxxxxxxxxxxxxxxxx  
  30.         //xxxxxxxxxxxxxxxxxxxx  
  31.         //xxxxxxxxxxxxxxxxxxxx  
  32.   
  33.   
  34.         transactionManager.commit(status);  
  35.         } catch (Exception e) {  
  36.             transactionManager.rollback(status);  
  37.             log.error("Error[xxxxxx}]: " + e, e);  
  38.         }   
  39.   
  40.     }  
  41.   
  42. }  

猜你喜欢

转载自blog.csdn.net/qq_35165632/article/details/75490821
今日推荐