如何通过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
分享到:
相关推荐
这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用
基于spring-boot+quartz的CRUD任务管理系统。已实现功能有:任务列表。任务新增和修改 任务执行。表达式生成器。...Job中注入service为空的问题。系统启动,如果数据库任务为零则初始化测试任务,用于测试
Spring(5.0.3) Spring MVC Hibernate(5.2.12) c3p0 连接池 + Quartz 框架采用 Gradle 构建,基于注解 Service 实现无需实现接口即可注入
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() ...
<bean id="querytestController" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <bean id="querytestControllerTrigger" class="org.springframework.scheduling....
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() ...
2.2.4 通过构造函数注入依赖 2.3 自动装配 2.3.1 处理自动装配中的不确定性 2.3.2 混合使用自动和手动装配 2.3.3 缺省自动装配 2.3.4 何时采用自动装配 2.4 使用Spring的特殊Bean ...
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...
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...
Druid(数据源配置 sql防注入 sql性能监控) Dubbo+Zookeeper分布式服务框架 合理的分布式服务划分(common+api+service+web) 资源调度和治理中心(SOA)(dubbo-admin) 服务监控方案(dubbo-monitor) <项目介绍> 该...