cronner 定时任务框架将作业的配置和应用程序剥离,实现了集中作业配置和管理。支持作业分片和失效转移。 源代码参考了开源项目elastic-job。
githup地址:https://github.com/fang-yan-peng/cronner
一、架构图
Cronner 内部分为调度节点和执行节点。调度节点负责作业配置、作业分片和任务调度,多台调度节点之间是互为备份关系,如果一个节点down机,其它的调度节点会接管任务调度。执行节点负责任务的运行、失效转移。
二 例子
Cronner 支持spring、springboot和main方法启动的进程。Cronner 配置十分简单,通过几个注解就可以实现作业的调度。以下以spring boot为例,其它的例子github的代码里都提供了。目前jar包还没有上传到maven私服,正在申请的过程中。运行例子需要下载源码编译jar包。
-
添加依赖.
<dependency> <groupId>org.jfaster.cronner</groupId> <artifactId>spring-boot-starter-cronner</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.jfaster.cronner</groupId> <artifactId>spring-boot-starter-zookeeper</artifactId> <version>1.0.1</version> </dependency>
-
创建一个作业。
src/main/java/cronner/jfaster/org/example/job/listener/JobListenerExample.java
src/main/java/cronner/jfaster/org/example/job/SimpeCronnerJobSpringboot.java
package cronner.jfaster.org.example.job.listener; import cronner.jfaster.org.executor.ShardingContexts; import cronner.jfaster.org.job.api.listener.CronnerJobListener; /** * @author fangyanpeng */ public class JobListenerExample implements CronnerJobListener{ @Override public void beforeJobExecuted(ShardingContexts shardingContexts) { System.out.println(String.format("----SpringBoot Job: %s begin----",shardingContexts.getJobName())); } @Override public void afterJobExecuted(ShardingContexts shardingContexts) { System.out.println(String.format("----SpringBoot Job: %s end----",shardingContexts.getJobName())); } }
package cronner.jfaster.org.example.job; import cronner.jfaster.org.job.annotation.Job; import cronner.jfaster.org.example.job.listener.JobListenerExample; import cronner.jfaster.org.job.api.ShardingContext; import cronner.jfaster.org.job.api.simple.SimpleJob; import java.util.concurrent.TimeUnit; /** * @author fangyanpeng */ @Job(name = "cronner-simple-job",listener = JobListenerExample.class) public class SimpeCronnerJobSpringboot implements SimpleJob { @Override public void execute(ShardingContext shardingContext) { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format("jobName=%s,jobParameter=%s,shardingItem=%s,shardingParameter=%s",shardingContext.getJobName(),shardingContext.getJobParameter(),shardingContext.getShardingItem(),shardingContext.getShardingParameter())); } }
-
配置yml文件,并启动作业。
########### Zookeeper Configuration Start ########### zookeeper: serverLists: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183 namespace: cronner baseSleepTimeMilliseconds: 1000 maxSleepTimeMilliseconds: 3000 maxRetries: 3 ############ Zookeeper Configuration End ########### ########### cronner packege Configuration Start ########### cronner: package: cronner.jfaster.org.example.job ############ cronner packege Configuration End ###########
src/main/java/cronner/jfaster/org/example/CronnerSpringBootMain.java
package cronner.jfaster.org.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; /** * @author fangyanpeng */ @SpringBootApplication public class CronnerSpringBootMain { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(CronnerSpringBootMain.class,args); } }
执行main方法,就会启动作业,就是一个执行节点。每个执行节点都会启动一个端口接收调度节点的命令,默认端口9233。如果同一台机器启动多个执行节点,通过java -Dcronner.executor.port=8888指定端口,避免端口冲突。
-
启动调度节点,添加作业调度项
- tar -zxvf cronner-manager-1.0.1.tar.gz
- cd cronner-manager-1.0.1
- vim conf/cronner.conf 修改登陆后台的用户名、密码、端口号、数据库地址、zk地址、jvm参数等。
- sh bin/cronner.sh start 启动节点
- 默认启动2145 端口
- 访问 http://127.0.0.1:2145端口
就会出现作业的配置页面,点击 作业配置》配置管理》添加 进行添加作业,都是页面可视化的,具体的配置和添加步骤github都有例子。注意添加的作业名称一定要与要调度的作业名一致,例如上面的 cronner-simple-job