`
lihao312
  • 浏览: 483538 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring-boot集成Quartz

    博客分类:
  • java
阅读更多

spring-boot集成Quartz

<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.2.3</version>
</dependency>
<dependency>
        <groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz-jobs</artifactId>
	<version>2.2.3</version>
</dependency>

 

image

 

@Configuration
public class QuartzConfig {

    @Bean
    public Scheduler scheduler() throws IOException, SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzProperties());
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        return scheduler;
    }

    /**
     * 设置quartz属性
     * @throws IOException
     * 2016年10月8日下午2:39:05
     */
    public Properties quartzProperties() throws IOException {
        Properties prop = new Properties();
        prop.put("quartz.scheduler.instanceName", "ServerScheduler");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
        prop.put("org.quartz.scheduler.skipUpdateCheck", "true");
        prop.put("org.quartz.scheduler.instanceId", "NON_CLUSTERED");
        prop.put("org.quartz.scheduler.jobFactory.class", "org.quartz.simpl.SimpleJobFactory");
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
        prop.put("org.quartz.jobStore.dataSource", "quartzDataSource");
        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
        prop.put("org.quartz.jobStore.isClustered", "true");
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "5");

        prop.put("org.quartz.dataSource.quartzDataSource.driver", "com.mysql.jdbc.Driver");
        prop.put("org.quartz.dataSource.quartzDataSource.URL", "jdbc:mysql://localhost:3306/demo-schema");
        prop.put("org.quartz.dataSource.quartzDataSource.user", "root");
        prop.put("org.quartz.dataSource.quartzDataSource.password", "123456");
        prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", "10");
        return prop;
    }
}

 

@Service
public class TaskServiceImpl {
    private Logger logger = LogManager.getLogger(getClass());
    @Autowired
    private Scheduler scheduler;

    /**
     * 所有任务列表
     * 2016年10月9日上午11:16:59
     */
    public List<TaskInfo> list(){
        List<TaskInfo> list = new ArrayList<>();

        try {
            for(String groupJob: scheduler.getJobGroupNames()){
                for(JobKey jobKey: scheduler.getJobKeys(GroupMatcher.<JobKey>groupEquals(groupJob))){
                    List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
                    for (Trigger trigger: triggers) {
                        Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
                        JobDetail jobDetail = scheduler.getJobDetail(jobKey);

                        String cronExpression = "", createTime = "";

                        if (trigger instanceof CronTrigger) {
                            CronTrigger cronTrigger = (CronTrigger) trigger;
                            cronExpression = cronTrigger.getCronExpression();
                            createTime = cronTrigger.getDescription();
                        }
                        TaskInfo info = new TaskInfo();
                        info.setJobName(jobKey.getName());
                        info.setJobGroup(jobKey.getGroup());
                        info.setJobDescription(jobDetail.getDescription());
                        info.setJobStatus(triggerState.name());
                        info.setCronExpression(cronExpression);
                        info.setCreateTime(createTime);
                        list.add(info);
                    }                   
                }
            }           
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        return list;
    }

    /**
     * 保存定时任务
     * @param info
     * 2016年10月9日上午11:30:40
     */
    @SuppressWarnings("unchecked")
    public void addJob(TaskInfo info) {
        String jobName = info.getJobName(), 
               jobGroup = info.getJobGroup(), 
               cronExpression = info.getCronExpression(),
               jobDescription = info.getJobDescription(),
               createTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
        try {
            if (checkExists(jobName, jobGroup)) {
                logger.info("===> AddJob fail, job already exist, jobGroup:{}, jobName:{}", jobGroup, jobName);
                throw new ServiceException(String.format("Job已经存在, jobName:{%s},jobGroup:{%s}", jobName, jobGroup));
            }

            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
            JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

            CronScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(createTime).withSchedule(schedBuilder).build();


            Class<? extends Job> clazz = (Class<? extends Job>)Class.forName(jobName);
            JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey).withDescription(jobDescription).build();
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException | ClassNotFoundException e) {
            throw new ServiceException("类名不存在或执行表达式错误");
        }
    }

    /**
     * 修改定时任务
     * @param info
     * 2016年10月9日下午2:20:07
     */
    public void edit(TaskInfo info) {
        String jobName = info.getJobName(), 
               jobGroup = info.getJobGroup(), 
               cronExpression = info.getCronExpression(),
               jobDescription = info.getJobDescription(),
               createTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
        try {
            if (!checkExists(jobName, jobGroup)) {
                throw new ServiceException(String.format("Job不存在, jobName:{%s},jobGroup:{%s}", jobName, jobGroup));
            }
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
            JobKey jobKey = new JobKey(jobName, jobGroup);
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
            CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(createTime).withSchedule(cronScheduleBuilder).build();

            JobDetail jobDetail = scheduler.getJobDetail(jobKey);
            jobDetail.getJobBuilder().withDescription(jobDescription);
            HashSet<Trigger> triggerSet = new HashSet<>();
            triggerSet.add(cronTrigger);

            scheduler.scheduleJob(jobDetail, triggerSet, true);
        } catch (SchedulerException e) {
            throw new ServiceException("类名不存在或执行表达式错误");
        }
    }

    /**
     * 删除定时任务
     * @param jobName
     * @param jobGroup
     * 2016年10月9日下午1:51:12
     */
    public void delete(String jobName, String jobGroup){
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
        try {
            if (checkExists(jobName, jobGroup)) {
                scheduler.pauseTrigger(triggerKey);
                scheduler.unscheduleJob(triggerKey);
                logger.info("===> delete, triggerKey:{}", triggerKey);
            }
        } catch (SchedulerException e) {
            throw new ServiceException(e.getMessage());
        }
    }

    /**
     * 验证是否存在
     * @param jobName
     * @param jobGroup
     * @throws SchedulerException
     * 2016年10月8日下午5:30:43
     */
    private boolean checkExists(String jobName, String jobGroup) throws SchedulerException{
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
        return scheduler.checkExists(triggerKey);
    }
}

 

完整项目:https://github.com/leelance/spring-boot-all/tree/master/spring-boot-quartz

  • 大小: 85.6 KB
0
1
分享到:
评论

相关推荐

    spring-boot-Quartz-1.zip

    本案例中,我们将深入探讨如何在SpringBoot应用中集成Quartz定时任务框架,以及如何配置和运行每20秒执行一次的任务。 首先,我们需要在项目中添加Quartz的依赖。在SpringBoot应用的`pom.xml`或`build.gradle`文件...

    spring-boot集成quartz实现动态任务管理,支持集群

    集成Quartz到Spring Boot应用中,首先需要在`pom.xml`文件中添加相应的依赖。Quartz的Spring Boot Starter可以简化配置,使得任务调度变得更加简单。你需要引入如下的Maven依赖: ```xml &lt;groupId&gt;org.spring...

    spring-boot-quartz

    首先,让我们深入理解一下Spring Boot如何与Quartz集成。在Spring Boot应用中引入Quartz,我们需要在`pom.xml`或`build.gradle`文件中添加Quartz的依赖。对于Maven用户,添加如下依赖: ```xml &lt;groupId&gt;org....

    spring-boot使用quartz框架定时发送邮件

    在这个场景中,我们将讨论如何在Spring Boot中集成Quartz框架来实现定时发送邮件的功能,以及如何从数据库中读取数据生成报表。 首先,我们需要在Spring Boot项目中引入Quartz的相关依赖。在`pom.xml`或`build....

    spring-boot-starter-validation-1.3.5.RELEASE.zip

    它的“starter”组件是为了快速引入特定功能而设计的,例如这里的"spring-boot-starter-validation"是为了在Spring Boot应用中轻松集成JSR-303/JSR-349(Bean Validation)标准,进行数据校验。 2. **Bean ...

    spring-boot-quartz.zip

    在Spring Boot项目中集成Quartz,首先需要添加相关的依赖到项目的pom.xml或build.gradle文件中。对于Maven项目,可以在pom.xml中添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-...

    spring-boot-web-restfulcrud代码示例

    IDEA 是一款常用的 Java 开发集成环境,对于 Spring Boot 项目的支持非常完善,可以方便地创建、运行和调试应用。你可能已经在 IDEA 中配置了 Spring Boot 的运行配置,通过点击绿色的运行按钮启动项目,然后通过...

    dynamic-datasource-spring-boot-starter-v3.5.1.zip

    提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。 提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 ...

    spring-boot示例项目

    spring boot demo 是一个Spring Boot、Spring Cloud的项目示例,根据市场主流的后端技术,共集成了30+个demo,未来将持续更新。该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis...

    基于spring-boot+quartz的CRUD动态任务管理系统

    5. **Spring Boot集成Quartz**:集成Quartz到Spring Boot项目中,首先需要在`pom.xml`文件中引入Quartz的相关依赖,然后在Spring Boot的配置文件`application.properties`或`application.yml`中设置Quartz的配置参数...

    dynamic-datasource-spring-boot-starter-v3.5.1.tar.gz

    提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。 提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 ...

    spring-boot 各种demo例子(最新)

    "spring-boot 各种demo例子(最新)" 提供的是最新的 Spring Boot 集成示例代码,可以帮助开发者快速理解和学习如何在实际项目中应用 Spring Boot。下面我们将深入探讨这些 demo 示例中可能包含的关键知识点: 1. **...

    spring-boot学习demo.zip_DEMO_SpringBoot_spring boot_spring-boot_sp

    - 模块化:Spring Boot可以与其他Spring模块和第三方库无缝集成。 - 健康检查:提供健康检查API,方便监控应用状态。 - 可执行JAR:构建的JAR文件可以直接运行,无需额外的服务器环境。 3. **Spring Boot的核心...

    spring-boot-examples-master.zip

    《Spring Boot实战示例解析》 ...在学习过程中,不仅需要理解每个示例的功能,还要关注它们是如何集成Spring Boot的各种特性,以及如何优化和调整配置,这样才能真正掌握Spring Boot并将其应用于实际项目中。

    spring-boot-1.2.1.RELEASE.tar.gz

    它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,让你可以“零”配置启动项目。在 `spring-boot-1.2.1.RELEASE.tar.gz` 这个压缩包中,包含的是 SpringBoot 的一个早期稳定版本,...

    spring-boot-reference-guide-zh-中文, spring-boot参考指南

    这份指南涵盖了Spring Boot的核心概念、配置、启动与运行,以及与其他技术的集成。 1. **核心概念** - **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖简化了项目构建,这些依赖包含了运行应用所...

    spring-boot html thymeleaf

    它集成了大量常用的第三方库配置,如 JDBC、MongoDB、RabbitMQ、Quartz 等,让开发者可以快速地创建出稳定、生产级别的基于 Spring 的应用程序。 在 Spring Boot 中,HTML 和 Thymeleaf 结合使用,可以构建强大的...

    spring-boot-demo.zip

    本文将深入探讨一个名为"spring-boot-demo"的项目案例,这是一份已经搭建好的基于Maven的Spring Boot项目,集成了MyBatis作为持久层框架。我们将围绕这个案例,详细讲解Spring Boot的核心概念、项目结构以及如何整合...

    springboot2.3集成quartz定时任务持久化数据库,支持集群

    在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...

    spring-boot-2.7.18.zip

    3. **起步依赖(Starter POMs)**:SpringBoot 提供了一系列的起步依赖,开发者只需在 Maven 或 Gradle 的构建文件中引入相应依赖,即可快速搭建所需环境,如 `spring-boot-starter-web` 用于 web 开发,`spring-...

Global site tag (gtag.js) - Google Analytics