Uncode-Schedule

分布式任务调度组件
授权协议 GPLv2
开发语言 Java
所属分类 程序开发、 作业/任务调度
软件类型 开源软件
地区 国产
投 递 者 岑元徽
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

基于zookeeper+spring task/quartz的分布式任务调度组件,确保所有任务在集群中不重复,不遗漏的执行。支持动态添加和删除任务。

功能概述

  1. 基于zookeeper+spring task/quartz的分布任务调度系统。
  2. 确保每个任务在集群中不同节点上不重复的执行。
  3. 单个任务节点故障时自动转移到其他任务节点继续执行。
  4. 任务节点启动时必须保证zookeeper可用,任务节点运行期zookeeper集群不可用时任务节点保持可用前状态运行,zookeeper集群恢复正常运期。
  5. 支持动态添加和删除任务。
  6. 添加ip黑名单,过滤不需要执行任务的节点。
  7. 简单管理后台

说明:

  • 单节点故障时需要业务保障数据完整性或幂等性
  • 具体使用方式和spring task相同k

模块架构

模块架构 Worker构成


Uncode-Schedule

Spring bean

public class SimpleTask {

    private static int i = 0;

    public void print() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }
}

xml配置

<!-- 分布式任务管理器 -->
<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
    init-method="init">
    <property name="zkConfig">
           <map>
              <entry key="zkConnectString" value="127.0.0.1:2181" />
              <entry key="rootPath" value="/uncode/schedule" />
              <entry key="zkSessionTimeout" value="60000" />
              <entry key="userName" value="ScheduleAdmin" />
              <entry key="password" value="password" />
              <entry key="isCheckParentPath" value="true" />
              <entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
           </map>
    </property>
</bean>

API

1 动态添加任务

ConsoleManager.addScheduleTask(TaskDefine taskDefine);

2 动态删除任务

ConsoleManager.delScheduleTask(String targetBean, String targetMethod);

3 查询任务列表

ConsoleManager.queryScheduleTask();


基于Spring Task的XML配置

XML方式

1 Spring bean

public class SimpleTask {

    private static int i = 0;

    public void print() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }
}

2 xml配置

<!-- 分布式任务管理器 -->
<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
    init-method="init">
    <property name="zkConfig">
           <map>
              <entry key="zkConnectString" value="127.0.0.1:2181" />
              <entry key="rootPath" value="/uncode/schedule" />
              <entry key="zkSessionTimeout" value="60000" />
              <entry key="userName" value="ScheduleAdmin" />
              <entry key="password" value="password" />
              <entry key="isCheckParentPath" value="true" />
              <entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
           </map>
    </property>
</bean>
<!-- Spring bean配置 -->
<bean id="taskObj" class="cn.uncode.schedule.SimpleTask"/>
<!-- Spring task配置 -->
<task:scheduled-tasks scheduler="zkScheduleManager">
    <task:scheduled ref="taskObj" method="print"  fixed-rate="5000"/>
</task:scheduled-tasks>

Annotation方式

1 Spring bean

@Component
public class SimpleTask {

    private static int i = 0;

    @Scheduled(fixedDelay = 1000) 
    public void print() {
        System.out.println("===========start!=========");
        System.out.println("I:"+i);i++;
        System.out.println("=========== end !=========");
    }

}

2 xml配置

<!-- 配置注解扫描 -->
<context:annotation-config />
<!-- 自动扫描的包名 -->
<context:component-scan base-package="cn.uncode.schedule" />
<!-- 分布式任务管理器 -->
<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
    init-method="init">
    <property name="zkConfig">
           <map>
              <entry key="zkConnectString" value="127.0.0.1:2181" />
              <entry key="rootPath" value="/uncode/schedule" />
              <entry key="zkSessionTimeout" value="60000" />
              <entry key="userName" value="ScheduleAdmin" />
              <entry key="password" value="password" />
              <entry key="isCheckParentPath" value="true" />
              <entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
           </map>
    </property>
</bean>
<!-- Spring定时器注解开关-->
<task:annotation-driven scheduler="zkScheduleManager" />

基于Quartz的XML配置

注意:spring的MethodInvokingJobDetailFactoryBean改成cn.uncode.schedule.quartz.MethodInvokingJobDetailFactoryBean

<bean id="zkScheduleManager" class="cn.uncode.schedule.ZKScheduleManager"
        init-method="init">
    <property name="zkConfig">
           <map>
              <entry key="zkConnectString" value="183.131.76.147:2181" />
              <entry key="rootPath" value="/uncode/schedule" />
              <entry key="zkSessionTimeout" value="60000" />
              <entry key="userName" value="ScheduleAdmin" />
              <entry key="password" value="password" />
              <entry key="autoRegisterTask" value="true" />
              <entry key="ipBlacklist" value="127.0.0.2,127.0.0.3" />
           </map>
    </property>
</bean> 


<bean id="taskObj" class="cn.uncode.schedule.SimpleTask"/>

<!-- 定义调用对象和调用对象的方法 -->
<bean id="jobtask" class="cn.uncode.schedule.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- 调用的类 -->
    <property name="targetObject" ref="taskObj" />
    <!-- 调用类中的方法 -->
    <property name="targetMethod" value="print" />
</bean>
<!-- 定义触发时间 -->
<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail">
        <ref bean="jobtask"/>
    </property>
    <!-- cron表达式 -->
    <property name="cronExpression">
        <value>0/3 * * * * ?</value>
    </property>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="doTime"/>
        </list>
    </property>
</bean>

uncode-schedule管理后台

访问URL:项目名称/uncode/schedule

img1img2


大家都在使用uncode-schedule


关于

作者:冶卫军

  • uncode-schedule 基于zookeeper+spring task/quartz的分布式任务调度组件,确保所有任务在集群中不重复,不遗漏的执行。支持动态添加和删除任务。 功能概述 基于zookeeper+spring task/quartz的分布任务调度系统。 确保每个任务在集群中不同节点上不重复的执行。 单个任务节点故障时自动转移到其他任务节点继续执行。 任务节点启动时必须保证zoo

  • [url]http://www.oschina.net/p/uncode-schedule[/url] Uncode-Schedule 是基于 zookeeper+quartz/spring task 的分布式任务调度组件,非常小巧,无需任何修改就可以使quartz/spring task具备分布式特性,确保所有任务在集群中不重复,不遗漏的执行。 功能概述 基于zookeeper+spring t

 相关资料
  • 简介 在过去,开发者必须在服务器上为每个任务生成单独的 Cron 项目。而令人头疼的是任务调度不受源代码控制,而且必须通过 SSH 连接到服务器上来增加 Cron 项目。 Laravel 的命令调度程序允许你在 Laravel 中对命令调度进行清晰流畅的定义。并且在使用调度程序时,只需要在服务器上增加一条 Cron 项目即可。调度是在 app/Console/Kernel.php 文件的 sche

  • 基本任务调度 方案1: 通过 @Cron 注解,这个需要依赖 cron4j 框架: //1分钟执行一次 @Cron("*/1 * * * *") public class MyTask implements Runnable { @Override public void run() { System.out.println("task running...");

  • 主要内容:1. 串行调度,2. 非串行调度从一个事务到另一个事务的一系列操作称为调度。 它用于保存每个单独事务中的操作顺序。 1. 串行调度 串行调度是一种调度,其中一个事务在开始另一个事务之前完全执行。 在串行调度中,当第一个事务完成其循环时,则执行下一个事务。 例如: 假设有两个事务和有一些操作。 如果它没有交错操作,那么有以下两种可能的结果: 执行的所有操作,然后执行的所有操作。 在给定的(b)图中,调度A显示了序列调度,其中之后跟

  • 在这最后一章中,我们将回到:kv应用程序,给它添加一个路由层,使之可以根据桶的名字,在各个节点间分发请求。 路由层会接收一个如下形式的路由表: [{?a..?m, :"foo@computer-name"}, {?n..?z, :"bar@computer-name"}] 路由者(负责转发请求的角色,可能是个节点)将根据桶名字的第一个字节查这个路由表, 然后根据路由表所示将用户对桶的请求发给相应

  • 每隔一段时间需要调度任务执行,也许你想注册一个任务在客户端完成连接5分钟后执行,一个常见的用例是发送一个消息“你还活着?”到远端通,如果远端没有反应,则可以关闭通道(连接)和释放资源。 本节介绍使用强大的 EventLoop 实现任务调度,还会简单介绍 Java API的任务调度,以方便和 Netty 比较加深理解。 使用普通的 Java API 调度任务 在 Java 中使用 JDK 提供的 S

  • ShardingSphereTransactionManager SPI 名称 详细说明 ShardingSphereTransactionManager 分布式事务管理器 已知实现类 详细说明 XAShardingSphereTransactionManager 基于 XA 的分布式事务管理器 SeataATShardingSphereTransactionManager 基于 Seata 的分