当前位置: 首页 > 工具软件 > SimpleSQLite > 使用案例 >

Springboot quartz sqlite

贺恩
2023-12-01

首先引入我们的非常牛皮的jar~

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

加一个非常牛皮的配置类

@Configuration
public class QuartzConfig implements SchedulerFactoryBeanCustomizer {

    @Resource
    private DataSource dataSource;

    @Override
    public void customize(SchedulerFactoryBean schedulerFactoryBean) {
        // 启动延时
        schedulerFactoryBean.setStartupDelay(2);
        // 自动启动任务调度
        schedulerFactoryBean.setAutoStartup(true);
        // 是否覆盖现有作业定义
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        // 配置数据源
        schedulerFactoryBean.setDataSource(dataSource);
    }
}

不用自带的c3p0连接池 我要用Hikari 嗯 quartz里存在这个 但是配置了报错 自己加一个

public class HikariConnectionProvider implements ConnectionProvider {

    public String driver;

    public String URL;

    public String user;

    public String password;

    public int maxConnections;

    private HikariDataSource datasource;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getURL() {
        return URL;
    }

    public void setURL(String URL) {
        this.URL = URL;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getMaxConnections() {
        return maxConnections;
    }

    public void setMaxConnections(int maxConnections) {
        this.maxConnections = maxConnections;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return datasource.getConnection();
    }

    @Override
    public void shutdown() {
        datasource.close();
    }

    @Override
    public void initialize() throws SQLException {
        if (this.URL == null) {
            throw new SQLException("DBPool could not be created: DB URL cannot be null");
        }
        if (this.driver == null) {
            throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!");
        }
        if (this.maxConnections < 0) {
            throw new SQLException("DBPool maxConnections could not be created: Max connections must be greater than zero!");
        }
        datasource = new HikariDataSource();
        try {
            datasource.setDriverClassName(this.driver);
        } catch (Exception e) {
            try {
                throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e);
            } catch (SchedulerException ignored) {
            }
        }
        datasource.setJdbcUrl(this.URL);
        datasource.setUsername(this.user);
        datasource.setPassword(this.password);
        datasource.setMaximumPoolSize(this.maxConnections);
    }

}

嗯 还有我们非常牛皮的要持久化一下 sqlite sql

create table QRTZ_CALENDARS
(
   SCHED_NAME NVARCHAR(120) not null,
   CALENDAR_NAME NVARCHAR(200) not null,
   CALENDAR BLOB not null,
   primary key (SCHED_NAME, CALENDAR_NAME)
);

create table QRTZ_FIRED_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   ENTRY_ID NVARCHAR(140) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   INSTANCE_NAME NVARCHAR(200) not null,
   FIRED_TIME BIGINT not null,
   SCHED_TIME BIGINT not null,
   PRIORITY INTEGER not null,
   STATE NVARCHAR(16) not null,
   JOB_NAME NVARCHAR(150),
   JOB_GROUP NVARCHAR(150),
   IS_NONCONCURRENT BIT,
   REQUESTS_RECOVERY BIT,
   primary key (SCHED_NAME, ENTRY_ID)
);

create table QRTZ_JOB_DETAILS
(
   SCHED_NAME NVARCHAR(120) not null,
   JOB_NAME NVARCHAR(150) not null,
   JOB_GROUP NVARCHAR(150) not null,
   DESCRIPTION NVARCHAR(250),
   JOB_CLASS_NAME NVARCHAR(250) not null,
   IS_DURABLE BIT not null,
   IS_NONCONCURRENT BIT not null,
   IS_UPDATE_DATA BIT not null,
   REQUESTS_RECOVERY BIT not null,
   JOB_DATA BLOB,
   primary key (SCHED_NAME, JOB_NAME, JOB_GROUP)
);

create table QRTZ_LOCKS
(
   SCHED_NAME NVARCHAR(120) not null,
   LOCK_NAME NVARCHAR(40) not null,
   primary key (SCHED_NAME, LOCK_NAME)
);

create table QRTZ_PAUSED_TRIGGER_GRPS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   primary key (SCHED_NAME, TRIGGER_GROUP)
);

create table QRTZ_SCHEDULER_STATE
(
   SCHED_NAME NVARCHAR(120) not null,
   INSTANCE_NAME NVARCHAR(200) not null,
   LAST_CHECKIN_TIME BIGINT not null,
   CHECKIN_INTERVAL BIGINT not null,
   primary key (SCHED_NAME, INSTANCE_NAME)
);

create table QRTZ_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   JOB_NAME NVARCHAR(150) not null,
   JOB_GROUP NVARCHAR(150) not null,
   DESCRIPTION NVARCHAR(250),
   NEXT_FIRE_TIME BIGINT,
   PREV_FIRE_TIME BIGINT,
   PRIORITY INTEGER,
   TRIGGER_STATE NVARCHAR(16) not null,
   TRIGGER_TYPE NVARCHAR(8) not null,
   START_TIME BIGINT not null,
   END_TIME BIGINT,
   CALENDAR_NAME NVARCHAR(200),
   MISFIRE_INSTR INTEGER,
   JOB_DATA BLOB,
   primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
   foreign key (SCHED_NAME, JOB_NAME, JOB_GROUP) references QRTZ_JOB_DETAILS
);

create table QRTZ_BLOB_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   BLOB_DATA BLOB,
   primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
   foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references QRTZ_TRIGGERS
      on delete cascade
);

create table QRTZ_CRON_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   CRON_EXPRESSION NVARCHAR(250) not null,
   TIME_ZONE_ID NVARCHAR(80),
   primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
   foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references QRTZ_TRIGGERS
      on delete cascade
);

create table QRTZ_SIMPLE_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   REPEAT_COUNT BIGINT not null,
   REPEAT_INTERVAL BIGINT not null,
   TIMES_TRIGGERED BIGINT not null,
   primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
   foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references QRTZ_TRIGGERS
      on delete cascade
);

create table QRTZ_SIMPROP_TRIGGERS
(
   SCHED_NAME NVARCHAR(120) not null,
   TRIGGER_NAME NVARCHAR(150) not null,
   TRIGGER_GROUP NVARCHAR(150) not null,
   STR_PROP_1 NVARCHAR(512),
   STR_PROP_2 NVARCHAR(512),
   STR_PROP_3 NVARCHAR(512),
   INT_PROP_1 INT,
   INT_PROP_2 INT,
   LONG_PROP_1 BIGINT,
   LONG_PROP_2 BIGINT,
   DEC_PROP_1 NUMERIC,
   DEC_PROP_2 NUMERIC,
   BOOL_PROP_1 BIT,
   BOOL_PROP_2 BIT,
   TIME_ZONE_ID NVARCHAR(80),
   primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
   foreign key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) references QRTZ_TRIGGERS
      on delete cascade
);

CREATE TRIGGER DELETE_BLOB_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
   DELETE FROM QRTZ_BLOB_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END;

CREATE TRIGGER DELETE_CRON_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
   DELETE FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END;

CREATE TRIGGER DELETE_SIMPLE_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
   DELETE FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END;

CREATE TRIGGER DELETE_SIMPROP_TRIGGER DELETE ON QRTZ_TRIGGERS
BEGIN
   DELETE FROM QRTZ_SIMPROP_TRIGGERS WHERE SCHED_NAME=OLD.SCHED_NAME AND TRIGGER_NAME=OLD.TRIGGER_NAME AND TRIGGER_GROUP=OLD.TRIGGER_GROUP;
END;

然后 写一个牛皮的job任务类

public class TestJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行");
    }
}

然后写一个牛皮的测试方法

@Test
void test2() throws ClassNotFoundException, SchedulerException {
    Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName("com.hsqy.start.TestJob");

    JobKey jobKey = new JobKey("jobKey", "jobGroup");
    TriggerKey triggerKey = new TriggerKey("triggerKey", "triggerGroup");

    JobDetail jobDetail = JobBuilder.newJob(jobClass)
            .withIdentity(jobKey)
            .withDescription("desc")
            .build();
    CronTrigger trigger = TriggerBuilder.newTrigger()
            .withIdentity(triggerKey)
            .startNow()
            .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"))
            .build();
    scheduler.start();
    scheduler.scheduleJob(jobDetail, trigger);
}

那么最牛皮的是什么呢 

就是 

就是

就是

上面的代码并没有什么卵用!!!!!!

quartz里用到了个数据库的行锁 FOR UPDATE 

sqlite不支持

所以我最终只止步于此  后面还会有啥错误我也不晓得了

我很无奈 所以我只能打算自己加个表简单持久化一下任务 嗯

有没有人这样搞过 成功的话能不能教教我!!!

 类似资料:

相关阅读

相关文章

相关问答