From e210b4920dfda33f7226d79d70519ae1a5c6e479 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Wed, 5 Jan 2022 18:57:34 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9B=86=E7=BE=A4?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 6 ++--- src/main/resources/quartz.properties | 31 ++++++++++++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6a629ab..d53adc1 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=8081 # 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 efd7880..3810a17 100644 --- a/src/main/resources/quartz.properties +++ b/src/main/resources/quartz.properties @@ -1,15 +1,32 @@ -org.quartz.scheduler.instanceName = MyScheduler +#============================================================== +#Configure Main Scheduler Properties +#============================================================== +org.quartz.scheduler.instanceName = quartzScheduler +org.quartz.scheduler.instanceId = AUTO -org.quartz.threadPool.threadCount = 5 +#============================================================== +#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/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.URL = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 org.quartz.dataSource.myDS.user = root -org.quartz.dataSource.myDS.password = root -org.quartz.dataSource.myDS.maxConnections = 5 \ No newline at end of file +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 -- Gitee From 4b73b935f48448a3bd7e951a37018394cb5eaa10 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Fri, 7 Jan 2022 14:56:23 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E9=9B=86=E7=BE=A4=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- .../quartz/config/IndexController.java | 68 ++--- .../quartz/config/SchedulerConfig.java | 84 +++--- .../quartz/config/SpringJobFactory.java | 48 ++-- .../com/itstyle/quartz/config/TaskRunner.java | 70 +++-- .../quartz/dynamicquery/DynamicQuery.java | 6 +- .../quartz/dynamicquery/DynamicQueryImpl.java | 4 +- .../dynamicquery/NativeQueryResultEntity.java | 22 +- .../itstyle/quartz/entity/QuartzEntity.java | 4 +- .../com/itstyle/quartz/entity/Result.java | 110 ++++---- .../itstyle/quartz/interceptor/MyAdapter.java | 38 +-- .../com/itstyle/quartz/job/ChickenJob.java | 92 +++---- .../java/com/itstyle/quartz/job/TestJob.java | 19 ++ .../itstyle/quartz/service/IJobService.java | 6 +- .../quartz/service/impl/JobServiceImpl.java | 2 +- .../com/itstyle/quartz/web/JobController.java | 240 +++++++++--------- src/main/resources/application.properties | 2 +- src/main/resources/quartz.properties | 64 ++--- 18 files changed, 459 insertions(+), 424 deletions(-) create mode 100644 src/main/java/com/itstyle/quartz/job/TestJob.java diff --git a/.gitignore b/.gitignore index 50eb0af..00793e4 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 5970e12..08beb35 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 d77869a..558a5d2 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日 + * 2g */ @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", "RuoyiScheduler"); + 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("RuoyiScheduler"); + // 延时启动 + 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 bd1e766..26befb5 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 ff66a8d..58b1f8a 100644 --- a/src/main/java/com/itstyle/quartz/config/TaskRunner.java +++ b/src/main/java/com/itstyle/quartz/config/TaskRunner.java @@ -1,5 +1,7 @@ package com.itstyle.quartz.config; +import com.itstyle.quartz.job.TestJob; +import com.itstyle.quartz.service.IJobService; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; @@ -14,8 +16,6 @@ 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; /** * 初始化一个测试Demo任务 * 创建者 爪哇笔记 @@ -23,43 +23,59 @@ 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 IJobService jobService; + + @Autowired + private Scheduler scheduler; + @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(); +// 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"); + if(count !=0){ + return; + } + JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", + "test") + .withDescription("test").build(); + job.getJobDataMap().put("jobMethodName", "test2"); // 触发时间点 - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartz.getCronExpression()); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+quartz.getJobName(), quartz.getJobGroup()) - .startNow().withSchedule(cronScheduleBuilder).build(); + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); + Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") + .startNow().withSchedule(cronScheduleBuilder).build(); //交由Scheduler安排触发 scheduler.scheduleJob(job, trigger); - } + JobDetail job3 = JobBuilder.newJob(TestJob.class).withIdentity("test3", + "test") + .withDescription("test3").build(); + job.getJobDataMap().put("jobMethodName", "test3"); + // 触发时间点 + CronScheduleBuilder cronScheduleBuilder3 = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); + Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("trigger"+"test3", "test") + .startNow().withSchedule(cronScheduleBuilder).build(); + //交由Scheduler安排触发 + scheduler.scheduleJob(job3, trigger3); } } \ 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 5cb1bc9..054f9b0 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 83c796f..3b4d5fb 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 58928ab..dd67e68 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 52fc3c8..6d44446 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 ea0abb8..5c9bd67 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 b441cfe..8665b01 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 a281841..df9c76a 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/TestJob.java b/src/main/java/com/itstyle/quartz/job/TestJob.java new file mode 100644 index 0000000..8c3ec70 --- /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 2b1bd16..cea427d 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 386e632..00f5596 100644 --- a/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java +++ b/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java @@ -18,7 +18,7 @@ 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/web/JobController.java b/src/main/java/com/itstyle/quartz/web/JobController.java index c4c2b2f..727fcce 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 d53adc1..52c2042 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=8081 +server.port=8083 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置 diff --git a/src/main/resources/quartz.properties b/src/main/resources/quartz.properties index 3810a17..58b0b7b 100644 --- a/src/main/resources/quartz.properties +++ b/src/main/resources/quartz.properties @@ -1,32 +1,32 @@ -#============================================================== -#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 +##============================================================== +##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 -- Gitee From eb12cc330bb48888aab15c5e5e2e6ed45d86ca73 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Sun, 9 Jan 2022 15:21:32 +0800 Subject: [PATCH 3/6] =?UTF-8?q?quartz=E5=88=9D=E5=A7=8B=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itstyle/quartz/config/TaskRunner.java | 38 ++++++------------- src/main/resources/application.properties | 2 +- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/itstyle/quartz/config/TaskRunner.java b/src/main/java/com/itstyle/quartz/config/TaskRunner.java index 58b1f8a..47bc262 100644 --- a/src/main/java/com/itstyle/quartz/config/TaskRunner.java +++ b/src/main/java/com/itstyle/quartz/config/TaskRunner.java @@ -40,32 +40,18 @@ public class TaskRunner implements ApplicationRunner{ /** * 系统启动的时候会初始化一个任务 */ - 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信息 - if(count !=0){ - return; - } - JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", - "test") - .withDescription("test").build(); - job.getJobDataMap().put("jobMethodName", "test2"); - // 触发时间点 - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") - .startNow().withSchedule(cronScheduleBuilder).build(); - //交由Scheduler安排触发 - scheduler.scheduleJob(job, trigger); + //初始化清空数据库表,防止其他节点插入触发器报错 + scheduler.clear(); + JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", + "test") + .withDescription("test").build(); + job.getJobDataMap().put("jobMethodName", "test2"); + // 触发时间点 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); + Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") + .startNow().withSchedule(cronScheduleBuilder).build(); + //交由Scheduler安排触发 + scheduler.scheduleJob(job, trigger); JobDetail job3 = JobBuilder.newJob(TestJob.class).withIdentity("test3", "test") .withDescription("test3").build(); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 52c2042..d8c2d85 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=8083 +server.port=8084 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置 -- Gitee From 577a26d4b9a4c20d56d76537d752fadff4cb6f07 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Mon, 10 Jan 2022 15:21:34 +0800 Subject: [PATCH 4/6] =?UTF-8?q?quartz=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quartz/config/SchedulerConfig.java | 6 +- .../com/itstyle/quartz/config/TaskRunner.java | 60 ++++----- .../java/com/itstyle/quartz/job/MyJob.java | 14 +++ .../quartz/service/impl/JobServiceImpl.java | 9 +- .../QuartzDisallowConcurrentExecution.java | 41 +++++++ .../com/itstyle/quartz/util/QuartzModel.java | 45 +++++++ .../itstyle/quartz/util/ScheduleUtils.java | 86 +++++++++++++ .../com/itstyle/quartz/util/SpringUtils.java | 114 ++++++++++++++++++ src/main/resources/application.properties | 2 +- 9 files changed, 339 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/itstyle/quartz/job/MyJob.java create mode 100644 src/main/java/com/itstyle/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 src/main/java/com/itstyle/quartz/util/QuartzModel.java create mode 100644 src/main/java/com/itstyle/quartz/util/ScheduleUtils.java create mode 100644 src/main/java/com/itstyle/quartz/util/SpringUtils.java diff --git a/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java b/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java index 558a5d2..95258fe 100644 --- a/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java +++ b/src/main/java/com/itstyle/quartz/config/SchedulerConfig.java @@ -8,7 +8,7 @@ import javax.sql.DataSource; import java.util.Properties; /** - * 2g + * pry */ @Configuration public class SchedulerConfig { @@ -21,7 +21,7 @@ public class SchedulerConfig { // quartz参数 Properties prop = new Properties(); - prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler"); + prop.put("org.quartz.scheduler.instanceName", "pryScheduler"); prop.put("org.quartz.scheduler.instanceId", "AUTO"); // 线程池配置 prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); @@ -41,7 +41,7 @@ public class SchedulerConfig { prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); factory.setQuartzProperties(prop); - factory.setSchedulerName("RuoyiScheduler"); + factory.setSchedulerName("pryScheduler"); // 延时启动 factory.setStartupDelay(1); factory.setApplicationContextSchedulerContextKey("applicationContextKey"); diff --git a/src/main/java/com/itstyle/quartz/config/TaskRunner.java b/src/main/java/com/itstyle/quartz/config/TaskRunner.java index 47bc262..814c945 100644 --- a/src/main/java/com/itstyle/quartz/config/TaskRunner.java +++ b/src/main/java/com/itstyle/quartz/config/TaskRunner.java @@ -1,7 +1,8 @@ package com.itstyle.quartz.config; import com.itstyle.quartz.job.TestJob; -import com.itstyle.quartz.service.IJobService; +import com.itstyle.quartz.util.QuartzModel; +import com.itstyle.quartz.util.ScheduleUtils; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; @@ -11,7 +12,6 @@ import org.quartz.TriggerBuilder; 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; @@ -26,42 +26,44 @@ public class TaskRunner implements ApplicationRunner{ private final static Logger LOGGER = LoggerFactory.getLogger(TaskRunner.class); - @Autowired - private IJobService jobService; @Autowired private Scheduler scheduler; - @Override - public void run(ApplicationArguments var) throws Exception{ - //必须必须必须必须必须 + @Override + public void run(ApplicationArguments var) throws Exception{ /** - * 系统启动的时候会初始化一个任务 + * 系统启动的时候初始化任务 */ //初始化清空数据库表,防止其他节点插入触发器报错 scheduler.clear(); - JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", - "test") - .withDescription("test").build(); - job.getJobDataMap().put("jobMethodName", "test2"); - // 触发时间点 - CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); - Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") - .startNow().withSchedule(cronScheduleBuilder).build(); - //交由Scheduler安排触发 - scheduler.scheduleJob(job, trigger); - JobDetail job3 = JobBuilder.newJob(TestJob.class).withIdentity("test3", - "test") - .withDescription("test3").build(); - job.getJobDataMap().put("jobMethodName", "test3"); - // 触发时间点 - CronScheduleBuilder cronScheduleBuilder3 = CronScheduleBuilder.cronSchedule("*/5 * * * * ?"); - Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("trigger"+"test3", "test") - .startNow().withSchedule(cronScheduleBuilder).build(); - //交由Scheduler安排触发 - scheduler.scheduleJob(job3, trigger3); - } +// JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", +// "test") +// .withDescription("test").build(); +// job.getJobDataMap().put("jobMethodName", "test2"); +// // 触发时间点 +// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/10 * * * * ?"); +// Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") +// .startNow().withSchedule(cronScheduleBuilder).build(); +// //交由Scheduler安排触发 +// scheduler.scheduleJob(job, trigger); +// JobDetail job3 = JobBuilder.newJob(TestJob.class).withIdentity("test3", +// "test") +// .withDescription("test3").build(); +// job.getJobDataMap().put("jobMethodName", "test3"); +// // 触发时间点 +// CronScheduleBuilder cronScheduleBuilder3 = CronScheduleBuilder.cronSchedule("*/10 * * * * ?"); +// Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("trigger"+"test3", "test") +// .startNow().withSchedule(cronScheduleBuilder).build(); +// //交由Scheduler安排触发 +// scheduler.scheduleJob(job3, trigger3); + QuartzModel quartzModel = new QuartzModel("*/10 * * * * ?","com.itstyle.quartz.job.MyJob","test"); + QuartzModel quartzModel2 = new QuartzModel("*/5 * * * * ?","com.itstyle.quartz.job.MyJob","test"); + ScheduleUtils.createScheduleJob(scheduler,quartzModel); + ScheduleUtils.createScheduleJob(scheduler,quartzModel2); + + } } \ No newline at end of file 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 0000000..005359e --- /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/service/impl/JobServiceImpl.java b/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java index 00f5596..b19dfd6 100644 --- a/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java +++ b/src/main/java/com/itstyle/quartz/service/impl/JobServiceImpl.java @@ -1,18 +1,17 @@ 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 { 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 0000000..f863cf7 --- /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 0000000..d2d4c43 --- /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 0000000..678ff9e --- /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 0000000..c52d386 --- /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/resources/application.properties b/src/main/resources/application.properties index d8c2d85..626df1f 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=8084 +server.port=8088 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置 -- Gitee From 523fa51e5a19b62e7434c5c462c3eda4b93fcb18 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Mon, 10 Jan 2022 17:16:13 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/itstyle/quartz/config/TaskRunner.java | 56 +++++++------------ src/main/resources/application.properties | 2 +- 2 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/itstyle/quartz/config/TaskRunner.java b/src/main/java/com/itstyle/quartz/config/TaskRunner.java index 814c945..b7bd7a1 100644 --- a/src/main/java/com/itstyle/quartz/config/TaskRunner.java +++ b/src/main/java/com/itstyle/quartz/config/TaskRunner.java @@ -3,12 +3,7 @@ package com.itstyle.quartz.config; import com.itstyle.quartz.job.TestJob; import com.itstyle.quartz.util.QuartzModel; import com.itstyle.quartz.util.ScheduleUtils; -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 org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +11,9 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + /** * 初始化一个测试Demo任务 * 创建者 爪哇笔记 @@ -30,40 +28,26 @@ public class TaskRunner implements ApplicationRunner{ @Autowired 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{ - /** - * 系统启动的时候初始化任务 - */ - //初始化清空数据库表,防止其他节点插入触发器报错 + initQuarts(); scheduler.clear(); -// JobDetail job = JobBuilder.newJob(TestJob.class).withIdentity("test2", -// "test") -// .withDescription("test").build(); -// job.getJobDataMap().put("jobMethodName", "test2"); -// // 触发时间点 -// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("*/10 * * * * ?"); -// Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger"+"test2", "test") -// .startNow().withSchedule(cronScheduleBuilder).build(); -// //交由Scheduler安排触发 -// scheduler.scheduleJob(job, trigger); -// JobDetail job3 = JobBuilder.newJob(TestJob.class).withIdentity("test3", -// "test") -// .withDescription("test3").build(); -// job.getJobDataMap().put("jobMethodName", "test3"); -// // 触发时间点 -// CronScheduleBuilder cronScheduleBuilder3 = CronScheduleBuilder.cronSchedule("*/10 * * * * ?"); -// Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity("trigger"+"test3", "test") -// .startNow().withSchedule(cronScheduleBuilder).build(); -// //交由Scheduler安排触发 -// scheduler.scheduleJob(job3, trigger3); - QuartzModel quartzModel = new QuartzModel("*/10 * * * * ?","com.itstyle.quartz.job.MyJob","test"); - QuartzModel quartzModel2 = new QuartzModel("*/5 * * * * ?","com.itstyle.quartz.job.MyJob","test"); - ScheduleUtils.createScheduleJob(scheduler,quartzModel); - ScheduleUtils.createScheduleJob(scheduler,quartzModel2); - + 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/resources/application.properties b/src/main/resources/application.properties index 626df1f..ea42930 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=8088 +server.port=8082 # session最大超时时间(分钟),默认为30 server.session-timeout=60 # 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置 -- Gitee From eec0c8faf97953d356fbe1466421b8abb068a0b3 Mon Sep 17 00:00:00 2001 From: Emon <377207104@qq.com> Date: Mon, 10 Jan 2022 17:19:46 +0800 Subject: [PATCH 6/6] =?UTF-8?q?quartz=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/itstyle/quartz/job/MyJob2.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/itstyle/quartz/job/MyJob2.java 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 0000000..d48ff6b --- /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())); + } +} -- Gitee