basic-server/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -72,21 +72,21 @@ public int addOrEditCustomer(CustomerDto customerDto) { Customer customer = new Customer(); BeanUtils.copyProperties(customerDto, customer); if (customerDto.getBids().size() != 3) { throw new RuntimeException("è¯·éæ©ç»è¥å°åçå¸åº"); } if (customerDto.getCids().size() != 3) { throw new RuntimeException("è¯·éæ©èç³»å°åçå¸åº"); } if (customerDto.getBids() != null && customerDto.getBids().size() == 3) { customer.setBusinessProvinceId(customerDto.getBids().get(0)); customer.setBusinessCityId(customerDto.getBids().get(1)); customer.setBusinessDistrictId(customerDto.getBids().get(2)); } if (customerDto.getCids() != null && customerDto.getCids().size() == 3) { customer.setProvinceId(customerDto.getCids().get(0)); customer.setCityId(customerDto.getCids().get(1)); customer.setDistrictId(customerDto.getCids().get(2)); } if (Objects.isNull(customerDto.getId())) { return customerMapper.insert(customer); basic-server/src/main/java/com/ruoyi/basic/service/impl/SupplyServiceImpl.java
@@ -67,21 +67,19 @@ public int addOrEditSupply(SupplyDto supplyDto) { Supply supply = new Supply(); BeanUtils.copyProperties(supplyDto, supply); if (supplyDto.getBids().size() != 3) { throw new RuntimeException("è¯·éæ©ç»è¥å°åçå¸åº"); } if (supplyDto.getCids().size() != 3) { throw new RuntimeException("è¯·éæ©èç³»å°åçå¸åº"); } if (supplyDto.getBids() != null && supplyDto.getBids().size() == 3) { supply.setBProvinceId(supplyDto.getBids().get(0)); supply.setBCityId(supplyDto.getBids().get(1)); supply.setBDistrictId(supplyDto.getBids().get(2)); } if (supplyDto.getCids() != null && supplyDto.getCids().size() == 3) { supply.setCProvinceId(supplyDto.getCids().get(0)); supply.setCCityId(supplyDto.getCids().get(1)); supply.setCDistrictId(supplyDto.getCids().get(2)); } if (Objects.isNull(supplyDto.getId())) { main-business/src/main/java/com/ruoyi/business/service/impl/TimingTaskScheduler.java
@@ -43,13 +43,18 @@ throw new SchedulerException("Existing trigger is not a CronTrigger"); } // æå»ºæ°è§¦åå¨ Trigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) .withDescription(task.getTaskName()) .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task))) .startAt(Date.from(task.getNexExecutionTime().atZone(ZoneId.systemDefault()).toInstant())) .forJob(oldTrigger.getJobKey()) // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® CronTrigger newTrigger = TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(oldTrigger.getJobKey()) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(convertToCronExpression(task)) // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNexExecutionTime() != null ? Date.from(task.getNexExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); scheduler.rescheduleJob(triggerKey, newTrigger); @@ -74,40 +79,55 @@ /** * å é¤ä»»å¡ */ public void unscheduleTimingTask(Long taskId) throws SchedulerException { public void unscheduleTimingTask(Long taskId) { try{ JobKey jobKey = new JobKey("timingTask_" + taskId); scheduler.deleteJob(jobKey); }catch (Exception e){ e.printStackTrace(); } } private JobDetail buildJobDetail(TimingTask task) { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskId", task.getId()); // 1. æå»ºå¯ä¸JobKeyï¼åºäºä»»å¡IDï¼ç¡®ä¿éå¯åè½è¯å«ï¼ JobKey jobKey = new JobKey("timingTask_" + task.getId()); // 2. å°è£ 任塿°æ®ï¼ä» 使ç¨åºæ¬ç±»åï¼ç¡®ä¿å¯åºååï¼ JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("taskId", task.getId().toString()); // ä»»å¡IDï¼Longï¼å¯åºååï¼ // æéæ·»å å ¶ä»å¿ è¦çåºæ¬ç±»ååæ° // 3. æå»ºJobDetailï¼è®¾ç½®æä¹ åç¸å ³å±æ§ return JobBuilder.newJob(TimingTaskJob.class) .withIdentity("timingTask_" + task.getId()) .withDescription(task.getTaskName()) .usingJobData(jobDataMap) .storeDurably() .withIdentity(jobKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName()) // ä»»å¡æè¿°ï¼åå ¥æ°æ®åº .usingJobData(jobDataMap) // ç»å®ä»»å¡æ°æ® .storeDurably(true) // å³ä½¿æ²¡æè§¦åå¨å ³èä¹æä¹ åä¿å .requestRecovery(true) // å½è°åº¦å¨å´©æºåæ¢å¤æ¶ï¼éæ°æ§è¡æªå®æçä»»å¡ .build(); } private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) { // 1. æå»ºå¯ä¸TriggerKeyï¼åºäºä»»å¡IDï¼ TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); // 2. çæCron表达å¼ï¼åé»è¾ä¸åï¼ String cronExpression = convertToCronExpression(task); TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger() .withIdentity("trigger_" + task.getId()) .withDescription(task.getTaskName()) .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)); if (jobDetail != null) { triggerBuilder.forJob(jobDetail); } if (task.getNexExecutionTime() != null) { triggerBuilder.startAt(Date.from(task.getNexExecutionTime().atZone(ZoneId.systemDefault()).toInstant())); } return triggerBuilder.build(); // 3. æå»ºCronTriggerï¼ç¡®ä¿æä¹ åé ç½® return TriggerBuilder.newTrigger() .withIdentity(triggerKey) // å¯ä¸æ è¯ï¼ç¨äºæä¹ ååå¨ .withDescription(task.getTaskName() + "_TRIGGER") // 触åå¨æè¿° .forJob(jobDetail) // å ³è对åºçJob .withSchedule(CronScheduleBuilder .cronSchedule(cronExpression) .withMisfireHandlingInstructionDoNothing() // éè¿æ§è¡æ¶ççç¥ï¼æ ¹æ®ä¸å¡è°æ´ï¼ ) // 4. 设置å¼å§æ¶é´ï¼è¥ä¸ºnullåç«å³çæï¼ .startAt(task.getNexExecutionTime() != null ? Date.from(task.getNexExecutionTime().atZone(ZoneId.systemDefault()).toInstant()) : new Date()) .build(); } private String convertToCronExpression(TimingTask task) { main-business/src/main/java/com/ruoyi/business/service/impl/TimingTaskServiceImpl.java
@@ -400,6 +400,12 @@ @Override public int delByIds(Long[] ids) { return timingTaskMapper.deleteByIds(Arrays.asList(ids)); int i = timingTaskMapper.deleteByIds(Arrays.asList(ids)); // if (i > 0) { // for (Long id : ids) { // timingTaskScheduler.unscheduleTimingTask(id); // } // } return i; } } main-business/src/main/java/com/ruoyi/business/task/QuartzConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.business.task; import org.quartz.Scheduler; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.scheduling.quartz.SpringBeanJobFactory; import javax.sql.DataSource; @Configuration public class QuartzConfig { @Autowired private ApplicationContext applicationContext; // å设已é ç½®å为dataSourceçæ°æ®æºBean @Autowired private DataSource dataSource; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); // é ç½®SpringBeanJobFactoryï¼ç¨äºæ¯æJobä¸çä¾èµæ³¨å ¥ AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); schedulerFactory.setJobFactory(jobFactory); // å¨schedulerFactoryBean()æ¹æ³ä¸æ·»å // schedulerFactory.setDataSource(dataSource); // å ¶ä»é ç½®... return schedulerFactory; } @Bean public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); } // èªå®ä¹JobFactoryï¼æ¯æèªå¨æ³¨å ¥ public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; @Override public void setApplicationContext(ApplicationContext applicationContext) { this.beanFactory = applicationContext.getAutowireCapableBeanFactory(); } @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object jobInstance = super.createJobInstance(bundle); // å°Jobå®ä¾äº¤ç»Spring容å¨ç®¡çï¼ä½¿å ¶è½å¤è¿è¡ä¾èµæ³¨å ¥ beanFactory.autowireBean(jobInstance); return jobInstance; } } } main-business/src/main/java/com/ruoyi/business/task/TimingTaskJob.java
@@ -8,15 +8,16 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.Serializable; import java.time.LocalDateTime; @Component @DisallowConcurrentExecution // ç¦æ¢å¹¶åæ§è¡åä¸ä¸ªJob public class TimingTaskJob implements Job { public class TimingTaskJob implements Job,Serializable { private static final long serialVersionUID = 1L; // å¿ é¡»å®ä¹åºååID @Autowired private TimingTaskService timingTaskService; private TimingTaskService timingTaskService; @Autowired private InspectionTaskMapper inspectionTaskMapper; ruoyi-admin/src/main/resources/application.yml.example
ÎļþÒÑɾ³ý ruoyi-admin/src/main/resources/logback.xml.example
ÎļþÒÑɾ³ý ruoyi-quartz/pom.xml
@@ -34,6 +34,10 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>main-business</artifactId> </dependency> </dependencies> ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
@@ -1,6 +1,10 @@ package com.ruoyi.quartz.service.impl; import java.util.List; import com.ruoyi.business.entity.TimingTask; import com.ruoyi.business.mapper.TimingTaskMapper; import com.ruoyi.business.service.impl.TimingTaskScheduler; import jakarta.annotation.PostConstruct; import org.quartz.JobDataMap; import org.quartz.JobKey; @@ -31,17 +35,27 @@ @Autowired private SysJobMapper jobMapper; @Autowired private TimingTaskMapper timingTaskMapper; @Autowired private TimingTaskScheduler timingTaskScheduler; /** * 项ç®å¯å¨æ¶ï¼åå§å宿¶å¨ ä¸»è¦æ¯é²æ¢æå¨ä¿®æ¹æ°æ®åºå¯¼è´æªåæ¥å°å®æ¶ä»»å¡å¤çï¼æ³¨ï¼ä¸è½æå¨ä¿®æ¹æ°æ®åºIDåä»»å¡ç»åï¼å¦åä¼å¯¼è´èæ°æ®ï¼ */ @PostConstruct public void init() throws SchedulerException, TaskException { scheduler.clear(); List<SysJob> jobList = jobMapper.selectJobAll(); for (SysJob job : jobList) { ScheduleUtils.createScheduleJob(scheduler, job); // scheduler.clear(); // List<SysJob> jobList = jobMapper.selectJobAll(); // for (SysJob job : jobList) // { // ScheduleUtils.createScheduleJob(scheduler, job); // } List<TimingTask> timingTasks = timingTaskMapper.selectList(null); for (TimingTask timingTask : timingTasks) { timingTaskScheduler.scheduleTimingTask(timingTask); } }