SSM整合Quartz(八)下

简介: SSM整合Quartz(八)下

三. JobDataMap 获取 ApplicationContext 对象

三.一 在 job.xml 创建 JobDetail 时注入属性 applicationContextJobDataKey

<!-- 定义 JobDetail, 所用的bean 为 JobDetailFactoryBean -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
  <!-- 任务名 -->
  <property name="name" value="job1"></property>  
  <!-- 组名 -->
  <property name="group" value="group1"></property>
  <!-- 关联任务 --> 
  <property name="jobClass" value="com.yjl.job.MyJob"></property>
  <!-- 必须是true, 如果是false的话,当这个jobDetail没有被Trigger关联时,会删除 -->
  <property name="durability" value="true"></property>
  <!-- 还有一个重要的 applicationContextJobDataKey 属性,这是是很重要的。-->
  <property name="applicationContextJobDataKey" value="userJobDetail"></property>
</bean>


在Spring 整合时,没有配置的那一个 applicationContextJobDataKey 属性。


设置一个普通的标识值, 为 userJobDetail.


三.二 工作任务中通过 JobDataMap 来获取 ServiceBean

public class MyJob extends QuartzJobBean{
  //@Resource(name="userService")
  //private UserService userService;
  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("备份数据库的时间是:"+dateString);  
        User user=new User();
        user.setName("两个蝴蝶飞");
        user.setAge(24);
        user.setSex("男");
        user.setDescription("一个希望得到快乐的程序员");
        //从 JobDataMap 里面获取ApplicationContext
       ApplicationContext applicationContext= (ApplicationContext) context.getJobDetail().
        getJobDataMap().get("userJobDetail");
       // 
        //可以通过 context 对象来获取一些重要信息 
       UserService userService=applicationContext.getBean("userService",UserService.class);
       userService.addUser(user);
       System.out.println("添加成功");
  }
}


三.三 运行测试类 JobTest ,看控制台

image.png


查看一下数据库,


image.png


数据插入成功。


注意,运行了五次。


另外,一定要保证 配置的JobDetail的 applicationContextJobDataKey 属性与 JobDataMap 里面的key 一致,否则,获取不到。


四. 创建工厂类,获取全局 ApplicationContext 对象

要想取得 Service Bean, 都是通过 ApplicationContext 对象进行获取的, 如果在程序运行时,就获取保存了 ApplicationContext的信息,是否就可以取得任意的bean对象了?


四.一 创建工具类, 实现 ApplicationContextAware 接口

四.一.一 ApplicationContextAware 接口定义

package org.springframework.context;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.Aware;
public interface ApplicationContextAware extends Aware {
  void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}


只有一个 赋值的方法。


四.一.二 创建工具类 ApplicationContextUtils

package com.yjl.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * 
 * @author 两个蝴蝶飞
 * 获取ApplicationContext 对象的工具类
 *
 */
public class ApplicationContextUtils implements ApplicationContextAware{
  //定义成静态的
  private static ApplicationContext applicationContext;
  @Override
  public void setApplicationContext(ApplicationContext ac) throws BeansException {
  // TODO 自动生成的方法存根
  applicationContext=ac;
  }
  //获取
  public static ApplicationContext getApplicationContext() {
  return applicationContext;
  }
  //根据bean的id名称,获取相应的对象
  public static Object getBean(String beanName){
  return applicationContext.getBean(beanName);
  }
  //根据bean的id名称,获取相应的对象
  public static <T>  T getBean(String beanName,Class<T> clazz){
  return applicationContext.getBean(beanName,clazz);
  }
}


四.二 将工具Bean 放置到 配置文件里面,设置立即启动

放置到 spring的配置文件里面, 这儿放置到 applicationContext-bean.xml 里面

<!-- 设置bean -->
  <bean id="applicationContext" class="com.yjl.utils.ApplicationContextUtils" lazy-init="false"></bean>
  <context:component-scan base-package="com.yjl.service"></context:component-scan>


这样,这个工具类就可以使用了。


四.三 通过工具类获取 Service Bean

设置保存信息为 岳泽霖的信息。

package com.yjl.job;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.annotation.Resource;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.yjl.pojo.User;
import com.yjl.service.UserService;
import com.yjl.service.impl.UserServiceImpl;
import com.yjl.utils.ApplicationContextUtils;
public class MyJob extends QuartzJobBean{
  //@Resource(name="userService")
  //private UserService userService;
  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  //要做的事,是打印当前的时间 
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //格式化时间
        String dateString=sdf.format(new Date());
        System.out.println("备份数据库的时间是:"+dateString);  
        User user=new User();
        user.setName("岳泽霖");
        user.setAge(24);
        user.setSex("男");
        user.setDescription("一个不快乐的思考者");
      /* 
       *
       // 第一种方式实现
       * ApplicationContext applicationContext= (ApplicationContext) context.getJobDetail()
       * 
       * .getJobDataMap().get("userJobDetail");
        //可以通过 context 对象来获取一些重要信息 
       UserService userService=applicationContext.getBean("userService",UserService.class);
       */
        //第二种方式实现
       UserService userService= (UserService) ApplicationContextUtils.getBean("userService");
       //UserService userService=  ApplicationContextUtils.getBean("userService",UserService.class);
       userService.addUser(user);
       System.out.println("添加成功");
  }
}


四.四 测试文件运行

image.png


查看数据库:


image.png


注意,运行了四次。


四.五 服务器运行

启动服务器时,也是正常插入数据的,与测试类测试一样。

image.png


这两种方式生成 Service Bean 都 可以。


四.六 注入 UserMapper

如果想在任务中注入UserMapper对象,与注入 UserService对象类似:

//第一种方式 
    ApplicationContext applicationContext= (ApplicationContext) context.getJobDetail()
    .getJobDataMap().get("userJobDetail");
    //可以通过 context 对象来获取一些重要信息 
  UserMapper userMapper=applicationContext.getBean("userMapper",UserMapper.class);
    //第二种方式实现
   //UserMapper userMapper= (UserMapper) ApplicationContextUtils.getBean("userMapper");
   //UserMapper userMapper=  ApplicationContextUtils.getBean("userMapper",UserMapper.class);
  userMapper.insert(user);


相关文章
|
19小时前
|
存储 机器学习/深度学习 人工智能
打破硬件壁垒!煎饺App:强悍AI语音工具,为何是豆包AI手机平替?
直接上干货!3000 字以上长文,细节拉满,把核心功能、使用技巧和实测结论全给大家摆明白,读完你就知道这款 “安卓机通用 AI 语音工具"——煎饺App它为何能打破硬件壁垒?它接下来,咱们就深度拆解煎饺 App—— 先给大家扒清楚它的使用逻辑,附上“操作演示”和“🚀快速上手不踩坑 : 4 条核心操作干货(必看)”,跟着走零基础也能快速上手;后续再用真实实测数据,正面硬刚煎饺 App的语音助手口令效果——创建京东「牛奶自动下单神器」口令 ,从修改口令、识别准确率到场景实用性,逐一测试不掺水,最后,再和豆包 AI 手机语音助手的普通版——豆包App对比测试下,简单地谈谈煎饺App的能力边界在哪?
|
3天前
|
云安全 监控 安全
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1005 5
|
10天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
682 40
|
13天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1115 41
|
13天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
821 70
大厂CIO独家分享:AI如何重塑开发者未来十年
|
9天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
502 31
|
17天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
958 59
Meta SAM3开源:让图像分割,听懂你的话
|
1天前
|
机器学习/深度学习 传感器 自动驾驶
具身智能核心突破:物理模拟器与世界模型协同技术拆解
本文系统综述了物理模拟器与世界模型在具身智能发展中的协同作用,提出五级智能机器人分类体系(IR-L0至IR-L4),分析其在运动、操作与交互中的进展,并对比主流仿真平台与世界模型架构,探讨其在自动驾驶与关节机器人中的应用及未来挑战。
160 113