一、Spring Job单机
Spring Job是一款基于Spring框架的多线程调度器,可以简化项目中的定时任务等多线程操作,提高效率。与其他调度器不同,Spring Job支持分布式部署,能够灵活处理任务分配。在单机模式下,我们可以直接使用Spring Job提供的注解来简化定时任务的编写。
首先,我们需要在项目中加入Spring Job的依赖包。在pom.xml文件中添加如下代码:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
接下来,我们可以在需要定时执行的方法上添加@Scheduled注解,设置计划执行时间。
@Scheduled(cron = "0/5 * * * * ?") public void job() { // 处理任务 }
在上面的代码中,cron表达式代表每隔5秒执行一次job()方法。
二、Spring Job Scheduler连不上zk
当我们需要利用Spring Job进行分布式部署时,我们需要在调度器和执行器之间建立Zookeeper机制进行通信。但是,在实际使用过程中,有时会出现连不上Zookeeper的情况。这时,我们需要进行以下检查:
1、确认Zookeeper地址和端口号是否正确
2、确认网络是否正常,并且Zookeeper服务是否已经启动
3、检查Spring Job Scheduler的配置文件中是否正确配置了Zookeeper信息
quartz: scheduler: instanceName: clusterScheduler instanceId: AUTO jobStore: class: org.springframework.boot.autoconfigure.quartz.QuartzProperties$ClusteredJobStore properties: isClustered: true clusterCheckinInterval: 5000 misfireThreshold: 120000 cluster: checkinInterval: 20000 margin: 2 instanceId: AUTO instanceName: clusterJobStore threadPool: threadCount: 10
在上面的代码片段中,我们可以看到配置了Zookeeper相关信息,并且使用了ClusteredJobStore作为Job存储器,实现了分布式调度。
三、Spring Job Scheduler选取
Spring Job Scheduler提供了多种任务调度方式,我们可以根据不同情况选择合适的调度方式。
1、@Scheduled注解
我们可以在需要定时执行的方法上添加@Scheduled注解,设置计划执行时间。这种方式适用于简单的定时任务。
2、Quartz调度器
Spring Boot默认使用Quartz作为任务调度器,Quartz提供了很多定时任务的配置选项,灵活性强,适用于复杂的定时任务需求。
3、TaskScheduler
TaskScheduler是Spring提供的接口,可以通过实现该接口,自定义定时任务调度器。这种方式适用于有特殊需求的定时任务。
四、完整代码示例
下面是一个完整的Spring Job示例,实现了每隔5秒输出一次"Hello World!"。
//pom.xml文件中添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> //在Spring Boot启动类上添加@EnableScheduling注解 @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } //创建定时任务 @Service public class JobService { @Scheduled(cron = "0/5 * * * * ?") public void job() { System.out.println("Hello World!"); } }