SpringCloud+quartz 定时提醒系统

本文介绍了一个基于SpringCloud和Quartz实现的定时任务提醒系统。该系统通过微信公众号进行第三方授权登录,并利用Feign调用各个服务。系统分为服务注册中心、定时任务服务等四个模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringCloud+quartz 定时提醒系统

之前通过Springboot做了一个定时查询系统,前几天通过SpringCloud编写了个升级版,功能和之前的差不多,现在来看看吧。

首先需要先关注我的测试号啦,本系统通过微信测试号第三方授权登录,扫描下方二维码即可关注
图片描述

关注之后进入我的测试号点击定时提醒则进入本系统

clipboard.png

既然是使用SpringCloud,那么肯定是要把一个项目分为几个模块来运行啦

clipboard.png

本人还是学生,云服务器只有一台,所以就把这四个模块放在同一台服务器了,勿怪勿怪~

系统分为四个模块

  • Eureka Server 服务注册中心
  • quartz定时提醒服务
  • 用户消费者服务
  • 微信测试号第三方授权以及发送模板消息服务

注:本系统没有运用zuul网关

Eureka Server我就不说了,简单的配置一下就可以直接运用了。

quartz定时提醒呢,就需要quartz这个第三方的库

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>

而且还需要一些spring的依赖

quartz有简单任务触发和复杂任务触发,本系统使用的是cron复杂任务触发器定制任务调度

编写一个Job接口实现类

clipboard.png

实现里面的execute方法,该方法是在任务触发时执行,在方法里面写上你要执行的东西。

之后配置scheduler,项目启动的时候创建bean

@Configuration
public class QuartzConfigration {
    /**
     * attention:
     * Details:定义quartz调度工厂
     */
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory() {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
        bean.setOverwriteExistingJobs(true);
        // 延时启动,应用启动1秒后
//        bean.setStartupDelay(5);
        // 注册触发器
//        bean.setTriggers(jobTrigger);
        return bean;
    }
}

创建任务(截取自己写的工具类中的部分内容并加以修改),可以自己写个工具类,以后方便自己调用。

 String event= (String) map.get("eventId");
        String date= (String) map.get("date");
        JobDataMap jobDataMap=new JobDataMap();
        jobDataMap.put("eventId",event);  //将参数传递到Job类中
        jobDataMap.put("date",date);
        JobDetail jobDetail= JobBuilder
                .newJob(MyBean.class)
                .withIdentity(key,"group1")
                .usingJobData(jobDataMap)
                .build();
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity(key, "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        log.info("创建事件成功,执行时间为:{}",format.format(scheduler.scheduleJob(jobDetail,cronTrigger)));

创建时间后想要修改的话就需要这么写

 TriggerKey triggerKey=new TriggerKey(eventId,"group1");
        CronTriggerImpl cronTrigger= (CronTriggerImpl) scheduler.getTrigger(triggerKey);
        cronTrigger.setCronExpression(cron);
        scheduler.rescheduleJob(triggerKey,cronTrigger);

在Job实现类里面注入不了Service,那么可以这么做

ConfigurableApplicationContext run = SpringApplication.run(SpringcloudQuartzApplication.class, args);
        EventService eventService = run.getBean(EventService.class);
        MyBean.eventService=eventService;

这个就是quartz模块的部分介绍了。

接下来是用户消费者模块,调用quartz的服务,通过Feign进行调用,比较坑的事情是,Feign的方法参数,只能传递一个对象参数和多个参数,不能同时传递两个对象参数,而且传递对象参数还需要在前面加上注解

 @PostMapping("/update")
    public ResultVO update(@RequestBody(required = false)EventForm eventForm,
                           @RequestParam(name = "id") String id);

Feign中默认使用Ribbon进行负载均衡(虽然本系统没有集群~)

微信第三方授权和发送模板消息就不多说了,就是使用第三方的库进行编写

<dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>2.8.0</version>
        </dependency>

微信第三方授权的github也贴出来,可以自行去看API,点击这里进入github

项目效果演示

图片描述

图片描述

图片描述

好了,介绍就到这里啦~
有什么问题就发我邮箱提问吧
13427434344@163.com

<think>嗯,用户想在Spring Cloud中使用Quartz实现分布式定时任务,还希望有具体的代码示例。首先,我需要回忆一下Quartz在分布式环境下的工作原理。Quartz通过数据库来协调多个实例,确保任务只被执行一次。这点我记得没错,用户提供的引用里也提到了基于数据库的分布式定时任务,比如引用[1]中的例子。 接下来,我需要考虑如何在Spring Cloud中集成Quartz。Spring Boot有对Quartz的支持,但分布式配置需要设置数据源和SchedulerFactoryBean。用户可能需要配置数据库表,比如Quartz提供的11张表,用来存储任务和触发器信息。引用[3]提到在SpringCloud中集成Quartz集群,应该涉及到这些配置。 然后,代码示例部分。用户需要具体的配置类,比如QuartzConfig,配置数据源和SchedulerFactoryBean。另外,可能需要展示如何定义任务,比如继承QuartzJobBean,并实现executeInternal方法。引用[1]中的项目可能是一个好的参考,动态添加、删除任务的功能可能需要更复杂的处理,但用户可能只需要基础示例。 另外,用户提到的Spring Cloud相关引用,比如引用[2]中的XXL-JOB,但用户明确问的是Quartz,所以需要专注于Quartz的集成。不过可能要注意对比,但这里不需要展开。 需要检查依赖,比如Spring Boot Starter Quartz,以及数据库驱动如MySQL。配置文件中需要设置spring.quartz的相关属性,指向数据库。同时,集群模式需要设置instanceId为AUTO,这样Quartz可以自动处理实例的识别。 可能还需要提醒用户关于事务管理和锁的问题,比如使用@Transactional注解确保数据一致性。此外,任务的具体业务逻辑需要用户根据需求实现,示例中的SampleJob只是一个简单演示。 最后,相关问题部分,需要生成几个相关问题,比如性能优化、动态任务管理、与XXL-JOB对比、故障排查等,参考用户提供的引用中的内容,比如引用[1]中的动态任务操作,引用[3]中的双活机制。</think>以下是为您整理的Spring Cloud集成Quartz分布式定时任务实现方案及代码示例: ### 一、核心实现原理 Quartz通过数据库存储调度信息实现分布式协调,所有节点共享同一数据库,通过行级锁保证任务唯一执行[^1][^3]。关键组件包括: 1. `SchedulerFactoryBean`:创建集群化调度器 2. `JobStoreTX`:基于数据库的任务存储 3. `StdSchedulerFactory`:读取quartz.properties配置 ### 二、具体实现步骤 #### 1. 添加依赖 ```xml <!-- Spring Boot Starter Quartz --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` #### 2. 配置数据库表 创建Quartz专用数据库表(共11张表),表结构文件位于: `quartz-distribution-2.3.0/docs/dbTables/` #### 3. 配置类示例 ```java @Configuration public class QuartzConfig { @Bean public SchedulerFactoryBean schedulerFactory(DataSource dataSource) { SchedulerFactoryBean factory = new SchedulerFactoryBean(); // 集群配置 Properties props = new Properties(); props.put("org.quartz.scheduler.instanceName", "ClusterQuartzScheduler"); props.put("org.quartz.scheduler.instanceId", "AUTO"); props.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); props.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate"); props.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); props.put("org.quartz.jobStore.isClustered", "true"); props.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); props.put("org.quartz.threadPool.threadCount", "10"); factory.setDataSource(dataSource); factory.setQuartzProperties(props); factory.setApplicationContextSchedulerContextKey("applicationContext"); return factory; } } ``` #### 4. 定时任务定义 ```java public class SampleJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) { // 分布式锁确保唯一执行 System.out.println("执行分布式任务: " + new Date()); } } // 任务配置类 @Configuration public class JobConfiguration { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .storeDurably() .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder schedule = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withSchedule(schedule) .build(); } } ``` #### 5. application.yml配置 ```yaml spring: quartz: job-store-type: jdbc properties: org.quartz.scheduler.instanceName: ClusterQuartzScheduler org.quartz.threadPool.threadCount: 5 jdbc: initialize-schema: never # 禁止自动建表 ``` ### 三、关键注意事项 1. 所有节点必须使用**相同的数据库配置** 2. 服务器时钟需保持同步(建议使用NTP服务) 3. 任务执行时间应短于触发间隔,避免任务堆积[^1] 4. 建议配合`@Transactional`注解实现事务管理 ### 四、集群验证方法 启动两个实例后,可在日志中看到类似输出: ``` ClusterManager: detected 2 active instances ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值