这篇文章主要介绍如何集合SpringBoot+Quartz+数据库存储,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

官网:http://www.quartz-scheduler.org/

我们所需数据库

pom依赖

<artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory></resource><!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--><resource><directory>src/main/resources</directory><includes><include>*.properties</include><include>*.xml</include><include>*.yml</include></includes></resource></resources><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><dependencies><!--使用Mybatis-generator插件不能使用太高版本的mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies><configuration><overwrite>true</overwrite></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Quartz默认的连接池是c3p0,如果你的连接池不同需要直接替换它的配置文件,比如我用的连接池是druid,就需要自己改配置(如果就用c3p0就不需要改) 工具类 utils MyJobFactory

packagecom.wsy.quartz02.utils;importlombok.extern.slf4j.Slf4j;importorg.quartz.spi.TriggerFiredBundle;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.config.AutowireCapableBeanFactory;importorg.springframework.scheduling.quartz.AdaptableJobFactory;importorg.springframework.stereotype.Component;/***@author干的漂亮*@sitewww.wangmage.com*@company干得漂亮公司*@create2019-11-1517:05*/@Component@Slf4jpublicclassMyJobFactoryextendsAdaptableJobFactory{//这个对象Spring会帮我们自动注入进来@AutowiredprivateAutowireCapableBeanFactoryautowireCapableBeanFactory;//重写创建Job任务的实例方法@OverrideprotectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{ObjectjobInstance=super.createJobInstance(bundle);//通过以下方式,解决Job任务无法使用Spring中的Bean问题autowireCapableBeanFactory.autowireBean(jobInstance);returnsuper.createJobInstance(bundle);}}

DruidConnectionProvider

packagecom.wsy.quartz02.utils;importcom.alibaba.druid.pool.DruidDataSource;importorg.quartz.SchedulerException;importorg.quartz.utils.ConnectionProvider;importjava.sql.Connection;importjava.sql.SQLException;/*#============================================================================#JDBC#============================================================================org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.useProperties:falseorg.quartz.jobStore.dataSource:qzDS#org.quartz.dataSource.qzDS.connectionProvider.class:org.quartz.utils.PoolingConnectionProviderorg.quartz.dataSource.qzDS.connectionProvider.class:com.zking.q03.quartz.DruidConnectionProviderorg.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driverorg.quartz.dataSource.qzDS.URL:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8org.quartz.dataSource.qzDS.user:rootorg.quartz.dataSource.qzDS.password:rootorg.quartz.dataSource.qzDS.maxConnections:30org.quartz.dataSource.qzDS.validationQuery:select0*//***@author干的漂亮*@sitewww.wangmage.com*@company干得漂亮公司*@create2019-11-1517:02*//***[Druid连接池的Quartz扩展类]**@ProjectName:[]*@Author:[xuguang]*@CreateDate:[2015/11/1017:58]*@Update:[说明本次修改内容]BY[xuguang][2015/11/10]*@Version:[v1.0]*/publicclassDruidConnectionProviderimplementsConnectionProvider{/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*///JDBC驱动publicStringdriver;//JDBC连接串publicStringURL;//数据库用户名publicStringuser;//数据库用户密码publicStringpassword;//数据库最大连接数publicintmaxConnection;//数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。publicStringvalidationQuery;privatebooleanvalidateOnCheckout;privateintidleConnectionValidationSeconds;publicStringmaxCachedStatementsPerConnection;privateStringdiscardIdleConnectionsSeconds;publicstaticfinalintDEFAULT_DB_MAX_CONNECTIONS=10;publicstaticfinalintDEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION=120;//Druid连接池privateDruidDataSourcedatasource;/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**接口实现**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/publicConnectiongetConnection()throwsSQLException{returndatasource.getConnection();}publicvoidshutdown()throwsSQLException{datasource.close();}publicvoidinitialize()throwsSQLException{if(this.URL==null){thrownewSQLException("DBPoolcouldnotbecreated:DBURLcannotbenull");}if(this.driver==null){thrownewSQLException("DBPooldrivercouldnotbecreated:DBdriverclassnamecannotbenull!");}if(this.maxConnection<0){thrownewSQLException("DBPoolmaxConnectinscouldnotbecreated:Maxconnectionsmustbegreaterthanzero!");}datasource=newDruidDataSource();try{datasource.setDriverClassName(this.driver);}catch(Exceptione){try{thrownewSchedulerException("Problemsettingdriverclassnameondatasource:"+e.getMessage(),e);}catch(SchedulerExceptione1){}}datasource.setUrl(this.URL);datasource.setUsername(this.user);datasource.setPassword(this.password);datasource.setMaxActive(this.maxConnection);datasource.setMinIdle(1);datasource.setMaxWait(0);datasource.setMaxPoolPreparedStatementPerConnectionSize(this.DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION);if(this.validationQuery!=null){datasource.setValidationQuery(this.validationQuery);if(!this.validateOnCheckout)datasource.setTestOnReturn(true);elsedatasource.setTestOnBorrow(true);datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds);}}/**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**提供getset方法**~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/publicStringgetDriver(){returndriver;}publicvoidsetDriver(Stringdriver){this.driver=driver;}publicStringgetURL(){returnURL;}publicvoidsetURL(StringURL){this.URL=URL;}publicStringgetUser(){returnuser;}publicvoidsetUser(Stringuser){this.user=user;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicintgetMaxConnection(){returnmaxConnection;}publicvoidsetMaxConnection(intmaxConnection){this.maxConnection=maxConnection;}publicStringgetValidationQuery(){returnvalidationQuery;}publicvoidsetValidationQuery(StringvalidationQuery){this.validationQuery=validationQuery;}publicbooleanisValidateOnCheckout(){returnvalidateOnCheckout;}publicvoidsetValidateOnCheckout(booleanvalidateOnCheckout){this.validateOnCheckout=validateOnCheckout;}publicintgetIdleConnectionValidationSeconds(){returnidleConnectionValidationSeconds;}publicvoidsetIdleConnectionValidationSeconds(intidleConnectionValidationSeconds){this.idleConnectionValidationSeconds=idleConnectionValidationSeconds;}publicDruidDataSourcegetDatasource(){returndatasource;}publicvoidsetDatasource(DruidDataSourcedatasource){this.datasource=datasource;}}

application.yml

server:servlet:context-path:/port:80spring:datasource:#1.JDBCtype:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.jdbc.Driverurl:jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8username:rootpassword:123druid:#2.连接池配置#初始化连接池的连接数量大小,最小,最大initial-size:5min-idle:5max-active:20#配置获取连接等待超时的时间max-wait:60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis:60000#配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis:30000validation-query:SELECT1FROMDUALtest-while-idle:truetest-on-borrow:truetest-on-return:false#是否缓存preparedStatement,也就是PSCache官方建议MySQL下建议关闭个人建议如果想用SQL防火墙建议打开pool-prepared-statements:truemax-pool-prepared-statement-per-connection-size:20#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filter:stat:merge-sql:trueslow-sql-millis:5000#3.基础监控配置web-stat-filter:enabled:trueurl-pattern:/*#设置不统计哪些URLexclusions:"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable:truesession-stat-max-count:100stat-view-servlet:enabled:trueurl-pattern:/druid/*reset-enable:true#设置监控页面的登录名和密码login-username:adminlogin-password:adminallow:127.0.0.1#deny:192.168.1.100#显示日志logging:level:com.wsy.quartz02.mapper:debug

quartz.properties

##============================================================================#ConfigureMainSchedulerProperties调度器属性#============================================================================org.quartz.scheduler.instanceName:DefaultQuartzSchedulerorg.quartz.scheduler.instanceId=AUTOorg.quartz.scheduler.rmi.export:falseorg.quartz.scheduler.rmi.proxy:falseorg.quartz.scheduler.wrapJobExecutionInUserTransaction:falseorg.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount=10org.quartz.threadPool.threadPriority:5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread:trueorg.quartz.jobStore.misfireThreshold:60000#============================================================================#ConfigureJobStore#============================================================================#存储方式使用JobStoreTX,也就是数据库org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate#使用自己的配置文件org.quartz.jobStore.useProperties:true#数据库中quartz表的表名前缀org.quartz.jobStore.tablePrefix:qrtz_org.quartz.jobStore.dataSource:qzDS#是否使用集群(如果项目只部署到一台服务器,就不用了)org.quartz.jobStore.isClustered=true#============================================================================#ConfigureDatasources#============================================================================#配置数据库源(org.quartz.dataSource.qzDS.maxConnections:c3p0配置的是有s的,druid数据源没有s)org.quartz.dataSource.qzDS.connectionProvider.class:com.wsy.quartz02.utils.DruidConnectionProviderorg.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driverorg.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8org.quartz.dataSource.qzDS.user:rootorg.quartz.dataSource.qzDS.password:123org.quartz.dataSource.qzDS.maxConnection:10

ScheduleTriggerMapper

packagecom.wsy.quartz02.mapper;importcom.wsy.quartz02.model.ScheduleTrigger;importorg.springframework.stereotype.Repository;importjava.util.List;@RepositorypublicinterfaceScheduleTriggerMapper{intdeleteByPrimaryKey(Integerid);intinsert(ScheduleTriggerrecord);intinsertSelective(ScheduleTriggerrecord);ScheduleTriggerselectByPrimaryKey(Integerid);intupdateByPrimaryKeySelective(ScheduleTriggerrecord);intupdateByPrimaryKey(ScheduleTriggerrecord);/***查询触发器中包含的所有任务*@return*/List<ScheduleTrigger>queryScheduleTriggerLst();}

ScheduleTriggerParamMapper

packagecom.wsy.quartz02.mapper;importcom.wsy.quartz02.model.ScheduleTriggerParam;importorg.springframework.stereotype.Repository;importjava.util.List;@RepositorypublicinterfaceScheduleTriggerParamMapper{intdeleteByPrimaryKey(Integerparam_id);intinsert(ScheduleTriggerParamrecord);intinsertSelective(ScheduleTriggerParamrecord);ScheduleTriggerParamselectByPrimaryKey(Integerparam_id);intupdateByPrimaryKeySelective(ScheduleTriggerParamrecord);intupdateByPrimaryKey(ScheduleTriggerParamrecord);/***查询出当前任务类对应所需的参数*@paramtriggerId*@return*/List<ScheduleTriggerParam>queryScheduleParamLst(IntegertriggerId);}

ScheduleTriggerParam

<selectid="queryScheduleParamLst"resultType="com.wsy.quartz02.model.ScheduleTriggerParam">select<includerefid="Base_Column_List"/>fromt_schedule_trigger_paramwhereschedule_trigger_id=#{triggerId}</select>

ScheduleTrigger

<selectid="queryScheduleTriggerLst"resultType="com.wsy.quartz02.model.ScheduleTrigger">select<includerefid="Base_Column_List"/>fromt_schedule_trigger</select>

QuartzConfiguration

packagecom.wsy.config;importcom.wsy.quartz02.utils.MyJobFactory;importorg.quartz.Scheduler;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.config.PropertiesFactoryBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.io.ClassPathResource;importorg.springframework.scheduling.quartz.SchedulerFactoryBean;importjava.io.IOException;importjava.util.Properties;@ConfigurationpublicclassQuartzConfiguration{@AutowiredprivateMyJobFactorymyJobFactory;//创建调度器工厂@BeanpublicSchedulerFactoryBeanschedulerFactoryBean(){//1.创建SchedulerFactoryBean//2.加载自定义的quartz.properties配置文件//3.设置MyJobFactorySchedulerFactoryBeanfactoryBean=newSchedulerFactoryBean();try{factoryBean.setQuartzProperties(quartzProperties());factoryBean.setJobFactory(myJobFactory);returnfactoryBean;}catch(IOExceptione){thrownewRuntimeException(e);}}publicPropertiesquartzProperties()throwsIOException{PropertiesFactoryBeanpropertiesFactoryBean=newPropertiesFactoryBean();propertiesFactoryBean.setLocation(newClassPathResource("/quartz.properties"));propertiesFactoryBean.afterPropertiesSet();returnpropertiesFactoryBean.getObject();@Bean(name="scheduler")publicSchedulerscheduler(){returnschedulerFactoryBean().getScheduler();}

MyJob

packagecom.wsy.quartz02.job;importlombok.extern.slf4j.Slf4j;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;importorg.springframework.stereotype.Component;importjava.util.Date;@Component@Slf4jpublicclassMyJobimplementsJob{@Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{System.err.println("MyJob是一个空的任务计划,时间:"+newDate().toLocaleString());}}

MyJob1

packagecom.wsy.quartz02.job;importlombok.extern.slf4j.Slf4j;importorg.quartz.*;importorg.springframework.stereotype.Component;importjava.util.Date;@Component@Slf4jpublicclassMyJob1implementsJob{@Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{JobDetailjobDetail=jobExecutionContext.getJobDetail();JobDataMapjobDataMap=jobDetail.getJobDataMap();System.out.println(newDate().toLocaleString()+"-->携带参数个数:"+jobDataMap.size());}}

MyJob2

packagecom.wsy.quartz02.job;importlombok.extern.slf4j.Slf4j;importorg.quartz.*;importorg.springframework.stereotype.Component;importjava.util.Date;@Component@Slf4jpublicclassMyJob2implementsJob{@Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{JobDetailjobDetail=jobExecutionContext.getJobDetail();JobDataMapjobDataMap=jobDetail.getJobDataMap();System.out.println(newDate().toLocaleString()+"-->MyJob2参数传递name="+jobDataMap.get("name")+",score="+jobDataMap.get("score"));}}

Quartz02Controller

packagecom.wsy.quartz02.controler;importcom.wsy.quartz02.model.ScheduleTrigger;importcom.wsy.quartz02.service.ScheduleTriggerService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importjava.util.List;/***@author干的漂亮*@sitewww.wangmage.com*@company干得漂亮公司*@create2019-11-1616:02*/@Controller@RequestMapping("/quartz")publicclassQuartz02Controller{@AutowiredprivateScheduleTriggerServicescheduleTriggerService;@RequestMapping("/list")publicModelAndViewgetAll(){ModelAndViewmv=newModelAndView();List<ScheduleTrigger>list=scheduleTriggerService.queryScheduleTriggerLst();mv.addObject("quartzList",list);mv.setViewName("index");returnmv;}@RequestMapping("/edit")publicStringeditStatus(ScheduleTriggerscheduleTrigger){intn=scheduleTriggerService.updateByPrimaryKeySelective(scheduleTrigger);return"redirect:/quartz/list";}@RequestMapping("/proSave/{id}")publicModelAndViewproSave(@PathVariable(value="id")Integerid){ModelAndViewmv=newModelAndView();ScheduleTriggerscheduleTrigger=scheduleTriggerService.selectByPrimaryKey(id);mv.addObject("schedule",scheduleTrigger);mv.setViewName("edit");returnmv;}}

ScheduleTriggerService

packagecom.wsy.quartz02.service;importcom.wsy.quartz02.model.ScheduleTrigger;importjava.util.List;/***@author干的漂亮*@sitewww.wangmage.com*@company干得漂亮公司*@create2019-11-1616:02*/publicinterfaceScheduleTriggerService{intdeleteByPrimaryKey(Integerid);intinsert(ScheduleTriggerrecord);intinsertSelective(ScheduleTriggerrecord);ScheduleTriggerselectByPrimaryKey(Integerid);intupdateByPrimaryKeySelective(ScheduleTriggerrecord);intupdateByPrimaryKey(ScheduleTriggerrecord);/***查询触发器中包含的所有任务*@return*/List<ScheduleTrigger>queryScheduleTriggerLst();}

Quartz02Application

packagecom.wsy.quartz02;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.scheduling.annotation.EnableScheduling;importorg.springframework.transaction.annotation.EnableTransactionManagement;@MapperScan("com.wsy.quartz02.mapper")@EnableTransactionManagement@EnableScheduling@SpringBootApplicationpublicclassQuartz02Application{publicstaticvoidmain(String[]args){SpringApplication.run(Quartz02Application.class,args);}}

界面

<!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><title>quartz定时任务管理</title></head><body><h2>定时任务</h2><tablealign="center"border="1px"width="50%"><tr><td>id</td><td>表达式</td><td>状态</td><td>工作类</td><td>分组</td><td>操作</td></tr><trth:each="q:${quartzList}"><tdth:text="${q.id}"></td><tdth:text="${q.cron}"></td><tdth:text="${q.status}"></td><tdth:text="${q.job_name}"></td><tdth:text="${q.job_group}"></td><tdth:switch="${q.status}==0"><ath:case="true"th:href="@{/quartz/edit(id=${q.id},status=1)}"rel="externalnofollow">启动</a><ath:case="false"th:href="@{/quartz/edit(id=${q.id},status=0)}"rel="externalnofollow">停止</a><ath:href="@{'/quartz/proSave/'+${q.id}}"rel="externalnofollow">编辑</a><ath:href="@{'/add/'}"rel="externalnofollow">增加</a></td></tr></table></body></html>

edit.html

<!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><title>修改定时任务</title></head><body><h2>修改定时任务</h2><formth:action="@{/quartz/edit}"method="post"><inputtype="hidden"name="id"th:value="${schedule.id}"/>表达式:<inputwidth="300px"type="text"name="cron"th:value="${schedule.cron}"/></br>工作类:<inputwidth="300px"type="text"name="job_name"th:value="${schedule.job_name}"/></br>分组:<inputwidth="300px"type="text"name="job_group"th:value="${schedule.job_group}"/></br><inputtype="submit"value="提交"/></form></body></html>

以上是“如何集合SpringBoot+Quartz+数据库存储”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!