首页 > 其他分享 >quartz简单实现多任务并发

quartz简单实现多任务并发

时间:2023-04-19 13:22:30浏览次数:32  
标签:quartz springframework public 并发 import org 多任务 jobDetail

package com.scan.xxx.config.quartz;

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Slf4j
@Configuration
public class QuartzConfig {
    @Autowired
    private Scheduler scheduler;
    @Bean(name = "jobDetail")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(SchedulerTask task){
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        /*
         *  是否并发执行
         *  例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
         *  如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
         */
        jobDetail.setConcurrent(true);//设置并行

        jobDetail.setName("scheduler");// 设置任务的名字
        jobDetail.setGroup("scheduler_group");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用

        /*
         * 这两行代码表示执行task对象中的scheduleTest方法。定时执行的逻辑都在scheduleTest。
         */
        jobDetail.setTargetObject(task);

        jobDetail.setTargetMethod("start");
        return jobDetail;
    }

    @Bean(name = "jobTrigger")
    public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
        tigger.setJobDetail(jobDetail.getObject());
        tigger.setCronExpression("0 0 12 * * ?");// 表示每天中午12点
        //tigger.set
        tigger.setName("myTigger");// trigger的name
        return tigger;

    }

    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
        SchedulerFactoryBean schedulerFactoryBean1 = new SchedulerFactoryBean();
        //设置是否任意一个已定义的Job会覆盖现在的Job。默认为false,即已定义的Job不会覆盖现有的Job。
        schedulerFactoryBean1.setOverwriteExistingJobs(true);
        // 延时启动,应用启动5秒后  ,定时器才开始启动
        schedulerFactoryBean1.setStartupDelay(5);
        // 注册定时触发器
        schedulerFactoryBean1.setTriggers(cronJobTrigger);
        return schedulerFactoryBean1;
    }
    //多任务时的Scheduler,动态设置Trigger。一个SchedulerFactoryBean可能会有多个Trigger
    @Bean(name = "multitaskScheduler")
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        return bean;
    }

    /**
     * 根据任务名任务组删除
     */


}

  配置类

package com.scan.xxx.controller.quartz;

import com.scan.xxx.config.quartz.QuartzConfig;
import com.scan.xxx.config.quartz.Task1;
import com.scan.xxx.config.quartz.Task2;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Slf4j
@Controller
public class QuartzController2 {
    @Resource(name = "multitaskScheduler")
    private Scheduler scheduler;
    @Autowired
    private QuartzConfig quartzConfig;

    JobDetail jobDetail;

    @ResponseBody
    @RequestMapping("/task1")
    public Object task1() throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法
        jobDetail = JobBuilder
                .newJob(Task1.class)

                .withIdentity("job1", "group1")
                .build();
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/11 * * * * ?");
        // 每3s执行一次
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);

        return "任务1";
    }

    @ResponseBody
    @RequestMapping("/task2")
    public Object task2() throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法
        jobDetail = JobBuilder.newJob(Task2.class).withIdentity("job2", "group1").build();
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?");
        // 每3s执行一次
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);

        return "任务2";
    }

    @ResponseBody
    @RequestMapping("/taskDelete")
    public void taskDelete(String taskCode, String taskGroup) throws SchedulerException {
        //配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法

        delete(taskCode, taskGroup);
    }

    public void delete(String taskCode, String taskGroup) throws SchedulerException {
        JobKey jobKey = new JobKey(taskCode, taskGroup);
        log.info(jobKey.getName());
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null) {
            log.info("不存在job");
            return;
        }
        log.info("删除" + jobKey.toString());
        scheduler.deleteJob(jobKey);
    }
}

实现类

 

标签:quartz,springframework,public,并发,import,org,多任务,jobDetail
From: https://www.cnblogs.com/caoaman/p/17332986.html

相关文章

  • Java并发编程:Lock
      在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来讨论这个问题,从Java5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提......
  • Java并发编程:深入剖析ThreadLocal
    Java并发编程:深入剖析ThreadLocal想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。以下是本文目录......
  • [Java并发包学习七]解密ThreadLocal
    相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟,清空之前对ThreadLocal的错误的认知!看看JDK中的源码是怎么......
  • rsyslog读取应用服务器nginx日志文件并发送至日志服务器
    现将云主机上的nginx服务的日志发送到日志服务器进行归档备份,后期还会考虑对备份后的nginx日志进行ELK分析,目前因为只是简单的备份日志文件,所以我就使用rsyslog来完成日志的备份。目标:使用rsyslog服务同步nginx服务的access.log和error.log日志文件到日志服务器。说明:一台部署......
  • nginx服务在高并发场景下的优化方案及具体配置
      随着互联网的快速发展,高并发场景下的网站服务已经成为了许多企业和网站必须面对的问题。在这些场景下,如何优化nginx服务成为了一个非常重要的问题。本文将介绍一些在高并发场景下优化nginx服务的方案和具体配置。一、基础配置worker_processes该参数指定了nginx的工作进......
  • pg事务篇(一)—— 事务与多版本并发控制MVCC
    一、MVCC常用实现方法一般MVCC有2种实现方法:写新数据时,把旧数据快照存入其他位置(如oracle的回滚段、sqlserver的tempdb)。当读数据时,读的是快照的旧数据。写新数据时,旧数据不删除,直接插入新数据。PostgreSQL就是使用的这种实现方法。1.PostgreSQL的MVCC实现方式优缺点优点无论事务......
  • JMeter 逻辑控制器、定时器、分布式、报告、并发数计算方法、性能监控
    一、逻辑控制器可以按照设定的逻辑控制取样器的执行顺序1、IF控制器(没有else,如果有其他分支,则一直加IF控制器即可)控制它下面的测试元素是否运行位置:测试计划---线程组---(右键添加)逻辑控制器---如果(IF)控制器参数: 案例:(用......
  • 多场景多任务学习在美团到店餐饮推荐的实践
    总第556篇2023年第008篇美团到店餐饮算法团队在跨域迁移学习的长期实践中,基于多场景的业务背景,提出了分层信息抽取网络,提升了多场景多任务的建模效果。相关技术方案形成的学术论文已经被国际数据工程会议ICDE2023收录,本文详细阐述了多场景多任务学习的解决方案,希望能给从事相关方......
  • 并发面试专题 一般有用 看1
    Synchronized相关问题问题一:Synchronized用过吗,其原理是什么?这是一道Java面试中几乎百分百会问到的问题,因为没有任何写过并发程序的开发者会没听说或者没接触过Synchronized。Synchronized是由JVM实现......
  • 事务-并发事务演示及隔离级别
       --查看事务隔离级别select@@transaction_isolation;--设置事务隔离级别setsessiontransactionisolationlevelrepeatableread;......