如何通过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
分享到:
相关推荐
配置Quartz通常需要在Spring配置文件中声明`SchedulerFactoryBean`,并设置相关的bean。例如: ```xml <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 这里...
Spring通过提供一个Quartz的JobFactory,可以集成Quartz到Spring容器中,这样我们就可以利用Spring的依赖注入(DI)特性来管理Job的生命周期。这使得我们可以轻松地在Job中注入服务和其他依赖,无需手动创建或查找...
在提供的压缩包中,`ssm-springMVC-整合Quartz(解决了无法注入service问题).doc`可能包含了一份详细的文档,详述了上述步骤以及具体的配置代码。而`sx-ssm-quartz`可能是一个源码示例,展示了如何在实际项目中应用...
在整合这三个技术时,通常会使用Spring的ApplicationContext来加载配置,包含MyBatis的SqlSessionFactory和Mapper接口,以及Quartz的Scheduler实例。MyBatis的配置文件中,会指定数据源、事务管理器以及Mapper文件的...
在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作原理。 首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。...
3. **集成其他Spring服务**:由于Spring的组件化设计,我们可以方便地将Quartz任务与Spring的其他服务(如Service、DAO等)进行交互。 4. **监控和管理**:Spring MVC可以用来构建一个监控界面,实时查看和控制...
通过以上步骤,我们就完成了Spring与Quartz的集成,实现了定时任务的创建。在实际开发中,可以根据需求创建多个Job和Trigger,以满足不同定时任务的需求。同时,Quartz提供了丰富的API和配置选项,可以进行更复杂的...
5. **配置Job和Trigger**:在Spring配置文件中,使用`org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean`和`org.springframework.scheduling.quartz.CronTriggerFactoryBean`配置Job和...
在实际项目中,开发者通常会创建一个Job类,该类实现了Quartz的`org.quartz.Job`接口,并通过Spring的`@Component`或`@Service`注解将其注册到Spring容器中。然后,配置一个Trigger来决定何时执行这个Job。Spring ...
该类实现了 `Runnable` 接口,通过 `run` 方法来不断循环读取配置文件 `db.service.xml` 并创建新的作业。如果作业不存在,则通过 `SchedulerService` 的 `schedule` 方法来安排作业,并将其添加到 `ServiceManager`...
你也可以通过Quartz的管理界面进行操作,但需要额外配置。 总结,Spring Boot集成Quartz定时器能够方便地创建和管理定时任务,同时利用Spring的依赖注入,使得Job可以灵活地调用其他服务或组件。这种方式使得我们的...
在Spring中,我们通常会通过`@Service`注解标记此类,并使用`@Autowired`注解注入所需的其他服务或DAO。服务类可能会有一个方法来启动或唤醒Quartz Job,这个方法可能会调用Quartz的`Scheduler`接口的相关方法。 接...
Spring 3.0以后,可以通过注解来简化配置,使得Quartz的集成更加简洁。首先,你需要创建一个实现了`org.springframework.scheduling.quartz.SchedulerAware`的类,以确保Spring可以初始化Scheduler。接着,使用`@...
通过 Spring 的强大管理和配置能力,以及 Quartz 的灵活调度,我们可以方便地构建定时任务,提升系统的自动化水平。在实际项目中,这样的集成可以广泛应用于各种周期性的后台任务,如数据同步、报表生成等。
Quartz是一个开源的作业调度框架,它允许开发者定义、调度和执行作业,而Spring则提供了强大的依赖注入(DI)和AOP(面向切面编程)功能,使得集成Quartz变得更加方便。 【描述】"spring+quartz配置的定时器 可以...
这个 demo 的核心目标是展示如何配置和使用 Spring 对 Quartz 的支持,通过 Cron 表达式来定义任务的执行计划。 首先,我们需要在项目的 `pom.xml` 文件中添加 Spring 和 Quartz 的依赖。这通常包括 Spring ...
例如,通过注解方式注入Service或Repository,实现任务与业务逻辑的解耦。 总的来说,Spring整合Quartz为开发者提供了一个强大且灵活的任务调度平台,使得定时任务的管理变得更加便捷。通过合理的配置和测试,可以...
总结起来,"Spring+Quartz定时集群支持"涉及到的知识点主要包括:Spring与Quartz的集成、Quartz的集群配置、`MethodInvokingJobDetailFactoryBean`的使用、数据库表的设计以及通过IHS等手段实现的任务调度。...
Spring 提供了一个全面的编程和配置模型,它支持依赖注入(DI)和面向切面编程(AOP)。这个框架的核心特性可以用来创建灵活、非侵入式的组件,使得测试变得更加容易。Spring 提供了对 JDBC 的抽象,降低了数据库...
5. **配置Quartz**:在Spring配置文件中引入Quartz相关的Bean,定义Job类和Trigger,配置调度策略。Spring的`SchedulerFactoryBean`可以帮助启动和管理Quartz调度器。 6. **测试与部署**:编写单元测试确保各部分...