springboot整合quartz不持久化+注意事项

第一步

 导入坐标

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>${spring-boot-starter-quartz.version}</version>
<!--            <version>3.1.4</version>-->
        </dependency>

这里说一下 在创建springboot项目时可以选择i/o 中的quartz 就不需要自己在手动写入这个坐标名称了

第二步 

配置yml文件

server:
  port: 83
logging:
  level:
    root: info
spring:
  redis:
    database: 1
    host: 127.0.0.1
    port: 6379
    timeout: 30000
    jedis:
      pool:
        max-idle: 50
        max-active: 20
        min-idle: 4
  # Quartz 的配置,对应 QuartzProperties 配置类
  quartz:
    job-store-type: memory # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
    auto-startup: true # Quartz 是否自动启动
    startup-delay: 0 # 延迟 N 秒启动
    wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
    overwrite-existing-jobs: true # 是否覆盖已有 Job 的配置
    properties: # 添加 Quartz Scheduler 附加属性
      org:
        quartz:
          threadPool:
            threadCount: 25 # 线程池大小。默认为 10 。
            threadPriority: 5 # 线程优先级
            class: org.quartz.simpl.SimpleThreadPool # 线程池类型
          scheduler:
            instanceName: ClearJob
    #    jdbc: # 这里暂时不说明,使用 JDBC 的 JobStore 的时候,才需要配置

第三步

创建任务类实现QuartzJobBean 并重写executeInternal方法,这个里面就是可以放需要定时执行的程序比如我这里是定时清理图片

import com.it.constant.RedisConstant;
import com.it.utils.QiniuUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import redis.clients.jedis.JedisPool;

import java.util.Set;

public class ClearJob extends QuartzJobBean {
    @Autowired
    private JedisPool jedisPool;
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        this.clearImg();
    }
    public void clearImg() {
        System.out.println("开始quartz---------------");
        //根据Redis中保存的两个set集合进行差值计算,获得垃圾图片的集合  sdiff会返回差值集合
        Set<String> set = jedisPool.getResource().sdiff(RedisConstant.SETMEAL_PIC_RESOURCES, RedisConstant.SETMEAL_PIC_DB_RESOURCES);
        if (set != null) {
            for (String picName : set) {
                //删除七牛云服务器上的图片
                QiniuUtils.deleteFileFromQiniu(picName);
                //从Redis中删除集合的名称
                jedisPool.getResource().srem(RedisConstant.SETMEAL_PIC_RESOURCES, picName);
                System.out.println("清理了"+picName);

            }
        }

    }
}

第四步

设置好了需要定时执行的程序后,需要了解

ob/JobDetail: 任务
任务指的是你要做的事,也是任务调度的核心,比如我想要每隔一个小时喝一杯水,那么任务就是“喝水”
Trigger: 触发器
触发器指的是任务触发的时间,也就是任务在什么时间开始执行。例如上一句喝水的例子,“每隔一个小时”,这就是一个触发器,触发器具有两种定时类型,一种简单定时,一种使用Cron时间表达式进行复杂定时。
需要配置的是这个JobDetail和Trigger

import org.quartz.*;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail jobDetail() {
        return JobBuilder.newJob(ClearJob.class)
                //指定任务名称
                .withIdentity("ClearJob","group1")
                .withDescription("任务描述:定时清理图片")
                //每次任务执行后进行存储
                .storeDurably(true)
                .build();

    }

    @Bean
    public Trigger trigger() {
        //设置Cron时间表达式,此处也可用SimpleScheduleBuilder
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");

        //创建触发器
        return TriggerBuilder.newTrigger()
                //绑定工作任务
                .forJob(jobDetail())
                .withIdentity("trigger","group1")
                //每隔5秒执行一次job
                .withSchedule(cronScheduleBuilder)
//                .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5))
                .build();
    }

第五步

检查启动类的位置

运行结果如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对你的问题,我可以给你提供一些思路和建议。 首先,你可以使用 Spring Boot 作为你整个应用的基础框架,它提供了丰富的功能和插件,使得整合 Quartz 和 PostgreSQL 变得更加简单。 其次,对于数据库连接池,你可以使用 HikariCP,它是一个非常轻量级的连接池实现,性能非常出色,适合用于高并发场景。 最后,对于 Quartz整合,你可以参考 Spring Boot 官方提供的 Quartz Starter,这个 Starter 已经将 Quartz 集成到了 Spring Boot 中,并提供了自动配置和一些默认的设置,使得整合变得更加简单。 下面是一个简单的示例,演示如何使用 Spring Boot、HikariCP 和 Quartz 整合 PostgreSQL: 1. 首先,在你的 pom.xml 中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 在 application.properties 文件中添加以下配置: ```properties spring.datasource.url=jdbc:postgresql://localhost:5432/mydatabase spring.datasource.username=myusername spring.datasource.password=mypassword spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.quartz.properties.org.quartz.jobStore.dataSource=myDataSource spring.quartz.properties.org.quartz.dataSource.myDataSource.driver=org.postgresql.Driver spring.quartz.properties.org.quartz.dataSource.myDataSource.URL=jdbc:postgresql://localhost:5432/mydatabase spring.quartz.properties.org.quartz.dataSource.myDataSource.user=myusername spring.quartz.properties.org.quartz.dataSource.myDataSource.password=mypassword spring.quartz.properties.org.quartz.dataSource.myDataSource.maxConnections=10 ``` 3. 在你的代码中配置 Quartz: ```java @Configuration public class QuartzConfig { @Autowired private DataSource dataSource; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setDataSource(dataSource); schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContext"); Properties quartzProperties = new Properties(); quartzProperties.setProperty("org.quartz.scheduler.instanceName", "QuartzScheduler"); quartzProperties.setProperty("org.quartz.scheduler.instanceId", "AUTO"); quartzProperties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); quartzProperties.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"); quartzProperties.setProperty("org.quartz.jobStore.useProperties", "true"); quartzProperties.setProperty("org.quartz.jobStore.dataSource", "myDataSource"); quartzProperties.setProperty("org.quartz.jobStore.tablePrefix", "QRTZ_"); quartzProperties.setProperty("org.quartz.jobStore.isClustered", "false"); quartzProperties.setProperty("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); quartzProperties.setProperty("org.quartz.threadPool.threadCount", "10"); quartzProperties.setProperty("org.quartz.threadPool.threadPriority", "5"); schedulerFactoryBean.setQuartzProperties(quartzProperties); return schedulerFactoryBean; } @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob") .usingJobData("name", "World") .storeDurably() .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("sampleTrigger") .withSchedule(scheduleBuilder) .build(); } } ``` 这个配置类定义了一个 SchedulerFactoryBean,它使用我们之前配置的数据源,并设置了 Quartz 的一些属性。同时,我们还定义了一个 SampleJob,它会每隔 10 秒钟执行一次,并输出一条日志信息。 4. 编写 SampleJob 类: ```java public class SampleJob implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(SampleJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { LOGGER.info("Hello, {}!", context.getMergedJobDataMap().get("name")); } } ``` 这个类实现了 Quartz 的 Job 接口,定义了一个 execute 方法,它会在每次调度时被执行。 5. 运行应用程序,你应该会看到类似如下的输出: ``` 2021-10-14 15:31:00.001 INFO 25508 --- [pool-1-thread-1] o.s.s.quartz.SampleJob : Hello, World! 2021-10-14 15:31:10.002 INFO 25508 --- [pool-1-thread-1] o.s.s.quartz.SampleJob : Hello, World! 2021-10-14 15:31:20.001 INFO 25508 --- [pool-1-thread-1] o.s.s.quartz.SampleJob : Hello, World! ... ``` 这个示例演示了如何使用 Spring Boot、HikariCP 和 Quartz 整合 PostgreSQL。当然,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值