diff --git a/.gitignore b/.gitignore index 50eb0af8472709eecdab4eabed78752d02fb2d6e..00793e45ac33ed8ebfc1c8b6ca01f5e283decf2b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ /.settings/ *.project *.classpath -*apiclient_cert.p12 \ No newline at end of file +*apiclient_cert.p12 +.idea +spring-data-quartz.iml \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/config/IndexController.java b/src/main/java/com/itstyle/quartz/config/IndexController.java index 5970e1213a9f3afbe724888c5784b7b197d0c94a..08beb35e8675bc113bbbacbfe719729f145e0b2b 100644 --- a/src/main/java/com/itstyle/quartz/config/IndexController.java +++ b/src/main/java/com/itstyle/quartz/config/IndexController.java @@ -1,34 +1,34 @@ -package com.itstyle.quartz.config; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -/** - * 通用访问拦截匹配 - * 创建者 爪哇笔记 - * 创建时间 2018年4月3日 - */ -@Controller -public class IndexController { - - /** - * 页面跳转 - * @param url - * @return - */ - @RequestMapping("{url}.shtml") - public String page(@PathVariable("url") String url) { - return url; - } - /** - * 页面跳转(二级目录) - * @param module - * @param url - * @param url - * @return - */ - @RequestMapping("{module}/{url}.shtml") - public String page(@PathVariable("module") String module,@PathVariable("url") String url) { - return module + "/" + url; - } - -} +//package com.itstyle.quartz.config; +//import org.springframework.stereotype.Controller; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.RequestMapping; +///** +// * 通用访问拦截匹配 +// * 创建者 爪哇笔记 +// * 创建时间 2018年4月3日 +// */ +//@Controller +//public class IndexController { +// +// /** +// * 页面跳转 +// * @param url +// * @return +// */ +// @RequestMapping("{url}.shtml") +// public String page(@PathVariable("url") String url) { +// return url; +// } +// /** +// * 页面跳转(二级目录) +// * @param module +// * @param url +// * @param url +// * @return +// */ +// @RequestMapping("{module}/{url}.shtml") +// public String page(@PathVariable("module") String module,@PathVariable("url") String url) { +// return module + "/" + url; +// } +// +//} diff --git a/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java b/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java index d77869a67e856782f2f83178cef76f70f739ed4f..95258feb5bab0940bbdef5ac8f6b7cad1080e665 100644 --- a/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java +++ b/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java @@ -1,58 +1,56 @@ package com.itstyle.quartz.config; -import java.io.IOException; -import java.util.Properties; -import org.quartz.Scheduler; -import org.quartz.ee.servlet.QuartzInitializerListener; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import javax.sql.DataSource; +import java.util.Properties; + /** - * quartz配置 - * 创建者 爪哇笔记 - * 创建时间 2018年4月3日 + * pry */ @Configuration public class SchedulerConfig { - - @Autowired - private SpringJobFactory springJobFactory; - - @Bean(name="SchedulerFactory") - public SchedulerFactoryBean schedulerFactoryBean() throws IOException { - SchedulerFactoryBean factory = new SchedulerFactoryBean(); - factory.setAutoStartup(true); - factory.setStartupDelay(5);//延时5秒启动 - factory.setQuartzProperties(quartzProperties()); - factory.setJobFactory(springJobFactory); - return factory; - } @Bean - public Properties quartzProperties() throws IOException { - PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); - propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); - propertiesFactoryBean.afterPropertiesSet(); - return propertiesFactoryBean.getObject(); - } + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) + { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); - /* - * quartz初始化监听器 - */ - @Bean - public QuartzInitializerListener executorListener() { - return new QuartzInitializerListener(); - } + // quartz参数 + Properties prop = new Properties(); + prop.put("org.quartz.scheduler.instanceName", "pryScheduler"); + prop.put("org.quartz.scheduler.instanceId", "AUTO"); + // 线程池配置 + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", "20"); + prop.put("org.quartz.threadPool.threadPriority", "5"); + // JobStore配置 + prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); + // 集群配置 + prop.put("org.quartz.jobStore.isClustered", "true"); + prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); + prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); + prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); - /* - * 通过SchedulerFactoryBean获取Scheduler的实例 - */ - @Bean(name="Scheduler") - public Scheduler scheduler() throws IOException { - return schedulerFactoryBean().getScheduler(); - } + // sqlserver 启用 + // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); + prop.put("org.quartz.jobStore.misfireThreshold", "12000"); + prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); + factory.setQuartzProperties(prop); + factory.setSchedulerName("pryScheduler"); + // 延时启动 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey("applicationContextKey"); + // 可选,QuartzScheduler + // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 + factory.setOverwriteExistingJobs(true); + // 设置自动启动,默认为true + factory.setAutoStartup(true); + + return factory; + } } \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/config/SpringJobFactory.java b/src/main/java/com/itstyle/quartz/config/SpringJobFactory.java index bd1e766ff96e86e0157c06b7e965ee287d0c4a16..26befb5c221f82647ee429c24e0deb36b86e2869 100644 --- a/src/main/java/com/itstyle/quartz/config/SpringJobFactory.java +++ b/src/main/java/com/itstyle/quartz/config/SpringJobFactory.java @@ -1,24 +1,24 @@ -package com.itstyle.quartz.config; - -import org.quartz.spi.TriggerFiredBundle; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.scheduling.quartz.AdaptableJobFactory; -import org.springframework.stereotype.Component; -/** - * 解决spring bean注入Job的问题 - */ -@Component -public class SpringJobFactory extends AdaptableJobFactory { - @Autowired - private AutowireCapableBeanFactory capableBeanFactory; - - @Override - protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { - // 调用父类的方法 - Object jobInstance = super.createJobInstance(bundle); - // 进行注入 - capableBeanFactory.autowireBean(jobInstance); - return jobInstance; - } -} \ No newline at end of file +//package com.itstyle.quartz.config; +// +//import org.quartz.spi.TriggerFiredBundle; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +//import org.springframework.scheduling.quartz.AdaptableJobFactory; +//import org.springframework.stereotype.Component; +///** +// * 解决spring bean注入Job的问题 +// */ +//@Component +//public class SpringJobFactory extends AdaptableJobFactory { +// @Autowired +// private AutowireCapableBeanFactory capableBeanFactory; +// +// @Override +// protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { +// // 调用父类的方法 +// Object jobInstance = super.createJobInstance(bundle); +// // 进行注入 +// capableBeanFactory.autowireBean(jobInstance); +// return jobInstance; +// } +//} \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/config/TaskRunner.java b/src/main/java/com/itstyle/quartz/config/TaskRunner.java index ff66a8d5992fd8c0cf348847192a0e10e71e378a..b7bd7a1ddf9c92836ac8b7b64852ddc3e906a001 100644 --- a/src/main/java/com/itstyle/quartz/config/TaskRunner.java +++ b/src/main/java/com/itstyle/quartz/config/TaskRunner.java @@ -1,21 +1,19 @@ package com.itstyle.quartz.config; -import org.quartz.CronScheduleBuilder; -import org.quartz.JobBuilder; -import org.quartz.JobDetail; -import org.quartz.Scheduler; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; +import com.itstyle.quartz.job.TestJob; +import com.itstyle.quartz.util.QuartzModel; +import com.itstyle.quartz.util.ScheduleUtils; +import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; -import com.itstyle.quartz.entity.QuartzEntity; -import com.itstyle.quartz.service.IJobService; +import java.util.ArrayList; +import java.util.List; + /** * 初始化一个测试Demo任务 * 创建者 爪哇笔记 @@ -23,43 +21,33 @@ import com.itstyle.quartz.service.IJobService; */ @Component public class TaskRunner implements ApplicationRunner{ - + private final static Logger LOGGER = LoggerFactory.getLogger(TaskRunner.class); - + + @Autowired - private IJobService jobService; - @Autowired @Qualifier("Scheduler") - private Scheduler scheduler; - + private Scheduler scheduler; + + private List quartModels = new ArrayList(); + + public void initQuarts(){ + quartModels.add(new QuartzModel("*/10 * * * * ?","com.itstyle.quartz.job.MyJob","test")); + quartModels.add(new QuartzModel("*/30 * * * * ?","com.itstyle.quartz.job.MyJob2","test")); + } + @Override public void run(ApplicationArguments var) throws Exception{ - /** - * 系统启动的时候会初始化一个任务 - */ - Long count = jobService.listQuartzEntity(null); - if(count==0){ - LOGGER.info("初始化测试任务"); - QuartzEntity quartz = new QuartzEntity(); - quartz.setJobName("test01"); - quartz.setJobGroup("test"); - quartz.setDescription("测试任务"); - quartz.setJobClassName("com.itstyle.quartz.job.ChickenJob"); - quartz.setCronExpression("*/5 * * * * ?"); - quartz.setJobMethodName("test1"); - Class cls = Class.forName(quartz.getJobClassName()) ; - cls.newInstance(); - //构建job信息 - JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(), - quartz.getJobGroup()) - .withDescription(quartz.getDescription()).build(); - job.getJobDataMap().put("jobMethodName", "test1"); - // 触发时间点 - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression()); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+quartz.getJobName(), quartz.getJobGroup()) - .startNow().withSchedule(cronScheduleBuilder).build(); - //交由Scheduler安排触发 - scheduler.scheduleJob(job, trigger); - } - } + initQuarts(); + scheduler.clear(); + if(!quartModels.isEmpty()){ + quartModels.forEach(t->{ + try { + ScheduleUtils.createScheduleJob(scheduler,t); + } catch (SchedulerException e) { + e.printStackTrace(); + } + }); + } + } } \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQuery.java b/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQuery.java index 5cb1bc94d17d122f4d5b7c486bf84f93cc3481ba..054f9b03702445a85b83975f0502b123597994e7 100644 --- a/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQuery.java +++ b/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQuery.java @@ -15,7 +15,7 @@ public interface DynamicQuery { void delete(Class entityClass, Object entityid); void delete(Class entityClass, Object[] entityids); - + /** * 查询对象列表,返回List * @param nativeSql @@ -27,7 +27,7 @@ public interface DynamicQuery { * */ List nativeQueryList(String nativeSql, Object... params); - + /** * 查询对象列表,返回List> * @param nativeSql @@ -52,7 +52,7 @@ public interface DynamicQuery { * */ List nativeQueryListModel(Class resultClass, String nativeSql, Object... params); - + /** * 执行nativeSql统计查询 * @param nativeSql diff --git a/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQueryImpl.java b/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQueryImpl.java index 83c796fdab4faf997c063f0266698378e0ba3825..3b4d5fb5f949a1215e704619b4411c130d36096c 100644 --- a/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQueryImpl.java +++ b/src/main/java/com/itstyle/quartz/dynamicquery/DynamicQueryImpl.java @@ -65,7 +65,7 @@ public class DynamicQueryImpl implements DynamicQuery { q.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST); return q.getResultList(); } - + @SuppressWarnings("unchecked") @Override public List nativeQueryListModel(Class resultClass, @@ -82,7 +82,7 @@ public class DynamicQueryImpl implements DynamicQuery { q.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); return q.getResultList(); } - + @Override public Long nativeQueryCount(String nativeSql, Object... params) { Object count = createNativeQuery(nativeSql, params).getSingleResult(); diff --git a/src/main/java/com/itstyle/quartz/dynamicquery/NativeQueryResultEntity.java b/src/main/java/com/itstyle/quartz/dynamicquery/NativeQueryResultEntity.java index 58928ab0a2d7315eb0cafc9bbbe78e079d84ec68..dd67e68bf37f58488be6f9aabef9bdfe10a844d3 100644 --- a/src/main/java/com/itstyle/quartz/dynamicquery/NativeQueryResultEntity.java +++ b/src/main/java/com/itstyle/quartz/dynamicquery/NativeQueryResultEntity.java @@ -1,11 +1,11 @@ -package com.itstyle.quartz.dynamicquery; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface NativeQueryResultEntity { - -} +//package com.itstyle.quartz.dynamicquery; +//import java.lang.annotation.ElementType; +//import java.lang.annotation.Retention; +//import java.lang.annotation.RetentionPolicy; +//import java.lang.annotation.Target; +// +//@Target(ElementType.TYPE) +//@Retention(RetentionPolicy.RUNTIME) +//public @interface NativeQueryResultEntity { +// +//} diff --git a/src/main/java/com/itstyle/quartz/entity/QuartzEntity.java b/src/main/java/com/itstyle/quartz/entity/QuartzEntity.java index 52fc3c80712af701c3e4a053fa9902be7e991176..6d44446c9e15fd94426c8f4c054bf58cf314bc37 100644 --- a/src/main/java/com/itstyle/quartz/entity/QuartzEntity.java +++ b/src/main/java/com/itstyle/quartz/entity/QuartzEntity.java @@ -9,7 +9,7 @@ import lombok.Data; */ @Data public class QuartzEntity{ - + private String jobName;//任务名称 private String jobGroup;//任务分组 private String description;//任务描述 @@ -18,7 +18,7 @@ public class QuartzEntity{ private String cronExpression;//执行时间 private String triggerName;//执行时间 private String triggerState;//任务状态 - + private String oldJobName;//任务名称 用于修改 private String oldJobGroup;//任务分组 用于修改 } diff --git a/src/main/java/com/itstyle/quartz/entity/Result.java b/src/main/java/com/itstyle/quartz/entity/Result.java index ea0abb811bdefee33d410f0f10499c0bf49cb493..5c9bd670981ffa5852f5a8d2b0c1b97a728b131d 100644 --- a/src/main/java/com/itstyle/quartz/entity/Result.java +++ b/src/main/java/com/itstyle/quartz/entity/Result.java @@ -1,55 +1,55 @@ -package com.itstyle.quartz.entity; - -import java.util.HashMap; -import java.util.Map; -/** - * 页面响应entity - * 创建者 张志朋 - * 创建时间 2018年3月8日 - */ -public class Result extends HashMap { - - private static final long serialVersionUID = 1L; - - public Result() { - put("code", 0); - } - - public static Result error() { - return error(500, "未知异常,请联系管理员"); - } - - public static Result error(String msg) { - return error(500, msg); - } - - public static Result error(int code, String msg) { - Result r = new Result(); - r.put("code", code); - r.put("msg", msg); - return r; - } - - public static Result ok(Object msg) { - Result r = new Result(); - r.put("msg", msg); - return r; - } - - - public static Result ok(Map map) { - Result r = new Result(); - r.putAll(map); - return r; - } - - public static Result ok() { - return new Result(); - } - - @Override - public Result put(String key, Object value) { - super.put(key, value); - return this; - } -} \ No newline at end of file +//package com.itstyle.quartz.entity; +// +//import java.util.HashMap; +//import java.util.Map; +///** +// * 页面响应entity +// * 创建者 张志朋 +// * 创建时间 2018年3月8日 +// */ +//public class Result extends HashMap { +// +// private static final long serialVersionUID = 1L; +// +// public Result() { +// put("code", 0); +// } +// +// public static Result error() { +// return error(500, "未知异常,请联系管理员"); +// } +// +// public static Result error(String msg) { +// return error(500, msg); +// } +// +// public static Result error(int code, String msg) { +// Result r = new Result(); +// r.put("code", code); +// r.put("msg", msg); +// return r; +// } +// +// public static Result ok(Object msg) { +// Result r = new Result(); +// r.put("msg", msg); +// return r; +// } +// +// +// public static Result ok(Map map) { +// Result r = new Result(); +// r.putAll(map); +// return r; +// } +// +// public static Result ok() { +// return new Result(); +// } +// +// @Override +// public Result put(String key, Object value) { +// super.put(key, value); +// return this; +// } +//} \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/interceptor/MyAdapter.java b/src/main/java/com/itstyle/quartz/interceptor/MyAdapter.java index b441cfe10d6af0389562a295297c21107a43f546..8665b01e554dd30b53a759920ae8570261d74459 100644 --- a/src/main/java/com/itstyle/quartz/interceptor/MyAdapter.java +++ b/src/main/java/com/itstyle/quartz/interceptor/MyAdapter.java @@ -1,19 +1,19 @@ -package com.itstyle.quartz.interceptor; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -/** - * 配置首页 - * 创建者 小柒2012 - * 创建时间 2017年9月7日 - */ -@Configuration -public class MyAdapter extends WebMvcConfigurerAdapter{ - @Override - public void addViewControllers( ViewControllerRegistry registry ) { - registry.addViewController( "/" ).setViewName( "forward:/login.shtml" ); - registry.setOrder( Ordered.HIGHEST_PRECEDENCE ); - super.addViewControllers( registry ); - } -} +//package com.itstyle.quartz.interceptor; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.core.Ordered; +//import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +///** +// * 配置首页 +// * 创建者 小柒2012 +// * 创建时间 2017年9月7日 +// */ +//@Configuration +//public class MyAdapter extends WebMvcConfigurerAdapter{ +// @Override +// public void addViewControllers( ViewControllerRegistry registry ) { +// registry.addViewController( "/" ).setViewName( "forward:/login.shtml" ); +// registry.setOrder( Ordered.HIGHEST_PRECEDENCE ); +// super.addViewControllers( registry ); +// } +//} diff --git a/src/main/java/com/itstyle/quartz/job/ChickenJob.java b/src/main/java/com/itstyle/quartz/job/ChickenJob.java index a2818416daa35129d892072581324e835e441049..df9c76af70978094e3dc4880ddc2e83bb4816fdc 100644 --- a/src/main/java/com/itstyle/quartz/job/ChickenJob.java +++ b/src/main/java/com/itstyle/quartz/job/ChickenJob.java @@ -1,46 +1,46 @@ -package com.itstyle.quartz.job; - -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -import org.quartz.*; - -/** - * 实现序列化接口、防止重启应用出现quartz Couldn't retrieve job because a required class was not found 的问题 - * Job 的实例要到该执行它们的时候才会实例化出来。每次 Job 被执行,一个新的 Job 实例会被创建。 - * 其中暗含的意思就是你的 Job 不必担心线程安全性,因为同一时刻仅有一个线程去执行给定 Job 类的实例,甚至是并发执行同一 Job 也是如此。 - * @DisallowConcurrentExecution 保证上一个任务执行完后,再去执行下一个任务,这里的任务是同一个任务 - */ -@DisallowConcurrentExecution -public class ChickenJob implements Job,Serializable { - - private static final long serialVersionUID = 1L; - - @Override - public void execute(JobExecutionContext context){ - JobDetail jobDetail = context.getJobDetail(); - JobDataMap dataMap = jobDetail.getJobDataMap(); - /** - * 获取任务中保存的方法名字,动态调用方法 - */ - String methodName = dataMap.getString("jobMethodName"); - try { - ChickenJob job = new ChickenJob(); - Method method = job.getClass().getMethod(methodName); - method.invoke(job); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - public void test1(){ - System.out.println("测试方法1"); - } - public void test2(){ - System.out.println("测试方法2"); - } -} +//package com.itstyle.quartz.job; +// +//import java.io.Serializable; +//import java.lang.reflect.InvocationTargetException; +//import java.lang.reflect.Method; +// +//import org.quartz.*; +// +///** +// * 实现序列化接口、防止重启应用出现quartz Couldn't retrieve job because a required class was not found 的问题 +// * Job 的实例要到该执行它们的时候才会实例化出来。每次 Job 被执行,一个新的 Job 实例会被创建。 +// * 其中暗含的意思就是你的 Job 不必担心线程安全性,因为同一时刻仅有一个线程去执行给定 Job 类的实例,甚至是并发执行同一 Job 也是如此。 +// * @DisallowConcurrentExecution 保证上一个任务执行完后,再去执行下一个任务,这里的任务是同一个任务 +// */ +//@DisallowConcurrentExecution +//public class ChickenJob implements Job,Serializable { +// +// private static final long serialVersionUID = 1L; +// +// @Override +// public void execute(JobExecutionContext context){ +// JobDetail jobDetail = context.getJobDetail(); +// JobDataMap dataMap = jobDetail.getJobDataMap(); +// /** +// * 获取任务中保存的方法名字,动态调用方法 +// */ +// String methodName = dataMap.getString("jobMethodName"); +// try { +// ChickenJob job = new ChickenJob(); +// Method method = job.getClass().getMethod(methodName); +// method.invoke(job); +// } catch (NoSuchMethodException e) { +// e.printStackTrace(); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } catch (InvocationTargetException e) { +// e.printStackTrace(); +// } +// } +// public void test1(){ +// System.out.println("测试方法1"); +// } +// public void test2(){ +// System.out.println("测试方法2"); +// } +//} diff --git a/src/main/java/com/itstyle/quartz/job/MyJob.java b/src/main/java/com/itstyle/quartz/job/MyJob.java new file mode 100644 index 0000000000000000000000000000000000000000..005359e3c9514ace62ac6011cfeb2284dd9476c6 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/job/MyJob.java @@ -0,0 +1,14 @@ +package com.itstyle.quartz.job; + +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class MyJob { + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public void test(){ + System.out.println("测试test"+sdf.format(new Date())); + } +} diff --git a/src/main/java/com/itstyle/quartz/job/MyJob2.java b/src/main/java/com/itstyle/quartz/job/MyJob2.java new file mode 100644 index 0000000000000000000000000000000000000000..d48ff6bd1a0eabd91f052fbc2b023b94908effe8 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/job/MyJob2.java @@ -0,0 +1,14 @@ +package com.itstyle.quartz.job; + +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Component +public class MyJob2 { + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public void test(){ + System.out.println("测试test2,Myjob2"+sdf.format(new Date())); + } +} diff --git a/src/main/java/com/itstyle/quartz/job/TestJob.java b/src/main/java/com/itstyle/quartz/job/TestJob.java new file mode 100644 index 0000000000000000000000000000000000000000..8c3ec708859ecf6deb5475c1be8aed565ca2bc80 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/job/TestJob.java @@ -0,0 +1,19 @@ +package com.itstyle.quartz.job; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; + +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.Date; + +@DisallowConcurrentExecution +public class TestJob implements Job, Serializable { + final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + System.out.println("test..."+simpleDateFormat.format(new Date())); + } +} diff --git a/src/main/java/com/itstyle/quartz/service/IJobService.java b/src/main/java/com/itstyle/quartz/service/IJobService.java index 2b1bd168a23a50b88eda0ba0ab686ff871e3690b..cea427d13fc8f4eae297c759775d31fabb89fc52 100644 --- a/src/main/java/com/itstyle/quartz/service/IJobService.java +++ b/src/main/java/com/itstyle/quartz/service/IJobService.java @@ -5,8 +5,8 @@ import com.itstyle.quartz.entity.QuartzEntity; import org.quartz.SchedulerException; public interface IJobService { - + List listQuartzEntity(QuartzEntity quartz,Integer pageNo,Integer pageSize) throws SchedulerException; - - Long listQuartzEntity(QuartzEntity quartz); + + Long listQuartzEntity(QuartzEntity quartz); } diff --git a/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java b/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java index 386e6322cae92e87c4b9cf4ba6acc26da9ed107a..b19dfd6041a65b3d74b7a45b6d17afbdd4fd99f7 100644 --- a/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java +++ b/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java @@ -1,24 +1,23 @@ package com.itstyle.quartz.service.impl; -import java.util.List; +import com.itstyle.quartz.dynamicquery.DynamicQuery; +import com.itstyle.quartz.entity.QuartzEntity; +import com.itstyle.quartz.service.IJobService; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; -import com.itstyle.quartz.dynamicquery.DynamicQuery; -import com.itstyle.quartz.entity.QuartzEntity; -import com.itstyle.quartz.service.IJobService; +import java.util.List; @Service("jobService") public class JobServiceImpl implements IJobService { @Autowired private DynamicQuery dynamicQuery; - @Autowired @Qualifier("Scheduler") + @Autowired private Scheduler scheduler; @Override diff --git a/src/main/java/com/itstyle/quartz/util/QuartzDisallowConcurrentExecution.java b/src/main/java/com/itstyle/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000000000000000000000000000000000000..f863cf72521a7366f46940821739812f5c4fb9c1 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,41 @@ +package com.itstyle.quartz.util; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.BeanUtils; + +import java.lang.reflect.Method; + +/** + * 定时任务处理(禁止并发执行) + * + * @author pry + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution implements Job +{ + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + QuartzModel quartzModel = new QuartzModel(); + BeanUtils.copyProperties(jobExecutionContext.getMergedJobDataMap().get(ScheduleUtils.PARAM),quartzModel); + try { + Object otargetObject = SpringUtils.getBean(Class.forName(quartzModel.getTargetObject())); + Method m = null; + try { + m = otargetObject.getClass().getMethod(quartzModel.getTargetMethod(), new Class[] {}); + + m.invoke(otargetObject, new Object[] {}); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + } catch (Exception e) { + throw new JobExecutionException(e); + } + } +} diff --git a/src/main/java/com/itstyle/quartz/util/QuartzModel.java b/src/main/java/com/itstyle/quartz/util/QuartzModel.java new file mode 100644 index 0000000000000000000000000000000000000000..d2d4c43f6e893dd69d15938af961aba424aba362 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/util/QuartzModel.java @@ -0,0 +1,45 @@ +package com.itstyle.quartz.util; + +import java.io.Serializable; + +public class QuartzModel implements Serializable { + private String cron; + + private String targetObject; + + private String targetMethod; + + public QuartzModel(){ + + } + + public QuartzModel(String cron, String targetObject, String targetMethod) { + this.cron = cron; + this.targetObject = targetObject; + this.targetMethod = targetMethod; + } + + public String getCron() { + return cron; + } + + public void setCron(String cron) { + this.cron = cron; + } + + public String getTargetObject() { + return targetObject; + } + + public void setTargetObject(String targetObject) { + this.targetObject = targetObject; + } + + public String getTargetMethod() { + return targetMethod; + } + + public void setTargetMethod(String targetMethod) { + this.targetMethod = targetMethod; + } +} diff --git a/src/main/java/com/itstyle/quartz/util/ScheduleUtils.java b/src/main/java/com/itstyle/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..678ff9ed69d20b7004226fc114e3638e498f95b2 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/util/ScheduleUtils.java @@ -0,0 +1,86 @@ +package com.itstyle.quartz.util; + +import org.quartz.*; + +import java.util.Date; + +/** + * 定时任务工具类 + * + * @author pry + * + */ +public class ScheduleUtils +{ + public final static String PARAM = "SCHEDULE_PARAM"; + + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(jobId+"", jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(jobId+"", jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, QuartzModel quartzModel) throws SchedulerException + { + Class jobClass = QuartzDisallowConcurrentExecution.class; + // 构建job信息 + Long jobId = new Date().getTime(); + String jobGroup = null; + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzModel.getCron()); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(PARAM, quartzModel); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + scheduler.scheduleJob(jobDetail, trigger); + } + +// /** +// * 设置定时任务策略 +// */ +// public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) +// throws TaskException +// { +// switch (job.getMisfirePolicy()) +// { +// case ScheduleConstants.MISFIRE_DEFAULT: +// return cb; +// case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: +// return cb.withMisfireHandlingInstructionIgnoreMisfires(); +// case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: +// return cb.withMisfireHandlingInstructionFireAndProceed(); +// case ScheduleConstants.MISFIRE_DO_NOTHING: +// return cb.withMisfireHandlingInstructionDoNothing(); +// default: +// throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() +// + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); +// } +// } +} \ No newline at end of file diff --git a/src/main/java/com/itstyle/quartz/util/SpringUtils.java b/src/main/java/com/itstyle/quartz/util/SpringUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..c52d3867a8eb37822ef867a10035b51dc3bb39f7 --- /dev/null +++ b/src/main/java/com/itstyle/quartz/util/SpringUtils.java @@ -0,0 +1,114 @@ +package com.itstyle.quartz.util; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author pry + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } +} diff --git a/src/main/java/com/itstyle/quartz/web/JobController.java b/src/main/java/com/itstyle/quartz/web/JobController.java index c4c2b2fc8624dcb3572a8d1a7f6d496467c3fb95..727fccea3ea90ea3436349597d58b008ecfd42fa 100644 --- a/src/main/java/com/itstyle/quartz/web/JobController.java +++ b/src/main/java/com/itstyle/quartz/web/JobController.java @@ -1,120 +1,120 @@ -package com.itstyle.quartz.web; - -import com.itstyle.quartz.entity.QuartzEntity; -import com.itstyle.quartz.entity.Result; -import com.itstyle.quartz.service.IJobService; -import org.quartz.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; - -@RestController -@RequestMapping("/job") -public class JobController { - private final static Logger LOGGER = LoggerFactory.getLogger(JobController.class); - - - @Autowired @Qualifier("Scheduler") - private Scheduler scheduler; - @Autowired - private IJobService jobService; - - @PostMapping("/add") - public Result save(QuartzEntity quartz){ - LOGGER.info("新增任务"); - try { - //获取Scheduler实例、废弃、使用自动注入的scheduler、否则spring的service将无法注入 - //Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); - //如果是修改 展示旧的 任务 - if(quartz.getOldJobGroup()!=null){ - JobKey key = new JobKey(quartz.getOldJobName(),quartz.getOldJobGroup()); - scheduler.deleteJob(key); - } - Class cls = Class.forName(quartz.getJobClassName()) ; - cls.newInstance(); - //构建job信息 - JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(), - quartz.getJobGroup()) - .withDescription(quartz.getDescription()).build(); - job.getJobDataMap().put("jobMethodName", quartz.getJobMethodName()); - // 触发时间点 - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression()); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+quartz.getJobName(), quartz.getJobGroup()) - .startNow().withSchedule(cronScheduleBuilder).build(); - //交由Scheduler安排触发 - scheduler.scheduleJob(job, trigger); - } catch (Exception e) { - e.printStackTrace(); - return Result.error(); - } - return Result.ok(); - } - - @PostMapping("/list") - public Result list(QuartzEntity quartz,Integer pageNo,Integer pageSize) throws SchedulerException { - LOGGER.info("任务列表"); - List list = jobService.listQuartzEntity(quartz, pageNo, pageSize); - return Result.ok(list); - } - - @PostMapping("/trigger") - public Result trigger(QuartzEntity quartz,HttpServletResponse response) { - try { - JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); - scheduler.triggerJob(key); - } catch (SchedulerException e) { - e.printStackTrace(); - return Result.error(); - } - return Result.ok(); - } - @PostMapping("/pause") - public Result pause(QuartzEntity quartz,HttpServletResponse response) { - LOGGER.info("停止任务"); - try { - JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); - scheduler.pauseJob(key); - } catch (SchedulerException e) { - e.printStackTrace(); - return Result.error(); - } - return Result.ok(); - } - @PostMapping("/resume") - public Result resume(QuartzEntity quartz,HttpServletResponse response) { - LOGGER.info("恢复任务"); - try { - JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); - scheduler.resumeJob(key); - } catch (SchedulerException e) { - e.printStackTrace(); - return Result.error(); - } - return Result.ok(); - } - @PostMapping("/remove") - public Result remove(QuartzEntity quartz,HttpServletResponse response) { - try { - - TriggerKey triggerKey = TriggerKey.triggerKey(quartz.getJobName(), quartz.getJobGroup()); - // 停止触发器 - scheduler.pauseTrigger(triggerKey); - // 移除触发器 - scheduler.unscheduleJob(triggerKey); - // 删除任务 - scheduler.deleteJob(JobKey.jobKey(quartz.getJobName(), quartz.getJobGroup())); - System.out.println("removeJob:"+JobKey.jobKey(quartz.getJobName())); - } catch (Exception e) { - e.printStackTrace(); - return Result.error(); - } - return Result.ok(); - } -} +//package com.itstyle.quartz.web; +// +//import com.itstyle.quartz.entity.QuartzEntity; +//import com.itstyle.quartz.entity.Result; +//import com.itstyle.quartz.service.IJobService; +//import org.quartz.*; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//import javax.servlet.http.HttpServletResponse; +//import java.util.List; +// +//@RestController +//@RequestMapping("/job") +//public class JobController { +// private final static Logger LOGGER = LoggerFactory.getLogger(JobController.class); +// +// +// @Autowired @Qualifier("Scheduler") +// private Scheduler scheduler; +// @Autowired +// private IJobService jobService; +// +// @PostMapping("/add") +// public Result save(QuartzEntity quartz){ +// LOGGER.info("新增任务"); +// try { +// //获取Scheduler实例、废弃、使用自动注入的scheduler、否则spring的service将无法注入 +// //Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); +// //如果是修改 展示旧的 任务 +// if(quartz.getOldJobGroup()!=null){ +// JobKey key = new JobKey(quartz.getOldJobName(),quartz.getOldJobGroup()); +// scheduler.deleteJob(key); +// } +// Class cls = Class.forName(quartz.getJobClassName()) ; +// cls.newInstance(); +// //构建job信息 +// JobDetail job = JobBuilder.newJob(cls).withIdentity(quartz.getJobName(), +// quartz.getJobGroup()) +// .withDescription(quartz.getDescription()).build(); +// job.getJobDataMap().put("jobMethodName", quartz.getJobMethodName()); +// // 触发时间点 +// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression()); +// Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+quartz.getJobName(), quartz.getJobGroup()) +// .startNow().withSchedule(cronScheduleBuilder).build(); +// //交由Scheduler安排触发 +// scheduler.scheduleJob(job, trigger); +// } catch (Exception e) { +// e.printStackTrace(); +// return Result.error(); +// } +// return Result.ok(); +// } +// +// @PostMapping("/list") +// public Result list(QuartzEntity quartz,Integer pageNo,Integer pageSize) throws SchedulerException { +// LOGGER.info("任务列表"); +// List list = jobService.listQuartzEntity(quartz, pageNo, pageSize); +// return Result.ok(list); +// } +// +// @PostMapping("/trigger") +// public Result trigger(QuartzEntity quartz,HttpServletResponse response) { +// try { +// JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); +// scheduler.triggerJob(key); +// } catch (SchedulerException e) { +// e.printStackTrace(); +// return Result.error(); +// } +// return Result.ok(); +// } +// @PostMapping("/pause") +// public Result pause(QuartzEntity quartz,HttpServletResponse response) { +// LOGGER.info("停止任务"); +// try { +// JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); +// scheduler.pauseJob(key); +// } catch (SchedulerException e) { +// e.printStackTrace(); +// return Result.error(); +// } +// return Result.ok(); +// } +// @PostMapping("/resume") +// public Result resume(QuartzEntity quartz,HttpServletResponse response) { +// LOGGER.info("恢复任务"); +// try { +// JobKey key = new JobKey(quartz.getJobName(),quartz.getJobGroup()); +// scheduler.resumeJob(key); +// } catch (SchedulerException e) { +// e.printStackTrace(); +// return Result.error(); +// } +// return Result.ok(); +// } +// @PostMapping("/remove") +// public Result remove(QuartzEntity quartz,HttpServletResponse response) { +// try { +// +// TriggerKey triggerKey = TriggerKey.triggerKey(quartz.getJobName(), quartz.getJobGroup()); +// // 停止触发器 +// scheduler.pauseTrigger(triggerKey); +// // 移除触发器 +// scheduler.unscheduleJob(triggerKey); +// // 删除任务 +// scheduler.deleteJob(JobKey.jobKey(quartz.getJobName(), quartz.getJobGroup())); +// System.out.println("removeJob:"+JobKey.jobKey(quartz.getJobName())); +// } catch (Exception e) { +// e.printStackTrace(); +// return Result.error(); +// } +// return Result.ok(); +// } +//} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6a629ab58a9a59690e232b8e498640ede1b42ae2..ea429304897d24b82b5bc3caebef26bcced1c531 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ # 项目contextPath 科帮网https://blog.52itstyle.vip server.context-path=/quartz # 服务端口 -server.port=8080 +server.port=8082 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置 @@ -23,11 +23,11 @@ spring.thymeleaf.template.cache=false spring.mvc.static-path-pattern=/** #注意中文乱码 -spring.datasource.url=jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8&useSSL=false +spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false # mysql8.0+以上版本配置 # spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone = GMT spring.datasource.username=root -spring.datasource.password=root +spring.datasource.password=g773538471 spring.datasource.driver-class-name=com.mysql.jdbc.Driver # Specify the DBMS spring.jpa.database = MYSQL diff --git a/src/main/resources/quartz.properties b/src/main/resources/quartz.properties index efd7880b377bbcfbd7e8f0d3af35159769e330ec..58b0b7bfd7265e9ca32c28e6143299141da75e97 100644 --- a/src/main/resources/quartz.properties +++ b/src/main/resources/quartz.properties @@ -1,15 +1,32 @@ -org.quartz.scheduler.instanceName = MyScheduler - -org.quartz.threadPool.threadCount = 5 -org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX -org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -org.quartz.jobStore.tablePrefix = QRTZ_ -org.quartz.jobStore.dataSource = myDS - -org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver -org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8&useSSL=false -# mysql8.0+ϰ汾 -# org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartz?characterEncoding=utf-8&useSSL=false&serverTimezone = GMT -org.quartz.dataSource.myDS.user = root -org.quartz.dataSource.myDS.password = root -org.quartz.dataSource.myDS.maxConnections = 5 \ No newline at end of file +##============================================================== +##Configure Main Scheduler Properties +##============================================================== +#org.quartz.scheduler.instanceName = quartzScheduler +#org.quartz.scheduler.instanceId = AUTO +# +##============================================================== +##Configure JobStore +##============================================================== +#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX +#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +#org.quartz.jobStore.tablePrefix = QRTZ_ +#org.quartz.jobStore.isClustered = true +#org.quartz.jobStore.clusterCheckinInterval = 10000 +#org.quartz.jobStore.dataSource = myDS +# +##============================================================== +##Configure DataSource +##============================================================== +#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver +#org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 +#org.quartz.dataSource.myDS.user = root +#org.quartz.dataSource.myDS.password = g773538471 +#org.quartz.dataSource.myDS.maxConnections = 30 +# +##============================================================== +##Configure ThreadPool +##============================================================== +#org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +#org.quartz.threadPool.threadCount = 5 +#org.quartz.threadPool.threadPriority = 5 +#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true \ No newline at end of file