`
corejava2008
  • 浏览: 292343 次
  • 性别: 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和quartz的集成(java线程的方式运行)

    这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用

    基于spring-boot+quartz的CRUD任务管理系统

    基于spring-boot+quartz的CRUD任务管理系统。已实现功能有:任务列表。任务新增和修改 任务执行。表达式生成器。...Job中注入service为空的问题。系统启动,如果数据库任务为零则初始化测试任务,用于测试

    Spring(5.0.3) Spring MVC Hibernate(5.2.12) Quartz gradle 构建

    Spring(5.0.3) Spring MVC Hibernate(5.2.12) c3p0 连接池 + Quartz 框架采用 Gradle 构建,基于注解 Service 实现无需实现接口即可注入

    Spring.3.x企业应用开发实战(完整版).part2

    7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() ...

    springjdbc

    &lt;bean id="querytestController" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt; &lt;bean id="querytestControllerTrigger" class="org.springframework.scheduling....

    Spring3.x企业应用开发实战(完整版) part1

    7.3.3 如何通过配置使用@AspectJ切面 7.4 @AspectJ语法基础 7.4.1 切点表达式函数 7.4.2 在函数入参中使用通配符 7.4.3 逻辑运算符 7.4.4 不同增强类型 7.4.5 引介增强用法 7.5 切点函数详解 7.5.1 @annotation() ...

    spring in action英文版

     2.2.4 通过构造函数注入依赖  2.3 自动装配  2.3.1 处理自动装配中的不确定性  2.3.2 混合使用自动和手动装配  2.3.3 缺省自动装配  2.3.4 何时采用自动装配  2.4 使用Spring的特殊Bean  ...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    将优雅的SSM框架拆分为分布式架构(基于dubbo+zookeeper)+源代码+文档说明

    Druid(数据源配置 sql防注入 sql性能监控) Dubbo+Zookeeper分布式服务框架 合理的分布式服务划分(common+api+service+web) 资源调度和治理中心(SOA)(dubbo-admin) 服务监控方案(dubbo-monitor) &lt;项目介绍&gt; 该...

Global site tag (gtag.js) - Google Analytics