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.

[color=red] 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.[/color]

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
Mac上Office合法安装与激活全指南:2021/2024/M365区别解析 Office是微软办公套件的核心产品,其在macOS平台的部署逻辑与Windows截然不同——不依赖传统密钥激活,而是基于Microsoft账户与设备标识的云端绑定机制。理解这一原理,是解决‘无法验证开发者’‘打不开’‘功能受限’等常见问题的前提。Office 2021代表永久许可模型,Office 2024 LTSC面向企业离线场景,Microsoft 365则是持续订阅服务,三者在授权验证方式、更新策略与系统兼容性上存在本质差异。实际应用中,需结合macOS版本、芯片架构(Intel/Apple Sil 阅读详情

相关推荐

PCB压合原理与工艺全流程深度解析

PCB压合是多层印制电路板制造中的核心工序,其本质并非简单物理叠加,而是高分子树脂流动、玻璃布应力释放、铜箔热膨胀及界面能调控的协同过程。理解压合原理,需掌握温度-压力-时间三维曲线动态关系;优化工艺流程,须兼顾叠板精度、热压参数匹配与冷却策略;关键影响因素如半固化片(PP)选型、铜箔表面处理、设备温场均匀性、结构对称性、环境湿度及操作手法,共同决定层间结合力、翘曲度与孔壁质量。本文围绕PCB压合原理、工艺流程、关键影响因素三大维度展开,融合IPC标准、实测数据与产线案例,为工艺工程师、NPI人员及设备维护

weixin_29191081的博客 251

Spring+Quartz定时任务service注入问题

我自己的解决过程:http://blog.csdn.net/axela30w/article/details/67632242(跟下面两种稍微不一样) 第一种解决方案: 一般情况下,quartz的job中使用autowired注解注入的对象为空,这时候我们就要使用spring-quartz提供的AdaptableJobFactory类。 自定义一个类: [java]view pla...

叭嘣的博客 3506

基于opencv-ANN的水果识别模型训练

本文通过opencv-ann-mlp训练模型,实现对五种水果进行分类识别。本文详细介绍该项目的各个过程,包括数据准备、预处理、样本读取、训练数据集制作、训练标签制作、模型参数设置、模型训练,模型测试验证等,总结该过程需要注意的事项。

qq_15985873的博客 3971

Quartz DataSource配置

Spring使用Quartz配置数据源的方法 一、使用quartz.properties文件配置数据源 (1)在quartz.properties文件中需做如下配置: org.quartz.scheduler.instanceName = scheduler org.quartz.scheduler.instanceId = AUTO org.quartz.threadPool.clas

LeeJay5的专栏 1万+

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码 S30新框架适合多种奥顺插件。

xl1407的博客 1749

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言,什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块,STM32F030F4P6,这一个芯片没有USB,但是其他都有,引脚少,价格低廉,如果找不到原厂,可以买替代的国产芯片,性能也一样。 不管怎么样也是Cortex-M0,比8bit和16bit的性能都强,总的来说就是低价,引脚少,体积小的同时,还容易开发,有很多模拟输入可玩,还有SPI,硬件I2C等等 所以,这一款MCU真的是从理论来说又便宜又好用,非常适合把玩。 画个板,最小系统 STM32F030其..

arenascat的博客 2万+

【配置详解】Quartz配置文件详解

 我们通常是通过quartz.properties属性配置文件(默认情况下均使用该文件)结合StdSchedulerFactory 来使用Quartz的。StdSchedulerFactory 会加载属性配置文件并实例化一个Scheduler。   默认情况下,Quartz会加载classpath下的”quartz.properties”文件作为配置属性,如果找不到则会使用quartz框架自己...

weixin_33861800的博客 6880

A Side Scan Sonar Image Denoising Algorithm Based on Compound of Fuzzy Weighted Average and Kalman F

Abstract 水下侧扫声纳图像的噪声来源:高斯噪声、脉冲、斑点噪声。 传统方法只能移除部分噪声,并且去噪后容易造成细节模糊。 本文在考虑到噪声的随机性以后,提出一种融合了模糊加权平均和卡尔曼滤波的去噪方法。 在最大化保留图像细节的基础上,同时去除高斯噪声和脉冲噪声 一.Introduction 由于海底环境和声波自身干涉的影响,声纳图像生成的图像难免会有噪点。声纳采集的图像通常会有高斯噪声、脉...

qq_44516871的博客 927

spring动态注入

使用场景:jar提供的接口回调,仅Service名字不同,每次需要新写一个实现类,太过累赘,可以通过重复注入同一个实现,仅改变名字,示例如下,支持注入Bean和具体值 package com.yunjin.redis; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.bea

sinat_30356443的博客 1619

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3120

KCP(快速可靠UDP)——用带宽换延迟的极致艺术

想象你是一个外卖平台的调度员。这就是KCP的本质——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 202

Spring 通过配置向 Quartz定时任务 注入service

解决Spring的quartz定时任务service注入问题

Mr.W的博客 979

顶刊论文引言用AI怎么写?借助Gemini 3 Pro结合四段式写出逻辑清晰的Introduction

写研究目标时,先明确研究问题,直接回应前文提到的研究缺口,如 “This study aims to investigate whether X modulates Y via the Z pathway in human cells.”然后再提出你的研究假设,当理论依据清晰时,可以用如 “We hypothesized that inhibiting X would rescue Y deficiency in this model.”的句子点出研究目标。要求:1)明确陈述本研究拟解决的核心科学问题;

智能AI让学术科研更容易 180

嵌入式以太网驱动开发:从PHY调试到SKB投递的全栈实践

以太网驱动是嵌入式Linux系统联网能力的核心基础,其本质是MAC控制器与PHY芯片通过MDIO总线协同完成物理层链路建立、数据帧收发及DMA缓冲区管理的技术过程。理解RGMII时序、PHY地址匹配、设备树配置与SKB内存分配机制,直接决定网络功能的稳定性与性能上限。在工业网关、车载终端和电力DTU等实时性要求高的场景中,驱动需支撑千兆吞吐、低抖动传输与PTP时间同步,而常见问题如link down、mdio_read失败、rx_over_errors飙升,往往源于硬件适配偏差而非代码逻辑错误。本文聚焦嵌入

weixin_34301132的博客 394

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

quartz定时任务框架搭建,以及解决service注入为空问题。

如果这个失效的话,就是job中注入的service还是为空,可以采用用spring bean的方式让spring容器来寻找service类。定义SpringJobFactory 用于解决job中service注入为空的问题。定义QuartzConfig 配置文件。引入quartz依赖。

Soncat2000的博客 969

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springBoot整合Quartz注入的业务service为空

springBoot整合Quartz过程在下一篇博客。 问题描述: springBoot整合Quartz后,job中注入的业务service为null。 原因: Spring容器可以管理Bean,但是Quartz的job是自己管理的,如果在Job中注入Spring管理的Bean,需要先把Quartz的Job也让Spring管理起来,因此,我们需要重写JobFactory。 解决方法: 创建任务工厂...

越是憧憬,越要风雨兼程 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【quartz】quartz定时任务service注入失败

quartz定时任务service注入失败的详细的原因我查了查是这样的:Job是在quartz的框架中实例化的,service是在spring容器中创建出来的,所以Job实现类不受spring管理,即导致注入失败,所以要想解决这个问题就需要,将他们关联起来。好在Quartz提供了JobFactory接口,就可以自定义实现创建Job的逻辑。就像这样:public interface JobFacto...

crainnogao的博客 5283

Quartz持久化和RAM两种使用方式,Job实现注入service,execute方法传入执行参数

A、项目中引入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ...

aichun8580的博客 848

spring整合quartz注入service的及动态任务处理问题

本文主要写一下关于spring+quartz的用法,对于quartz基本或原理不太了解的话最好去相关文章了解一下。 ps:个人觉得,quartz和spring+quartz原本的用法还是有着天差地别,所以了解下原理,也没必要把quartz基础的用法都搞懂,实际中一般不会直接使用quartz的。 使用spring+quartz,一般都是web项目中,大多都是为了引入service完成相关业务逻辑

qq736655183的博客 2647

quartz定时任务不能注入service导致NullPointException

背景:在使用spring框架的时候整合quartz定时任务,在定时任务的job继承类里面注入service导致空指针异常 原因:原因是job是在quartz中实例化出来的,不受spring的管理。所以就导致注入不进去了 解决方法: 1,需编写一个MyAdaptableJobFactory类则可解决对象无法注入的问题 @Component("myAdaptableJobFactory") publ...

♾️ 1716

Spring中,使用工具类无法自动注入service

这个问题我其实遇到很久了,目前解决方案是手动注入service,并且把工具类也手动注入。 场景: 在spring中,我们经常会定义工具类来做一些奇怪的事情,我当前是通过定时任务quarz调度工具类,工具类再调service,如果采用自动注入的方式,会报错: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionExcep...

Gblfy_Blog 1993
上一篇: Ant入门教程二,使用Ant自动生成War文件,并部署到Tomcat下
下一篇: 使用log4j显示quartz的debug信息
corejava999
博客等级 码龄18年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值