IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java——定时任务框架quartz -> 正文阅读

[大数据]Java——定时任务框架quartz

1.简介

使用 @Scheduled 注解来解决简单的定时任务,大部分项目中可能都是使用 Quartz 来做定时任务。

Quartz是一个开源项目,专注于任务调度器,功能强大,提供了极为广泛的特性如持久化任务,集群和分布式任务等。 Quartz核心是调度器,还采用多线程管理。

持久化任务:当应用程序停止运行时,所有调度信息不被丢失,当你重新启动时,调度信息还存在,这就是持久化任务。
集群和分布式处理:当在集群环境下,当有配置Quartz的多个客户端(节点)时,
采用Quartz的集群和分布式处理时,简单了解几点

1)一个节点无法完成的任务,会被集群中拥有相同的任务的节点取代执行。
2)Quartz调度是通过触发器的类别来识别不同的任务,在不同的节点定义相同的触发器的类别,这样在集群下能稳定的运行,一个节点无法完成的任务,会被集群中拥有相同的任务的节点取代执行。
3)分布式 体现在 当相同的任务定时在一个时间点,在那个时间点,不会被两个节点同时执行。

2.使用

提前准备:
	1.导入依赖  spring-boot-starter-quartz
	2.在启动类上添加 @EnableScheduling 注解,表示开启定时任务。

需要定义一个Job(内包括一个jobDetail、trigger),然后把Job加入到调度器(scheduler)中。

2.1 定义 Job

Job 的定义有两种方式:

  1. 直接定义一个Bean,不支持传参。
@Component
public class MyJob1 {
 
    public void myTask1() {
        System.out.println("MyJob1 myTask1任务开始 : " + LocalDateTime.now().toLocalTime() + ",线程:" + Thread.currentThread().getName());
    }
}

  1. 定义一个Bean继承 QuartzJobBean类,并实现默认的方法,支持传参,任务启动时,executeInternal 方法将会被执行。
@Component
public class MyJob2 extends QuartzJobBean {
//    @Autowired  这里注入方式是不行的,报NPE
    private UserService userService;
 
    private Long id;
 
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 处理相应的注入service业务
        String data = userService.get(id);
        System.out.println(data);
        System.out.println("MyJob2 任务开始 : " + LocalDateTime.now().toLocalTime() + ",线程:" + Thread.currentThread().getName());
    }
 
    public UserService getUserService() {
        return userService;
    }
 
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
}

2.2 定义 JobDetail、Trigger

  1. JobDetail 的配置有两种方式:

(1)MethodInvokingJobDetailFactoryBean:可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参。
(2)JobDetailFactoryBean:任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在 JobDataMap 中进行传递。

  1. Quartz 中定义了多个 Trigger触发器,,这里使用下 SimpleTrigger 和 CronTrigger 。

SimpleTrigger触发器: 有点类似于上面的 @Scheduled 的基本用法。
CronTrigger触发器:支持 cron 表达式来配置任务执行时间

@Configuration
public class QuartzConfig {
    // MyJob2 需要 userService, 这两个都可以注入
//    @Bean
//    UserService userService() {
//        return new UserService();
//    }
    @Autowired
    private UserService userService;
 
    // MyJob1任务配置
    @Bean
    MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        bean.setTargetBeanName("myJob1"); // 首字母小写
        bean.setTargetMethod("myTask1");
        return bean;
    }
 
    @Bean
    SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
        SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
        bean.setStartTime(new Date());
        bean.setRepeatCount(5);
        bean.setRepeatInterval(2000);
        bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
        return bean;
    }
 
    // MyJob2任务配置
    // 传参
    @Bean
    JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean bean = new JobDetailFactoryBean();
        bean.setJobClass(MyJob2.class);
        JobDataMap map = new JobDataMap();
        map.put("userService", userService);
        map.put("id", 101);
        bean.setJobDataMap(map);
        return bean;
    }
 
    @Bean
    CronTriggerFactoryBean cronTriggerFactoryBean() {
        CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
        bean.setCronExpression("0/5 * * * * ?");
        bean.setJobDetail(jobDetailFactoryBean().getObject());
        return bean;
    }
 
    // 添加 MyJob1和MyJob2的触发器
    @Bean
    SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setTriggers(cronTriggerFactoryBean().getObject(), simpleTriggerFactoryBean().getObject());
        return bean;
    }
 
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:47:05  更:2022-04-30 08:50:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:48:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码