首先引入我们的非常牛皮的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不支持
所以我最终只止步于此 后面还会有啥错误我也不晓得了
我很无奈 所以我只能打算自己加个表简单持久化一下任务 嗯
有没有人这样搞过 成功的话能不能教教我!!!