赞
踩
官网下载地址:https://zookeeper.apache.org/
我这里下载的是3.4.10
下载解压后在在1路径下将2复制一份并重命名为3,然后编辑3
添加dataDir和dataLogDir路径,并在敌营路径下创建data和logs文件夹
然后就可以启动zk了
双击zookeeper3.4.10/bin/目录下的zkServer.cmd文件
demo使用idk8
首先添加pom依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/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="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/task http://www.springframework.org/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服务端,定时任务才会正常跑,别搞忘了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。