{"id":13622162,"url":"https://github.com/uncodecn/uncode-schedule","last_synced_at":"2026-01-22T15:30:21.067Z","repository":{"id":32827861,"uuid":"36420879","full_name":"uncodecn/uncode-schedule","owner":"uncodecn","description":"基于zookeeper+spring task的分布式任务调度组件，非常小巧，无需任何修改就可以使spring task具备分布式特性，确保所有任务在集群中不重复，不遗漏的执行。","archived":false,"fork":false,"pushed_at":"2017-08-01T04:26:33.000Z","size":37,"stargazers_count":118,"open_issues_count":2,"forks_count":76,"subscribers_count":21,"default_branch":"master","last_synced_at":"2024-08-01T21:51:43.369Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www.uncode.cn","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uncodecn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-28T07:06:02.000Z","updated_at":"2023-04-04T12:52:29.000Z","dependencies_parsed_at":"2022-09-05T15:21:50.774Z","dependency_job_id":null,"html_url":"https://github.com/uncodecn/uncode-schedule","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uncodecn%2Funcode-schedule","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uncodecn%2Funcode-schedule/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uncodecn%2Funcode-schedule/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uncodecn%2Funcode-schedule/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uncodecn","download_url":"https://codeload.github.com/uncodecn/uncode-schedule/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223661392,"owners_count":17181662,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T21:01:15.010Z","updated_at":"2026-01-22T15:30:20.990Z","avatar_url":"https://github.com/uncodecn.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"# uncode-schedule\n\n基于zookeeper+spring task/quartz的分布式任务调度组件，确保所有任务在集群中不重复，不遗漏的执行。支持动态添加和删除任务。\n\n\n\n# 功能概述\n\n1. 基于zookeeper+spring task/quartz的分布任务调度系统。\n2. 确保每个任务在集群中不同节点上不重复的执行。\n3. 单个任务节点故障时自动转移到其他任务节点继续执行。\n4. 任务节点启动时必须保证zookeeper可用，任务节点运行期zookeeper集群不可用时任务节点保持可用前状态运行，zookeeper集群恢复正常运期。\n5. 支持动态添加和删除任务。\n6. 添加ip黑名单，过滤不需要执行任务的节点。\n7. 简单管理后台\n\n\n说明：\n* 单节点故障时需要业务保障数据完整性或幂等性\n* 具体使用方式和spring task相同\n\n\n------------------------------------------------------------------------\n\n# Uncode-Schedule\n\n## Spring bean\n\n\tpublic class SimpleTask {\n\n\t\tprivate static int i = 0;\n\t\t\n\t\tpublic void print() {\n\t\t\tSystem.out.println(\"===========start!=========\");\n\t\t\tSystem.out.println(\"I:\"+i);i++;\n\t\t\tSystem.out.println(\"=========== end !=========\");\n\t\t}\n\t}\n\n## xml配置\n\n\t\u003c!-- 分布式任务管理器 --\u003e\n\t\u003cbean id=\"zkScheduleManager\" class=\"cn.uncode.schedule.ZKScheduleManager\"\n\t\tinit-method=\"init\"\u003e\n\t\t\u003cproperty name=\"zkConfig\"\u003e\n\t\t\t   \u003cmap\u003e\n\t\t\t\t  \u003centry key=\"zkConnectString\" value=\"127.0.0.1:2181\" /\u003e\n\t\t\t\t  \u003centry key=\"rootPath\" value=\"/uncode/schedule\" /\u003e\n\t\t\t\t  \u003centry key=\"zkSessionTimeout\" value=\"60000\" /\u003e\n\t\t\t\t  \u003centry key=\"userName\" value=\"ScheduleAdmin\" /\u003e\n\t\t\t\t  \u003centry key=\"password\" value=\"password\" /\u003e\n\t\t\t\t  \u003centry key=\"isCheckParentPath\" value=\"true\" /\u003e\n\t\t\t\t  \u003centry key=\"ipBlacklist\" value=\"127.0.0.2,127.0.0.3\" /\u003e\n\t\t\t   \u003c/map\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\n\t\n## API\n\n1 动态添加任务\n\nConsoleManager.addScheduleTask(TaskDefine taskDefine);\n\n2 动态删除任务\n\nConsoleManager.delScheduleTask(String targetBean, String targetMethod);\n\n3 查询任务列表\n\nConsoleManager.queryScheduleTask();\n\n------------------------------------------------------------------------\n\n# 基于Spring Task的XML配置\n\n## XML方式\n\n1 Spring bean\n\n\tpublic class SimpleTask {\n\n\t\tprivate static int i = 0;\n\t\t\n\t\tpublic void print() {\n\t\t\tSystem.out.println(\"===========start!=========\");\n\t\t\tSystem.out.println(\"I:\"+i);i++;\n\t\t\tSystem.out.println(\"=========== end !=========\");\n\t\t}\n\t}\n\n2 xml配置\n\n\t\u003c!-- 分布式任务管理器 --\u003e\n\t\u003cbean id=\"zkScheduleManager\" class=\"cn.uncode.schedule.ZKScheduleManager\"\n\t\tinit-method=\"init\"\u003e\n\t\t\u003cproperty name=\"zkConfig\"\u003e\n\t\t\t   \u003cmap\u003e\n\t\t\t\t  \u003centry key=\"zkConnectString\" value=\"127.0.0.1:2181\" /\u003e\n\t\t\t\t  \u003centry key=\"rootPath\" value=\"/uncode/schedule\" /\u003e\n\t\t\t\t  \u003centry key=\"zkSessionTimeout\" value=\"60000\" /\u003e\n\t\t\t\t  \u003centry key=\"userName\" value=\"ScheduleAdmin\" /\u003e\n\t\t\t\t  \u003centry key=\"password\" value=\"password\" /\u003e\n\t\t\t\t  \u003centry key=\"isCheckParentPath\" value=\"true\" /\u003e\n\t\t\t\t  \u003centry key=\"ipBlacklist\" value=\"127.0.0.2,127.0.0.3\" /\u003e\n\t\t\t   \u003c/map\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\n\t\u003c!-- Spring bean配置 --\u003e\n\t\u003cbean id=\"taskObj\" class=\"cn.uncode.schedule.SimpleTask\"/\u003e\n\t\u003c!-- Spring task配置 --\u003e\n\t\u003ctask:scheduled-tasks scheduler=\"zkScheduleManager\"\u003e\n\t\t\u003ctask:scheduled ref=\"taskObj\" method=\"print\"  fixed-rate=\"5000\"/\u003e\n\t\u003c/task:scheduled-tasks\u003e\n\t\n------------------------------------------------------------------------\n\n## Annotation方式\n\n1 Spring bean\n\n\t@Component\n\tpublic class SimpleTask {\n\n\t\tprivate static int i = 0;\n\t\t\n\t\t@Scheduled(fixedDelay = 1000) \n\t\tpublic void print() {\n\t\t\tSystem.out.println(\"===========start!=========\");\n\t\t\tSystem.out.println(\"I:\"+i);i++;\n\t\t\tSystem.out.println(\"=========== end !=========\");\n\t\t}\n\t\t\n\t}\n\n2 xml配置\n\n\t\u003c!-- 配置注解扫描 --\u003e\n    \u003ccontext:annotation-config /\u003e\n\t\u003c!-- 自动扫描的包名 --\u003e\n    \u003ccontext:component-scan base-package=\"cn.uncode.schedule\" /\u003e\n\t\u003c!-- 分布式任务管理器 --\u003e\n\t\u003cbean id=\"zkScheduleManager\" class=\"cn.uncode.schedule.ZKScheduleManager\"\n\t\tinit-method=\"init\"\u003e\n\t\t\u003cproperty name=\"zkConfig\"\u003e\n\t\t\t   \u003cmap\u003e\n\t\t\t\t  \u003centry key=\"zkConnectString\" value=\"127.0.0.1:2181\" /\u003e\n\t\t\t\t  \u003centry key=\"rootPath\" value=\"/uncode/schedule\" /\u003e\n\t\t\t\t  \u003centry key=\"zkSessionTimeout\" value=\"60000\" /\u003e\n\t\t\t\t  \u003centry key=\"userName\" value=\"ScheduleAdmin\" /\u003e\n\t\t\t\t  \u003centry key=\"password\" value=\"password\" /\u003e\n\t\t\t\t  \u003centry key=\"isCheckParentPath\" value=\"true\" /\u003e\n\t\t\t\t  \u003centry key=\"ipBlacklist\" value=\"127.0.0.2,127.0.0.3\" /\u003e\n\t\t\t   \u003c/map\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\n\t\u003c!-- Spring定时器注解开关--\u003e\n\t\u003ctask:annotation-driven scheduler=\"zkScheduleManager\" /\u003e\n\t\n------------------------------------------------------------------------\n\n# 基于Quartz的XML配置\n\n\t注意：spring的MethodInvokingJobDetailFactoryBean改成cn.uncode.schedule.quartz.MethodInvokingJobDetailFactoryBean\n\t\n\t\u003cbean id=\"zkScheduleManager\" class=\"cn.uncode.schedule.ZKScheduleManager\"\n\t\t\tinit-method=\"init\"\u003e\n\t\t\u003cproperty name=\"zkConfig\"\u003e\n\t\t\t   \u003cmap\u003e\n\t\t\t\t  \u003centry key=\"zkConnectString\" value=\"183.131.76.147:2181\" /\u003e\n\t\t\t\t  \u003centry key=\"rootPath\" value=\"/uncode/schedule\" /\u003e\n\t\t\t\t  \u003centry key=\"zkSessionTimeout\" value=\"60000\" /\u003e\n\t\t\t\t  \u003centry key=\"userName\" value=\"ScheduleAdmin\" /\u003e\n\t\t\t\t  \u003centry key=\"password\" value=\"password\" /\u003e\n\t\t\t\t  \u003centry key=\"autoRegisterTask\" value=\"true\" /\u003e\n\t\t\t\t  \u003centry key=\"ipBlacklist\" value=\"127.0.0.2,127.0.0.3\" /\u003e\n\t\t\t   \u003c/map\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\t\n\n\n\t\u003cbean id=\"taskObj\" class=\"cn.uncode.schedule.SimpleTask\"/\u003e\n\n\t\u003c!-- 定义调用对象和调用对象的方法 --\u003e\n\t\u003cbean id=\"jobtask\" class=\"cn.uncode.schedule.quartz.MethodInvokingJobDetailFactoryBean\"\u003e\n\t\t\u003c!-- 调用的类 --\u003e\n\t\t\u003cproperty name=\"targetObject\" ref=\"taskObj\" /\u003e\n\t\t\u003c!-- 调用类中的方法 --\u003e\n\t\t\u003cproperty name=\"targetMethod\" value=\"print\" /\u003e\n\t\u003c/bean\u003e\n\t\u003c!-- 定义触发时间 --\u003e\n\t\u003cbean id=\"doTime\" class=\"org.springframework.scheduling.quartz.CronTriggerFactoryBean\"\u003e\n\t\t\u003cproperty name=\"jobDetail\"\u003e\n\t\t\t\u003cref bean=\"jobtask\"/\u003e\n\t\t\u003c/property\u003e\n\t\t\u003c!-- cron表达式 --\u003e\n\t\t\u003cproperty name=\"cronExpression\"\u003e\n\t\t\t\u003cvalue\u003e0/3 * * * * ?\u003c/value\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\n\t\u003c!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  --\u003e\n\t\u003cbean id=\"startQuertz\" lazy-init=\"false\" autowire=\"no\" class=\"org.springframework.scheduling.quartz.SchedulerFactoryBean\"\u003e\n\t\t\u003cproperty name=\"triggers\"\u003e\n\t\t\t\u003clist\u003e\n\t\t\t\t\u003cref bean=\"doTime\"/\u003e\n\t\t\t\u003c/list\u003e\n\t\t\u003c/property\u003e\n\t\u003c/bean\u003e\n\n------------------------------------------------------------------------\t\n\t\n# 管理后台\n\n\t\u003cservlet\u003e\n\t\t\u003cservlet-name\u003eUncodeScheduleManager\u003c/servlet-name\u003e\n\t\t\u003cservlet-class\u003ecn.uncode.schedule.web.ManagerServlet\u003c/servlet-class\u003e\n\t\u003c/servlet\u003e\n\t\u003cservlet-mapping\u003e\n\t\t\u003cservlet-name\u003eUncodeScheduleManager\u003c/servlet-name\u003e\n\t\t\u003curl-pattern\u003e/uncode/schedule\u003c/url-pattern\u003e\n\t\u003c/servlet-mapping\u003e\n\n------------------------------------------------------------------------\n\n# 版权\n\n作者：juny（ywj_316@qq.com）\n\n技术支持QQ群：47306892\n\nCopyright 2013 www.uncode.cn","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funcodecn%2Funcode-schedule","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funcodecn%2Funcode-schedule","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funcodecn%2Funcode-schedule/lists"}