spring-boot集成Quartz
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency>
@Configuration public class QuartzConfig { @Bean public Scheduler scheduler() throws IOException, SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzProperties()); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); return scheduler; } /** * 设置quartz属性 * @throws IOException * 2016年10月8日下午2:39:05 */ public Properties quartzProperties() throws IOException { Properties prop = new Properties(); prop.put("quartz.scheduler.instanceName", "ServerScheduler"); prop.put("org.quartz.scheduler.instanceId", "AUTO"); prop.put("org.quartz.scheduler.skipUpdateCheck", "true"); prop.put("org.quartz.scheduler.instanceId", "NON_CLUSTERED"); prop.put("org.quartz.scheduler.jobFactory.class", "org.quartz.simpl.SimpleJobFactory"); prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); prop.put("org.quartz.jobStore.dataSource", "quartzDataSource"); prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); prop.put("org.quartz.jobStore.isClustered", "true"); prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); prop.put("org.quartz.threadPool.threadCount", "5"); prop.put("org.quartz.dataSource.quartzDataSource.driver", "com.mysql.jdbc.Driver"); prop.put("org.quartz.dataSource.quartzDataSource.URL", "jdbc:mysql://localhost:3306/demo-schema"); prop.put("org.quartz.dataSource.quartzDataSource.user", "root"); prop.put("org.quartz.dataSource.quartzDataSource.password", "123456"); prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", "10"); return prop; } }
@Service public class TaskServiceImpl { private Logger logger = LogManager.getLogger(getClass()); @Autowired private Scheduler scheduler; /** * 所有任务列表 * 2016年10月9日上午11:16:59 */ public List<TaskInfo> list(){ List<TaskInfo> list = new ArrayList<>(); try { for(String groupJob: scheduler.getJobGroupNames()){ for(JobKey jobKey: scheduler.getJobKeys(GroupMatcher.<JobKey>groupEquals(groupJob))){ List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey); for (Trigger trigger: triggers) { Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); JobDetail jobDetail = scheduler.getJobDetail(jobKey); String cronExpression = "", createTime = ""; if (trigger instanceof CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; cronExpression = cronTrigger.getCronExpression(); createTime = cronTrigger.getDescription(); } TaskInfo info = new TaskInfo(); info.setJobName(jobKey.getName()); info.setJobGroup(jobKey.getGroup()); info.setJobDescription(jobDetail.getDescription()); info.setJobStatus(triggerState.name()); info.setCronExpression(cronExpression); info.setCreateTime(createTime); list.add(info); } } } } catch (SchedulerException e) { e.printStackTrace(); } return list; } /** * 保存定时任务 * @param info * 2016年10月9日上午11:30:40 */ @SuppressWarnings("unchecked") public void addJob(TaskInfo info) { String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info.getCronExpression(), jobDescription = info.getJobDescription(), createTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); try { if (checkExists(jobName, jobGroup)) { logger.info("===> AddJob fail, job already exist, jobGroup:{}, jobName:{}", jobGroup, jobName); throw new ServiceException(String.format("Job已经存在, jobName:{%s},jobGroup:{%s}", jobName, jobGroup)); } TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); CronScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(createTime).withSchedule(schedBuilder).build(); Class<? extends Job> clazz = (Class<? extends Job>)Class.forName(jobName); JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey).withDescription(jobDescription).build(); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException | ClassNotFoundException e) { throw new ServiceException("类名不存在或执行表达式错误"); } } /** * 修改定时任务 * @param info * 2016年10月9日下午2:20:07 */ public void edit(TaskInfo info) { String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info.getCronExpression(), jobDescription = info.getJobDescription(), createTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); try { if (!checkExists(jobName, jobGroup)) { throw new ServiceException(String.format("Job不存在, jobName:{%s},jobGroup:{%s}", jobName, jobGroup)); } TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); JobKey jobKey = new JobKey(jobName, jobGroup); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(createTime).withSchedule(cronScheduleBuilder).build(); JobDetail jobDetail = scheduler.getJobDetail(jobKey); jobDetail.getJobBuilder().withDescription(jobDescription); HashSet<Trigger> triggerSet = new HashSet<>(); triggerSet.add(cronTrigger); scheduler.scheduleJob(jobDetail, triggerSet, true); } catch (SchedulerException e) { throw new ServiceException("类名不存在或执行表达式错误"); } } /** * 删除定时任务 * @param jobName * @param jobGroup * 2016年10月9日下午1:51:12 */ public void delete(String jobName, String jobGroup){ TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); try { if (checkExists(jobName, jobGroup)) { scheduler.pauseTrigger(triggerKey); scheduler.unscheduleJob(triggerKey); logger.info("===> delete, triggerKey:{}", triggerKey); } } catch (SchedulerException e) { throw new ServiceException(e.getMessage()); } } /** * 验证是否存在 * @param jobName * @param jobGroup * @throws SchedulerException * 2016年10月8日下午5:30:43 */ private boolean checkExists(String jobName, String jobGroup) throws SchedulerException{ TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); return scheduler.checkExists(triggerKey); } }
完整项目:https://github.com/leelance/spring-boot-all/tree/master/spring-boot-quartz
相关推荐
本案例中,我们将深入探讨如何在SpringBoot应用中集成Quartz定时任务框架,以及如何配置和运行每20秒执行一次的任务。 首先,我们需要在项目中添加Quartz的依赖。在SpringBoot应用的`pom.xml`或`build.gradle`文件...
集成Quartz到Spring Boot应用中,首先需要在`pom.xml`文件中添加相应的依赖。Quartz的Spring Boot Starter可以简化配置,使得任务调度变得更加简单。你需要引入如下的Maven依赖: ```xml <groupId>org.spring...
首先,让我们深入理解一下Spring Boot如何与Quartz集成。在Spring Boot应用中引入Quartz,我们需要在`pom.xml`或`build.gradle`文件中添加Quartz的依赖。对于Maven用户,添加如下依赖: ```xml <groupId>org....
在这个场景中,我们将讨论如何在Spring Boot中集成Quartz框架来实现定时发送邮件的功能,以及如何从数据库中读取数据生成报表。 首先,我们需要在Spring Boot项目中引入Quartz的相关依赖。在`pom.xml`或`build....
它的“starter”组件是为了快速引入特定功能而设计的,例如这里的"spring-boot-starter-validation"是为了在Spring Boot应用中轻松集成JSR-303/JSR-349(Bean Validation)标准,进行数据校验。 2. **Bean ...
在Spring Boot项目中集成Quartz,首先需要添加相关的依赖到项目的pom.xml或build.gradle文件中。对于Maven项目,可以在pom.xml中添加以下依赖: ```xml <groupId>org.springframework.boot <artifactId>spring-...
IDEA 是一款常用的 Java 开发集成环境,对于 Spring Boot 项目的支持非常完善,可以方便地创建、运行和调试应用。你可能已经在 IDEA 中配置了 Spring Boot 的运行配置,通过点击绿色的运行按钮启动项目,然后通过...
提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。 提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 ...
spring boot demo 是一个Spring Boot、Spring Cloud的项目示例,根据市场主流的后端技术,共集成了30+个demo,未来将持续更新。该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis...
5. **Spring Boot集成Quartz**:集成Quartz到Spring Boot项目中,首先需要在`pom.xml`文件中引入Quartz的相关依赖,然后在Spring Boot的配置文件`application.properties`或`application.yml`中设置Quartz的配置参数...
提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。 提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 ...
"spring-boot 各种demo例子(最新)" 提供的是最新的 Spring Boot 集成示例代码,可以帮助开发者快速理解和学习如何在实际项目中应用 Spring Boot。下面我们将深入探讨这些 demo 示例中可能包含的关键知识点: 1. **...
- 模块化:Spring Boot可以与其他Spring模块和第三方库无缝集成。 - 健康检查:提供健康检查API,方便监控应用状态。 - 可执行JAR:构建的JAR文件可以直接运行,无需额外的服务器环境。 3. **Spring Boot的核心...
《Spring Boot实战示例解析》 ...在学习过程中,不仅需要理解每个示例的功能,还要关注它们是如何集成Spring Boot的各种特性,以及如何优化和调整配置,这样才能真正掌握Spring Boot并将其应用于实际项目中。
它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,让你可以“零”配置启动项目。在 `spring-boot-1.2.1.RELEASE.tar.gz` 这个压缩包中,包含的是 SpringBoot 的一个早期稳定版本,...
这份指南涵盖了Spring Boot的核心概念、配置、启动与运行,以及与其他技术的集成。 1. **核心概念** - **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖简化了项目构建,这些依赖包含了运行应用所...
它集成了大量常用的第三方库配置,如 JDBC、MongoDB、RabbitMQ、Quartz 等,让开发者可以快速地创建出稳定、生产级别的基于 Spring 的应用程序。 在 Spring Boot 中,HTML 和 Thymeleaf 结合使用,可以构建强大的...
本文将深入探讨一个名为"spring-boot-demo"的项目案例,这是一份已经搭建好的基于Maven的Spring Boot项目,集成了MyBatis作为持久层框架。我们将围绕这个案例,详细讲解Spring Boot的核心概念、项目结构以及如何整合...
在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...
3. **起步依赖(Starter POMs)**:SpringBoot 提供了一系列的起步依赖,开发者只需在 Maven 或 Gradle 的构建文件中引入相应依赖,即可快速搭建所需环境,如 `spring-boot-starter-web` 用于 web 开发,`spring-...