admin管理员组

文章数量:1794759

zookeeper+schedule实现分布式定时任务

zookeeper+schedule实现分布式定时任务

zookeeper+schedule实现分布式定时任务
    • 下载zk
    • 创建一个springboot项目
    • 源码地址 [zk-task](github/yangzhouhu/zk_task)

下载zk

官网下载地址:zookeeper.apache/ 我这里下载的是3.4.10 下载解压后在在1路径下将2复制一份并重命名为3,然后编辑3 添加dataDir和dataLogDir路径,并在敌营路径下创建data和logs文件夹 然后就可以启动zk了 双击zookeeper3.4.10/bin/目录下的zkServer.cmd文件

创建一个springboot项目

demo使用idk8 首先添加pom依赖

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="maven.apache/POM/4.0.0" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache/POM/4.0.0 maven.apache/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>zk_task</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--schedule + zk 实现分布式定时任务--> <dependency> <groupId>cn.uncode</groupId> <artifactId>uncode-schedule</artifactId> <version>1.1.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.demo.DemoApplication</mainClass> </configuration> </plugin> </plugins> </build> </project>

然后在resource 目录下新建目录spring 添加定时任务的zkmanager管理配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework/schema/beans" xmlns:xsi="www.w3/2001/XMLSchema-instance" xmlns:task="www.springframework/schema/task" xsi:schemaLocation=" www.springframework/schema/beans www.springframework/schema/beans/spring-beans.xsd www.springframework/schema/task www.springframework/schema/task/spring-task.xsd"> <!-- 分布式任务管理器 --> <bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager" init-method="init"> <property name="zkConfig"> <map> <entry key="uncode.schedule.zkConnect" value="${zookeeper.url}"/> <entry key="uncode.schedule.rootPath" value="/shiro/schedule"/> <entry key="uncode.schedule.zkSessionTimeout" value="60000"/> </map> </property> </bean> <!-- 分布式定时任务 每五秒执行一次 --> <task:scheduled-tasks scheduler="zkScheduleManager"> <task:scheduled ref="shiroTask" method="taskExecute" cron="0/5 * * * * ?"/> </task:scheduled-tasks> </beans>

配置application.yml文件

server: port: 8012 zookeeper: url: 127.0.0.1:2181

启动类配置扫描

@ImportResource(locations = "classpath:spring/*.xml")

接着就是写定时任务的实现类了,根据zkmanager的配置文件创建类和对应的方法。 注意类要加注解,让spring初始化这个bean。

package com.example.demo.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Date; /** * desc: * author:yangzhou * date:2019/9/17 10:26 */ @Component public class ShiroTask { private Logger logger = LoggerFactory.getLogger(ShiroTask.class); public void taskExecute() { try { System.out.println(new Date() + "测试定时任务,当前线程名=" + Thread.currentThread().getName()); // int a = 3/0; } catch (Exception e) { logger.error(e.getMessage(), e); } } }

启动项目 定时任务就跑了起来了,测试多实例时是否重复执行,idea修改配置为允许多实例启动,然后再改下项目配置文件的服务端口号,然后启动项目,发现定时任务依然只有第一个项目在跑,关掉第一个项目,20s后第二个项目就会接着跑,重启第一个项目,不影响当前的情况。 注意,要先启动zk服务端,定时任务才会正常跑,别搞忘了

源码地址 zk-task

本文标签: 分布式zookeeperschedule