`
corejava2008
  • 浏览: 295418 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring 通过配置向quartz 注入service

阅读更多
如何通过spring 向quartz动态注入service或者,传入动态参数?
这里主要用到了org.springframework.scheduling.quartz.JobDetailBean这个类的setJobDataAsMap的这个方法!
具体的API如下:
setJobDataAsMap
public void setJobDataAsMap(Map jobDataAsMap)

    Register objects in the JobDataMap via a given Map.

    These objects will be available to this Job only, in contrast to objects in the SchedulerContext.

   Note: When using persistent Jobs whose JobDetail will be kept in the database, do not put Spring-managed beans or an ApplicationContext reference into the JobDataMap but rather into the SchedulerContext.

    Parameters:
        jobDataAsMap - Map with String keys and any objects as values (for example Spring-managed beans)
需要注意的是红色的部分,由spring管理的Service无法通过这个方法进行注入,
spring管理的service 只能放到SchedulerContext里面。
好的,我们来举个例子。
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		
		<property name="schedulerContextAsMap">
			<map>
				<!-- spring 管理的service需要放到这里,才能够注入成功 -->
				<description>schedulerContextAsMap</description>
				<entry key="webSiteService" value-ref="webSiteService"/>
				<entry key = "mappingService" value-ref="mappingService"/>
				<entry key="detailService" value-ref = "detailService"></entry>
			</map>
		</property>
		<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
		<property name="configLocation" value="classpath:quartz.properties" />
	</bean>
	
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
		<property name="jobClass" value = "com.fangjia.dc.quartz.MyQuartzJob"/>
		<property name="jobDataAsMap">
			<map>
				<!-- 非spring管理的service放到这里,就可以注入进去 -->
				<description>jobDataAsMap</description>
				<!-- key 属性值,value 对应的bean -->
				<entry key="uploader" value-ref="uploader" />
			</map>
		</property>
	</bean>

这里一共注入了 bean,分别是webSiteService,mappingService,detailService和uploader,然后在MyQuartzJob中使用注入的service

public class MyQuartzJob extends QuartzJobBean {

	private static final Logger logger = Logger.getLogger(MyQuartzJob.class);
	private Uploader uploader;	
	private IService<WebSite> webSiteService;
	private IService<Mapping> mappingService;
	private IService<MappingDetail> detailService;
	
	@Override
	protected void executeInternal(JobExecutionContext context)	throws JobExecutionException {
		
		try {
			//获取JobExecutionContext中的service对象
			SchedulerContext skedCtx = context.getScheduler().getContext();
			//获取SchedulerContext中的service
			//这里的service就是通过配置文件 配置的
			webSiteService = (IService<WebSite>)skedCtx.get("webSiteService");
			mappingService = (IService<Mapping>)skedCtx.get("mappingService");
			detailService = (IService<MappingDetail>)skedCtx.get("detailService");
			
			//获取 当前的trigger 名称,
			Trigger trigger = context.getTrigger();
			String name = trigger.getName();

			//从trigger中的jobDataMap中获取uploader
			uploader = (Uploader) context.getJobDetail.getJobDataMap().get("uploader");	

			WebSite webSite = webSiteService.findByName(name);
			logger.info("webSite id:" + webSite.getId());
			loadMappingConfiguration(webSite);
			uploader.process(webSite, typeXpathFiels, domainMap);
		} catch (SchedulerException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	//属性的 get set方法
	}

定时任务的动态管理,没有配置的spring文件中
采用页面传值,实现quartz定时任务的CRUD
public void schedule(String name, CronExpression cronExpression,String group) throws SchedulerException {
		
		//添加Job 给scheduler,允许 replace
		
		jobDetail.setRequestsRecovery(true);
		//孤立线程 不再保存在DB中
		jobDetail.setDurability(false);
		jobDetail.setName(name);
		logger.info(" is  durable:" + jobDetail.isDurable());
		//设置replace为true,相同名字的job存在,则替换
		scheduler.addJob(jobDetail, true);
		
		CronTrigger cronTrigger = new CronTrigger(name, group, jobDetail.getName(), Scheduler.DEFAULT_GROUP);
		cronTrigger.setCronExpression(cronExpression);
		scheduler.scheduleJob(cronTrigger);
		scheduler.rescheduleJob(cronTrigger.getName(), cronTrigger.getGroup(), cronTrigger);
	}

	public void pauseTrigger(String triggerName, String group) throws SchedulerException {
		logger.info("pause triggerName:" + triggerName);
		scheduler.pauseTrigger(triggerName, group);
	}

	public void resumeTrigger(String triggerName, String group) throws SchedulerException {
		logger.info("resume trigger:" + triggerName + " group:" + group);
		scheduler.resumeTrigger(triggerName, group);
	}

	public boolean removeTrigdger(String triggerName, String group) throws SchedulerException {
		scheduler.pauseTrigger(triggerName, group);
		return scheduler.unscheduleJob(triggerName, group);
	}


quartz.properties设置
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = false  
org.quartz.jobStore.maxMisfiresToHandleAtATime=1 
#org.quartz.jobStore.txIsolationLevelReadCommitted = true



分享到:
评论
2 楼 corejava2008 2011-02-28  
楼上的很明显是 responseDetailFacade没有注入进去。仔细检查下 哪个地方少些了
1 楼 zhongrf 2011-02-23  
您好,请教一下,为何我的配置不行了?我的情况是升级spring后出现问题了(2.x到3.x版)
<bean id="collectResponseScheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="autoStartup">
			<value>false</value>
		</property>
		<property name="schedulerName">
			<value>collectResponseScheduler</value>
		</property>
		<!--<property name="schedulerContextAsMap" ref="collectResponseSchedulerContext" 
			/> -->

		<property name="schedulerContextAsMap">
			<map>
				<entry key="responseDetailFacade" value-ref="responseDetailFacade" />
				<entry key="collectResponseLogFacade" value-ref="collectResponseLogFacade" />
				<entry key="collectResponseAlertService" value-ref="collectResponseAlertService" />
				<entry key="unhandledMessageFacade" value-ref="unhandledMessageFacade" />
			</map>
		</property>
		<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
		<property name="quartzProperties">
			<props>
				<prop key="org.quartz.scheduler.instanceId">auto</prop>
				<prop key="org.quartz.jobStore.class">
					org.quartz.simpl.RAMJobStore
				</prop>
				<prop key="org.quartz.threadPool.class">
					org.quartz.simpl.SimpleThreadPool
				</prop>
				<prop key="org.quartz.threadPool.threadCount">3</prop>
			</props>
		</property>
		<property name="jobFactory" ref="collectResponseSchedulerJobFactory" />
	</bean>

异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'collectResponseScheduler' defined in class path resource [com/radicasys/intimate/mail/response/collect.xml]: Cannot resolve reference to bean 'responseDetailFacade' while setting bean property 'schedulerContextAsMap' with key [TypedStringValue: value [responseDetailFacade], target type [null]]; 。。。。。
能帮我分析下不?

相关推荐

    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的JobFactory,可以集成Quartz到Spring容器中,这样我们就可以利用Spring的依赖注入(DI)特性来管理Job的生命周期。这使得我们可以轻松地在Job中注入服务和其他依赖,无需手动创建或查找...

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

    在提供的压缩包中,`ssm-springMVC-整合Quartz(解决了无法注入service问题).doc`可能包含了一份详细的文档,详述了上述步骤以及具体的配置代码。而`sx-ssm-quartz`可能是一个源码示例,展示了如何在实际项目中应用...

    spring+mybatis+quartz

    在整合这三个技术时,通常会使用Spring的ApplicationContext来加载配置,包含MyBatis的SqlSessionFactory和Mapper接口,以及Quartz的Scheduler实例。MyBatis的配置文件中,会指定数据源、事务管理器以及Mapper文件的...

    spring任务调度(Quartz )

    在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作原理。 首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。...

    Spring4.X+Quartz2.X

    3. **集成其他Spring服务**:由于Spring的组件化设计,我们可以方便地将Quartz任务与Spring的其他服务(如Service、DAO等)进行交互。 4. **监控和管理**:Spring MVC可以用来构建一个监控界面,实时查看和控制...

    spring定时任务之Quartz

    通过以上步骤,我们就完成了Spring与Quartz的集成,实现了定时任务的创建。在实际开发中,可以根据需求创建多个Job和Trigger,以满足不同定时任务的需求。同时,Quartz提供了丰富的API和配置选项,可以进行更复杂的...

    基于spring+mybatis的quartz应用

    5. **配置Job和Trigger**:在Spring配置文件中,使用`org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean`和`org.springframework.scheduling.quartz.CronTriggerFactoryBean`配置Job和...

    spring-quartz jar包

    在实际项目中,开发者通常会创建一个Job类,该类实现了Quartz的`org.quartz.Job`接口,并通过Spring的`@Component`或`@Service`注解将其注册到Spring容器中。然后,配置一个Trigger来决定何时执行这个Job。Spring ...

    spring+quartz 动态任务方案

    该类实现了 `Runnable` 接口,通过 `run` 方法来不断循环读取配置文件 `db.service.xml` 并创建新的作业。如果作业不存在,则通过 `SchedulerService` 的 `schedule` 方法来安排作业,并将其添加到 `ServiceManager`...

    spring boot集成quartz定时器

    你也可以通过Quartz的管理界面进行操作,但需要额外配置。 总结,Spring Boot集成Quartz定时器能够方便地创建和管理定时任务,同时利用Spring的依赖注入,使得Job可以灵活地调用其他服务或组件。这种方式使得我们的...

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

    在Spring中,我们通常会通过`@Service`注解标记此类,并使用`@Autowired`注解注入所需的其他服务或DAO。服务类可能会有一个方法来启动或唤醒Quartz Job,这个方法可能会调用Quartz的`Scheduler`接口的相关方法。 接...

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

    Spring 3.0以后,可以通过注解来简化配置,使得Quartz的集成更加简洁。首先,你需要创建一个实现了`org.springframework.scheduling.quartz.SchedulerAware`的类,以确保Spring可以初始化Scheduler。接着,使用`@...

    spring-quartz.zip

    通过 Spring 的强大管理和配置能力,以及 Quartz 的灵活调度,我们可以方便地构建定时任务,提升系统的自动化水平。在实际项目中,这样的集成可以广泛应用于各种周期性的后台任务,如数据同步、报表生成等。

    quartz+spring定时器

    Quartz是一个开源的作业调度框架,它允许开发者定义、调度和执行作业,而Spring则提供了强大的依赖注入(DI)和AOP(面向切面编程)功能,使得集成Quartz变得更加方便。 【描述】"spring+quartz配置的定时器 可以...

    spring-quartz-02

    这个 demo 的核心目标是展示如何配置和使用 Spring 对 Quartz 的支持,通过 Cron 表达式来定义任务的执行计划。 首先,我们需要在项目的 `pom.xml` 文件中添加 Spring 和 Quartz 的依赖。这通常包括 Spring ...

    spring整合quartz定时任务

    例如,通过注解方式注入Service或Repository,实现任务与业务逻辑的解耦。 总的来说,Spring整合Quartz为开发者提供了一个强大且灵活的任务调度平台,使得定时任务的管理变得更加便捷。通过合理的配置和测试,可以...

    spring+quartz定时集群支持

    总结起来,"Spring+Quartz定时集群支持"涉及到的知识点主要包括:Spring与Quartz的集成、Quartz的集群配置、`MethodInvokingJobDetailFactoryBean`的使用、数据库表的设计以及通过IHS等手段实现的任务调度。...

    spring&quartz的jar包

    Spring 提供了一个全面的编程和配置模型,它支持依赖注入(DI)和面向切面编程(AOP)。这个框架的核心特性可以用来创建灵活、非侵入式的组件,使得测试变得更加容易。Spring 提供了对 JDBC 的抽象,降低了数据库...

    Spring3Mvc+Hibernate整合Axis2发布WebService并配置Quartz调度

    5. **配置Quartz**:在Spring配置文件中引入Quartz相关的Bean,定义Job类和Trigger,配置调度策略。Spring的`SchedulerFactoryBean`可以帮助启动和管理Quartz调度器。 6. **测试与部署**:编写单元测试确保各部分...

Global site tag (gtag.js) - Google Analytics