`

在Spring的项目中独立使用quartz, 解决 job获得service,以及事务问题 (spring不管理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.
代码

public class MyQuartZInitializerListener extends QuartzInitializerListener {
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		super.contextInitialized(sce);
		ServletContext sc = sce.getServletContext();
		StdSchedulerFactory fac = (StdSchedulerFactory) sc.getAttribute(QUARTZ_FACTORY_KEY);
		try {
			fac.getScheduler().getContext().put("sct", sc);
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

web.xml

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener>
         <listener-class>
            de.haiberg.adman.portal.util.VmapQuartZInitializerListener
         </listener-class>
     </listener>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			WEB-INF/springdef/spring-datasource.xml
		</param-value>
	</context-param>



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


@Service
public class MyJob implements StatefulJob {

	private static Logger log = Logger.getLogger(MyJob.class);

	XDaoImpl xDaoImpl;

	public void execute(JobExecutionContext jobContext) throws JobExecutionException {

		ServletContext sct = null;
		try {
			sct = (ServletContext) jobContext.getScheduler().getContext().get("sct");
		} catch (SchedulerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		WebApplicationContext webctx = (WebApplicationContext) sct
				.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
		xDaoImpl = webctx.getBean("xDaoImpl", XDaoImpl.class);

		// add transaction manually
		HibernateTransactionManager transactionManager = (HibernateTransactionManager) webctx
				.getBean("transactionManager");
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
		TransactionStatus status = transactionManager.getTransaction(def);

		// business code
	    //xxxxxxxxxxxxxxxxxxxx
	    //xxxxxxxxxxxxxxxxxxxx
        //xxxxxxxxxxxxxxxxxxxx


		transactionManager.commit(status);
		} catch (Exception e) {
			transactionManager.rollback(status);
			log.error("Error[xxxxxx}]: " + e, e);
		} 

	}

}



后面看到了这篇文章http://blog.csdn.net/mmm123lmj/article/details/6741994,发现spring集成quartz解决这个问题的方法是一样的。
分享到:
评论

相关推荐

    SpringQuartz的使用文档

    SpringQuartz是一个强大的任务调度框架,它在Java应用程序中用于自动化执行特定任务,如定时生成文件、统计数据或执行后台清理工作。Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时...

    利用spring的ApplicationContext在程序中唤醒quartz的job

    本篇文章将探讨如何结合Spring的ApplicationContext和Quartz,实现在程序中动态唤醒和管理Quartz的Job。 首先,`AppService.java`很可能包含了一个服务类,该类可能负责与Quartz相关的业务逻辑,例如创建、更新或...

    ssm-springMVC-整合Quartz(解决了无法注入service问题)-项目示例

    当需要在Quartz作业中调用由Spring管理的服务时,会出现依赖注入的问题,因为Quartz的工作线程与Spring的ApplicationContext不一致。 为了解决这个问题,我们需要以下步骤: 1. **配置Spring上下文**:首先,在...

    spring的quartz使用实例

    Spring整合Quartz是一款常见的任务调度解决方案,它允许开发者在应用程序中安排定时任务的执行。Quartz是一个开源的作业调度框架,而Spring通过提供一个简洁的API使得与Quartz的集成变得简单。以下是对Spring整合...

    spring2与quartz在Web整合

    Spring 2 和 Quartz 是两个在 Java Web 开发中非常重要的框架。Spring 是一个全面的开源应用框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的数据访问和事务管理功能。Quartz,则是一个功能强大的作业...

    spring和quartz的定时器的启动和停止例子

    Spring提供了一种集成Quartz的方式,使得我们可以方便地在Spring应用中管理和执行定时任务。本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大...

    spring+quartz demo

    Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...

    Java_Spring与Quartz的整合

    - 如果Job需要在数据库事务中执行,可以利用Spring的事务管理功能,确保Job在失败时能回滚。 通过以上步骤,我们可以实现Spring和Quartz的无缝整合,构建出一个强大且灵活的定时任务系统。注意,实际项目中还需要...

    关于spring中quartz的配置

    在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...

    quartz和spring-quartz

    Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...

    spring java 定时器 执行两次 quartz

    下面将详细介绍如何使用Spring集成Quartz,以及解决定时任务重复执行的问题。 首先,让我们了解Spring如何配置Quartz。在Spring应用中添加Quartz支持,你需要在`pom.xml`或`build.gradle`文件中引入Quartz的依赖,...

    spring整合quartz两种方式以及spring自带定时任务使用

    在本文中,我们将探讨Spring与Quartz的两种整合方式以及Spring自身提供的定时任务功能。 ### Spring整合Quartz的方式 #### 1. 配置驱动的方式 这种方式主要是通过XML配置来创建和管理Quartz的Scheduler实例。首先...

    spring之定时任务实现(spring-task和quartz等不同方式)

    配置Quartz通常需要在Spring配置文件中声明`SchedulerFactoryBean`,并设置相关的bean。例如: ```xml &lt;bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; &lt;!-- 这里...

    完美解决多应用服务器负载均衡环境下spring quartz同一定时任务重复执行问题

    综上所述,解决Spring Quartz在负载均衡环境下的重复执行问题,需要综合运用Quartz的集群特性、数据库Job Store、公平调度以及应用层面的设计策略。通过这些方法,可以确保在多服务器环境中,定时任务的执行有序且...

    Spring4.X+Quartz2.X

    在标题"Spring4.X+Quartz2.X"中,我们关注的是如何将这两个框架集成到一个项目中,实现基于Spring的定时任务管理。Spring4.X版本引入了一些新特性,比如对Java 8的全面支持、WebSocket支持以及对RESTful服务的改进,...

    spring+quartz使用jar包

    在实际项目中,结合Spring和Quartz,开发者可以轻松地创建和管理复杂的时间驱动任务,提高应用的自动化程度和效率。正确配置和使用这两个框架,能够为企业的后台服务带来极大的灵活性和可维护性。

    Quartz2.2.1基于Spring注解方式配置Quartz

    本文将详细介绍如何在Spring环境中使用注解方式配置Quartz。 1. **引入依赖** 在项目中,你需要引入Quartz和Spring的相应依赖。在Maven的pom.xml文件中,添加以下依赖: ```xml &lt;groupId&gt;org.quartz-scheduler...

    spring+quartz+maven项目实例

    通过这个实例,开发者可以学习到如何在实际项目中集成Spring和Quartz,理解它们各自的职责和交互方式,以及如何利用Maven来管理项目依赖和构建流程。这对于构建高效、灵活的定时任务系统具有重要的实践意义。

    Spring_QuartZDemo

    【Spring_QuartZDemo】是一个使用Spring框架集成Quartz定时任务的示例项目,它展示了如何在Java应用中利用Spring和Quartz实现任务调度。Quartz是Java领域一款功能强大的开源作业调度库,能够帮助开发者创建、调度和...

    Spring中Quartz调度器的使用 示例代码

    在本示例中,我们将探讨如何在Spring应用中配置和使用Quartz,以及通过示例代码来理解其工作原理。 首先,我们需要在项目中引入Quartz的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml ...

Global site tag (gtag.js) - Google Analytics