免費(fèi)輿情信息網(wǎng)站微信公眾號(hào)小程序怎么做
數(shù)據(jù)表? 加不加無(wú)所謂,如果需要重啟服務(wù)器后重新執(zhí)行所有JOB就把sql加上
如果不加表? 將application.properties中的quartz數(shù)據(jù)庫(kù)配置去掉?
自己執(zhí)行自己的邏輯來(lái)就好,大不了每次啟動(dòng)之后重新加載自己的邏輯
鏈接:https://pan.baidu.com/s/1KqOPYMfI4eHcEMxt5BmtYg?
提取碼:o9ql?
--來(lái)自百度網(wǎng)盤超級(jí)會(huì)員V4的分享
SpringBoot工程
pom依賴
<dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.26</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><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></dependency><!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- </dependency>--><!--解決加了@ConfigurationProperties注解 類上的提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></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></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
application.properties
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/job3?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=false&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=123456
#
##
#mybatis-plus.configuration.map-underscore-to-camel-case=true
#
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#
#
#mybatis-plus.global-config.db-config.table-prefix=tbl_
#
#
#mybatis-plus.global-config.db-config.id-type=auto# 定時(shí)任務(wù)Quartz的數(shù)據(jù)源配置
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.URL=jdbc:mysql://localhost:3306/job3?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.driver=com.mysql.cj.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.maxConnections=5
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.username=root
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.password=123456
spring.quartz.properties.org.quartz.dataSource.globalJobDataSource.provider=hikaricp# Quartz調(diào)度器配置
spring.quartz.properties.org.quartz.scheduler.instanceName=globalScheduler
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
spring.quartz.properties.org.quartz.scheduler.type=com.alibaba.druid.pool.DruidDataSource# Quartz作業(yè)存儲(chǔ)配置
spring.quartz.properties.org.quartz.jobStore.dataSource=globalJobDataSource
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=100
spring.quartz.properties.org.quartz.jobStore.isClustered=true# Quartz線程池配置
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
包結(jié)構(gòu)
實(shí)體類
package com.example.springbootquartz.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;/*** @author hrui* @date 2023/11/16 22:57*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class JobInfo {/*** 任務(wù)名稱*/private String jobName;/*** 任務(wù)組*/private String jobGroup;/*** 觸發(fā)器名稱*/private String triggerName;/*** 觸發(fā)器組*/private String triggerGroup;/*** cron表達(dá)式*/private String cron;/*** 類名*/private String className;/*** 狀態(tài)*/private String status;/*** 下一次執(zhí)行時(shí)間*/private String nextTime;/*** 上一次執(zhí)行時(shí)間*/private String prevTime;/*** 配置信息(data)*/private String config;}
package com.example.springbootquartz.job;import com.alibaba.fastjson.JSONObject;
import com.example.springbootquartz.pojo.JobInfo;
import org.quartz.*;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;/*** @author hrui* @date 2023/11/16 23:10*/
@Component
public class SchedulerManage {@Autowiredprivate Scheduler scheduler;/*** 添加任務(wù)*/@SuppressWarnings("unchecked")public void addJob(JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {Objects.requireNonNull(jobInfo, "任務(wù)信息不能為空");// 生成job keyJobKey jobKey = JobKey.jobKey(jobInfo.getJobName(), jobInfo.getJobGroup());// 當(dāng)前任務(wù)不存在才進(jìn)行添加if (!scheduler.checkExists(jobKey)) {Class<Job> jobClass = (Class<Job>)Class.forName(jobInfo.getClassName());// 任務(wù)明細(xì)JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobKey).withIdentity(jobInfo.getJobName(), jobInfo.getJobGroup()).withDescription(jobInfo.getJobName()).build();// 配置信息jobDetail.getJobDataMap().put("config", jobInfo.getConfig());// 定義觸發(fā)器TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());// 設(shè)置任務(wù)的觸發(fā)機(jī)制Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(jobInfo.getCron()).withMisfireHandlingInstructionDoNothing()).build();scheduler.scheduleJob(jobDetail, trigger);} else {throw new SchedulerException(jobInfo.getJobName() + "任務(wù)已存在,無(wú)需重復(fù)添加");}}/*** 任務(wù)暫停*/public void pauseJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {scheduler.pauseJob(jobKey);}}/*** 繼續(xù)任務(wù)*/public void continueJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {scheduler.resumeJob(jobKey);}}/*** 刪除任務(wù)*/public boolean deleteJob(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);if (scheduler.checkExists(jobKey)) {// 這里還需要先刪除trigger相關(guān)//TriggerKey triggerKey = TriggerKey.triggerKey(jobInfo.getTriggerName(), jobInfo.getTriggerGroup());//scheduler.getTrigger()//scheduler.rescheduleJob()return scheduler.deleteJob(jobKey);//不需要?jiǎng)h除trigger 一個(gè)job可以有多個(gè)trigger 刪除job同時(shí)源碼底層會(huì)刪除對(duì)應(yīng)trigger}return false;}/*** 獲取任務(wù)信息*/public JobInfo getJobInfo(String jobGroup, String jobName) throws SchedulerException {JobKey jobKey = JobKey.jobKey(jobName, jobGroup);if (!scheduler.checkExists(jobKey)) {return null;}List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);if (Objects.isNull(triggers)) {throw new SchedulerException("未獲取到觸發(fā)器信息");}TriggerKey triggerKey = triggers.get(0).getKey();Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey);JobDetail jobDetail = scheduler.getJobDetail(jobKey);JobInfo jobInfo = new JobInfo();jobInfo.setJobName(jobGroup);jobInfo.setJobGroup(jobName);jobInfo.setTriggerName(triggerKey.getName());jobInfo.setTriggerGroup(triggerKey.getGroup());jobInfo.setClassName(jobDetail.getJobClass().getName());jobInfo.setStatus(triggerState.toString());if (Objects.nonNull(jobDetail.getJobDataMap())) {jobInfo.setConfig(JSONObject.toJSONString(jobDetail.getJobDataMap()));}CronTrigger theTrigger = (CronTrigger) triggers.get(0);jobInfo.setCron(theTrigger.getCronExpression());return jobInfo;}}
package com.example.springbootquartz.job;import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.scheduling.quartz.QuartzJobBean;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;/*** @author hrui* @date 2023/11/16 22:58*/
@DisallowConcurrentExecution//避免并發(fā)執(zhí)行
@PersistJobDataAfterExecution//Job狀態(tài)
public class QuartzJob1 extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) {System.out.println("QuartzJob1正在執(zhí)行..."+getTime());}private String getTime(){DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");return dateFormat.format(new Date());}}
控制器
package com.example.springbootquartz.controller;import com.example.springbootquartz.job.SchedulerManage;
import com.example.springbootquartz.pojo.JobInfo;
import org.quartz.*;
import org.quartz.impl.StdScheduler;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;/*** @author hrui* @date 2023/11/16 23:13*/
@RestController
@RequestMapping("/job")
public class QuartzController {@Autowiredprivate SchedulerManage schedulerManage;@Autowiredprivate Scheduler scheduler;//StdScheduler@Autowiredprivate SchedulerFactoryBean SchedulerFactoryBean;/*** 查詢所有的任務(wù)*/@RequestMapping("/all")public List<JobInfo> list() throws SchedulerException {List<JobInfo> jobInfos = new ArrayList<>();List<String> triggerGroupNames = scheduler.getTriggerGroupNames();for (String triggerGroupName : triggerGroupNames) {Set<TriggerKey> triggerKeySet = scheduler.getTriggerKeys(GroupMatcher.triggerGroupEquals(triggerGroupName));for (TriggerKey triggerKey : triggerKeySet) {Trigger trigger = scheduler.getTrigger(triggerKey);JobKey jobKey = trigger.getJobKey();JobInfo jobInfo = schedulerManage.getJobInfo(jobKey.getGroup(), jobKey.getName());jobInfos.add(jobInfo);}}return jobInfos;}/*** 添加任務(wù)*/@PostMapping("/add")public JobInfo addJob(@RequestBody JobInfo jobInfo) throws SchedulerException, ClassNotFoundException {schedulerManage.addJob(jobInfo);return jobInfo;}/*** 暫停任務(wù)*/@RequestMapping("/pause")public void pauseJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)throws SchedulerException {schedulerManage.pauseJob(jobGroup, jobName);}/*** 繼續(xù)任務(wù)*/@RequestMapping("/continue")public void continueJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)throws SchedulerException {schedulerManage.continueJob(jobGroup, jobName);}/*** 刪除任務(wù)*/@RequestMapping("/delete")public boolean deleteJob(@RequestParam("jobGroup") String jobGroup, @RequestParam("jobName") String jobName)throws SchedulerException {return schedulerManage.deleteJob(jobGroup, jobName);}}
{
????"jobName":"job1",
????"jobGroup":"group1",
????"triggerName":"trigger1",
????"triggerGroup":"tGroup1",
????"cron":"*/5?*?*?*?*??",
????"className":"com.example.springbootquartz.job.QuartzJob1"
}