{"id":13630827,"url":"https://github.com/ltsopensource/light-task-scheduler","last_synced_at":"2026-01-24T02:07:44.461Z","repository":{"id":22352436,"uuid":"25688387","full_name":"ltsopensource/light-task-scheduler","owner":"ltsopensource","description":"Distributed Scheduled Job Framework","archived":false,"fork":false,"pushed_at":"2022-10-20T07:34:03.000Z","size":99960,"stargazers_count":3019,"open_issues_count":132,"forks_count":1147,"subscribers_count":329,"default_branch":"master","last_synced_at":"2025-07-10T20:15:40.399Z","etag":null,"topics":["java","lts","spi","spring","springboot","task"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ltsopensource.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-10-24T12:53:14.000Z","updated_at":"2025-07-10T14:53:03.000Z","dependencies_parsed_at":"2022-07-14T23:46:11.720Z","dependency_job_id":null,"html_url":"https://github.com/ltsopensource/light-task-scheduler","commit_stats":null,"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/ltsopensource/light-task-scheduler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltsopensource%2Flight-task-scheduler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltsopensource%2Flight-task-scheduler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltsopensource%2Flight-task-scheduler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltsopensource%2Flight-task-scheduler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ltsopensource","download_url":"https://codeload.github.com/ltsopensource/light-task-scheduler/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltsopensource%2Flight-task-scheduler/sbom","scorecard":{"id":601362,"data":{"date":"2025-08-11","repo":{"name":"github.com/ltsopensource/light-task-scheduler","commit":"b61e6ae4320d5bf63d803ed0ccc33894d854539b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Code-Review","score":4,"reason":"Found 9/20 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'","Warn: branch protection not enabled for branch '1.6.7.1'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"94 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vmq6-5m68-f53m","Warn: Project is vulnerable to: GHSA-668q-qrv7-99fm","Warn: Project is vulnerable to: GHSA-6v67-2wr5-gvf4","Warn: Project is vulnerable to: GHSA-pr98-23f8-jwxv","Warn: Project is vulnerable to: GHSA-xjrr-xv9m-4pw5","Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-288c-cq4h-88gq","Warn: Project is vulnerable to: GHSA-4gq5-ch57-c2mg","Warn: Project is vulnerable to: GHSA-4w82-r329-3q67","Warn: Project is vulnerable to: GHSA-57j2-w4cx-62h2","Warn: Project is vulnerable to: GHSA-5949-rw7g-wx7w","Warn: Project is vulnerable to: GHSA-5r5r-6hpj-8gg9","Warn: Project is vulnerable to: GHSA-5ww9-j83m-q7qx","Warn: Project is vulnerable to: GHSA-645p-88qh-w398","Warn: Project is vulnerable to: GHSA-6fpp-rgj9-8rwc","Warn: Project is vulnerable to: GHSA-85cw-hj65-qqv9","Warn: Project is vulnerable to: GHSA-89qr-369f-5m5x","Warn: Project is vulnerable to: GHSA-8c4j-34r4-xr8g","Warn: Project is vulnerable to: GHSA-8w26-6f25-cm9x","Warn: Project is vulnerable to: GHSA-9gph-22xh-8x98","Warn: Project is vulnerable to: GHSA-9m6f-7xcq-8vf8","Warn: Project is vulnerable to: GHSA-c8hm-7hpq-7jhg","Warn: Project is vulnerable to: GHSA-cf6r-3wgc-h863","Warn: Project is vulnerable to: GHSA-cggj-fvv3-cqwv","Warn: Project is vulnerable to: GHSA-cjjf-94ff-43w7","Warn: Project is vulnerable to: GHSA-cmfg-87vq-g5g4","Warn: Project is vulnerable to: GHSA-cvm9-fjm9-3572","Warn: Project is vulnerable to: GHSA-f3j5-rmmp-3fc5","Warn: Project is vulnerable to: GHSA-f9xh-2qgp-cq57","Warn: Project is vulnerable to: GHSA-fmmc-742q-jg75","Warn: Project is vulnerable to: GHSA-fqwf-pjwf-7vqv","Warn: Project is vulnerable to: GHSA-gjmw-vf9h-g25v","Warn: Project is vulnerable to: GHSA-gwp4-hfv6-p7hw","Warn: Project is vulnerable to: GHSA-gww7-p5w4-wrfv","Warn: Project is vulnerable to: GHSA-h3cw-g4mq-c5x2","Warn: Project is vulnerable to: GHSA-h592-38cm-4ggp","Warn: Project is vulnerable to: GHSA-h822-r4r5-v8jg","Warn: Project is vulnerable to: GHSA-jjjh-jjxp-wpff","Warn: Project is vulnerable to: GHSA-m6x4-97wx-4q27","Warn: Project is vulnerable to: GHSA-mph4-vhrx-mv67","Warn: Project is vulnerable to: GHSA-mx7p-6679-8g3q","Warn: Project is vulnerable to: GHSA-p43x-xfjf-5jhr","Warn: Project is vulnerable to: GHSA-q93h-jc49-78gg","Warn: Project is vulnerable to: GHSA-qjw2-hr98-qgfh","Warn: Project is vulnerable to: GHSA-qr7j-h6gg-jmgc","Warn: Project is vulnerable to: GHSA-qxxx-2pp7-5hmx","Warn: Project is vulnerable to: GHSA-r3gr-cxrf-hg25","Warn: Project is vulnerable to: GHSA-r695-7vr9-jgc2","Warn: Project is vulnerable to: GHSA-rfx6-vp9g-rh7v","Warn: Project is vulnerable to: GHSA-rgv9-q543-rqg4","Warn: Project is vulnerable to: GHSA-rpr3-cw39-3pxh","Warn: Project is vulnerable to: GHSA-v585-23hc-c647","Warn: Project is vulnerable to: GHSA-vfqx-33qm-g869","Warn: Project is vulnerable to: GHSA-w3f4-3q6j-rh82","Warn: Project is vulnerable to: GHSA-wh8g-3j2c-rqj5","Warn: Project is vulnerable to: GHSA-5mg8-w23w-74h3","Warn: Project is vulnerable to: GHSA-7g45-4rm6-3mm3","Warn: Project is vulnerable to: GHSA-mvr2-9pj6-7w5j","Warn: Project is vulnerable to: GHSA-45hx-wfhj-473x","Warn: Project is vulnerable to: GHSA-h376-j262-vhq6","Warn: Project is vulnerable to: GHSA-p979-4mfw-53vg","Warn: Project is vulnerable to: GHSA-269g-pwp5-87pp","Warn: Project is vulnerable to: GHSA-2qrg-x229-3v8q","Warn: Project is vulnerable to: GHSA-65fg-84f6-3jq3","Warn: Project is vulnerable to: GHSA-f7vh-qwp3-x37m","Warn: Project is vulnerable to: GHSA-fp5r-v3w9-4333","Warn: Project is vulnerable to: GHSA-w9p3-5cr8-m3jj","Warn: Project is vulnerable to: GHSA-2xxh-f8r3-hvvr","Warn: Project is vulnerable to: GHSA-4vrv-ch96-6h42","Warn: Project is vulnerable to: GHSA-cjcf-wm2p-59h5","Warn: Project is vulnerable to: GHSA-g76j-4cxx-23h9","Warn: Project is vulnerable to: GHSA-gc43-g62c-99g2","Warn: Project is vulnerable to: GHSA-jcq3-cprp-m333","Warn: Project is vulnerable to: GHSA-m6vm-37g8-gqvh","Warn: Project is vulnerable to: GHSA-pwh7-92h3-mqr6","Warn: Project is vulnerable to: GHSA-5h29-qq92-wj7f","Warn: Project is vulnerable to: GHSA-6mcm-j9cj-3vc3","Warn: Project is vulnerable to: GHSA-76h9-2vwh-w278","Warn: Project is vulnerable to: GHSA-2hw2-62cp-p9p7","Warn: Project is vulnerable to: GHSA-7286-pgfv-vxvh","Warn: Project is vulnerable to: GHSA-7cwj-j333-x7f7","Warn: Project is vulnerable to: GHSA-ccqf-c5hq-77mp","Warn: Project is vulnerable to: GHSA-rcjj-h6gh-jf3r","Warn: Project is vulnerable to: GHSA-xphj-m9cc-8fmq","Warn: Project is vulnerable to: GHSA-5mcr-gq6c-3hq2","Warn: Project is vulnerable to: GHSA-9vjp-v76f-g363","Warn: Project is vulnerable to: GHSA-cqqj-4p63-rrmm","Warn: Project is vulnerable to: GHSA-f256-j965-7f32","Warn: Project is vulnerable to: GHSA-grg4-wf29-r9vv","Warn: Project is vulnerable to: GHSA-p2v9-g2qv-p635","Warn: Project is vulnerable to: GHSA-wm47-8v5p-wjpj","Warn: Project is vulnerable to: GHSA-wx5j-54mm-rqqq","Warn: Project is vulnerable to: GHSA-xfv3-rrfm-f2rv"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T00:31:39.217Z","repository_id":22352436,"created_at":"2025-08-21T00:31:39.217Z","updated_at":"2025-08-21T00:31:39.217Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28707448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T23:51:44.727Z","status":"online","status_checked_at":"2026-01-24T02:00:06.909Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["java","lts","spi","spring","springboot","task"],"created_at":"2024-08-01T22:02:00.413Z","updated_at":"2026-01-24T02:07:44.435Z","avatar_url":"https://github.com/ltsopensource.png","language":"Java","readme":"\r\n# LTS用户文档\r\n\t\r\nLTS(light-task-scheduler)主要用于解决分布式任务调度问题，支持实时任务，定时任务和Cron任务。有较好的伸缩性，扩展性，健壮稳定性而被多家公司使用，同时也希望开源爱好者一起贡献。\r\n\r\n## ---\u003e 底部有招人帖 \r\n\r\n## 项目地址\r\ngithub地址:\r\n[https://github.com/ltsopensource/light-task-scheduler](https://github.com/ltsopensource/light-task-scheduler)\r\n\r\noschina地址:\r\n[http://git.oschina.net/hugui/light-task-scheduler](http://git.oschina.net/hugui/light-task-scheduler)\r\n\r\n例子: \r\n[https://github.com/ltsopensource/lts-examples](https://github.com/ltsopensource/lts-examples)\r\n\r\n文档地址(正在更新中,后面以这个为准):\r\n[https://www.gitbook.com/book/qq254963746/lts/details](https://www.gitbook.com/book/qq254963746/lts/details)\r\n\r\n这两个地址都会同步更新。感兴趣，请加QQ群：109500214 (加群密码: hello world)一起探讨、完善。越多人支持，就越有动力去更新，喜欢记得右上角star哈。\r\n\r\n## 1.7.2-SNAPSHOT(master)变更主要点\r\n1. 优化JobContext中的BizLogger，由原来的去掉了threadlocal，解决taskTracker多线程的问题, 去掉LtsLoggerFactory.getLogger()用法\r\n\r\n## 框架概况\r\nLTS 有主要有以下四种节点：\r\n\r\n* JobClient：主要负责提交任务, 并接收任务执行反馈结果。\r\n* JobTracker：负责接收并分配任务，任务调度。\r\n* TaskTracker：负责执行任务，执行完反馈给JobTracker。\r\n* LTS-Admin：（管理后台）主要负责节点管理，任务队列管理，监控管理等。\r\n\r\n其中JobClient，JobTracker，TaskTracker节点都是`无状态`的。\r\n可以部署多个并动态的进行删减，来实现负载均衡，实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。 \r\n\r\nLTS注册中心提供多种实现（Zookeeper，redis等），注册中心进行节点信息暴露，master选举。(Mongo or Mysql)存储任务队列和任务执行日志, netty or mina做底层通信, 并提供多种序列化方式fastjson, hessian2, java等。\r\n\r\nLTS支持任务类型：\r\n\r\n* 实时任务：提交了之后立即就要执行的任务。\r\n* 定时任务：在指定时间点执行的任务，譬如 今天3点执行（单次）。\r\n* Cron任务：CronExpression，和quartz类似（但是不是使用quartz实现的）譬如 0 0/1 * * * ?\r\n\r\n支持动态修改任务参数,任务执行时间等设置,支持后台动态添加任务,支持Cron任务暂停,支持手动停止正在执行的任务(有条件),支持任务的监控统计,支持各个节点的任务执行监控,JVM监控等等.\r\n\r\n## 架构图\r\n\r\n![LTS architecture](http://git.oschina.net/hugui/light-task-scheduler/raw/master/docs/LTS_architecture.png?dir=0\u0026filepath=docs%2FLTS_architecture.png\u0026oid=262a5234534e2d9fa8862f3e632c5551ebd95e21\u0026sha=d01be5d59e8d768f49bbdc66c8334c37af8f7af5)\r\n\r\n## 概念说明\r\n\r\n### 节点组\r\n1. 英文名称 NodeGroup,一个节点组等同于一个小的集群，同一个节点组中的各个节点是对等的，等效的，对外提供相同的服务。\r\n2. 每个节点组中都有一个master节点，这个master节点是由LTS动态选出来的，当一个master节点挂掉之后，LTS会立马选出另外一个master节点，框架提供API监听接口给用户。\r\n\r\n### FailStore\r\n1. 顾名思义，这个主要是用于失败了存储的，主要用于节点容错，当远程数据交互失败之后，存储在本地，等待远程通信恢复的时候，再将数据提交。\r\n2. FailStore主要用户JobClient的任务提交，TaskTracker的任务反馈，TaskTracker的业务日志传输的场景下。\r\n3. FailStore目前提供几种实现：leveldb,rocksdb,berkeleydb,mapdb,ltsdb，用于可以自由选择使用哪种,用户也可以采用SPI扩展使用自己的实现。\r\n\r\n\r\n## 流程图\r\n下图是一个标准的实时任务执行流程。\r\n\r\n![LTS progress](http://git.oschina.net/hugui/light-task-scheduler/raw/master/docs/LTS_progress.png?dir=0\u0026filepath=docs%2FLTS_progress.png\u0026oid=22f60a83b51b26bac8dabbb5053ec9913cefc45c\u0026sha=774aa73d186470aedbb8f4da3c04a86a6022be05)\r\n\r\n## LTS-Admin新版界面预览\r\n\r\n![LTS Admin](http://git.oschina.net/hugui/light-task-scheduler/raw/master/docs/LTS-Admin/LTS-Admin-cron-job-queue.png?dir=0\u0026filepath=docs%2FLTS-Admin%2FLTS-Admin-cron-job-queue.png\u0026oid=aecaf01bca5270a53b144891baaa3d7e56d47706\u0026sha=a4fd9f31df9e1fc6d389a16bdc8d1964bb854766)\r\n目前后台带有由[ztajy](https://github.com/ztajy)提供的一个简易的认证功能. 用户名密码在auth.cfg中,用户自行修改.\r\n\r\n## 特性\r\n### 1、Spring支持\r\nLTS可以完全不用Spring框架，但是考虑到很用用户项目中都是用了Spring框架，所以LTS也提供了对Spring的支持，包括Xml和注解，引入`lts-spring.jar`即可。\r\n### 2、业务日志记录器\r\n在TaskTracker端提供了业务日志记录器，供应用程序使用，通过这个业务日志器，可以将业务日志提交到JobTracker，这些业务日志可以通过任务ID串联起来，可以在LTS-Admin中实时查看任务的执行进度。\r\n### 3、SPI扩展支持\r\nSPI扩展可以达到零侵入，只需要实现相应的接口，并实现即可被LTS使用，目前开放出来的扩展接口有\r\n\r\n1. 对任务队列的扩展，用户可以不选择使用mysql或者mongo作为队列存储，也可以自己实现。\r\n2. 对业务日志记录器的扩展，目前主要支持console，mysql，mongo，用户也可以通过扩展选择往其他地方输送日志。\r\n\r\n### 4、故障转移\r\n当正在执行任务的TaskTracker宕机之后，JobTracker会立马将分配在宕机的TaskTracker的所有任务再分配给其他正常的TaskTracker节点执行。\r\n### 5、节点监控\r\n可以对JobTracker，TaskTracker节点进行资源监控，任务监控等，可以实时的在LTS-Admin管理后台查看，进而进行合理的资源调配。\r\n### 6、多样化任务执行结果支持\r\nLTS框架提供四种执行结果支持，`EXECUTE_SUCCESS`，`EXECUTE_FAILED`，`EXECUTE_LATER`，`EXECUTE_EXCEPTION`，并对每种结果采取相应的处理机制，譬如重试。\r\n\r\n* EXECUTE_SUCCESS: 执行成功,这种情况，直接反馈客户端（如果任务被设置了要反馈给客户端）。\r\n* EXECUTE_FAILED：执行失败，这种情况，直接反馈给客户端，不进行重试。\r\n* EXECUTE_LATER：稍后执行（需要重试），这种情况，不反馈客户端，重试策略采用1min，2min，3min的策略，默认最大重试次数为10次，用户可以通过参数设置修改这个重试次数。\r\n* EXECUTE_EXCEPTION：执行异常, 这种情况也会重试(重试策略，同上)\r\n\r\n### 7、FailStore容错\r\n采用FailStore机制来进行节点容错，Fail And Store，不会因为远程通信的不稳定性而影响当前应用的运行。具体FailStore说明，请参考概念说明中的FailStore说明。\r\n\r\n## 项目编译打包\r\n项目主要采用maven进行构建，目前提供shell脚本的打包。\r\n环境依赖：`Java(jdk1.6+)` `Maven`\r\n\r\n用户使用一般分为两种：\r\n### 1、Maven构建\r\n可以通过maven命令将lts的jar包上传到本地仓库中。在父pom.xml中添加相应的repository，并用deploy命令上传即可。具体引用方式可以参考lts中的例子即可。\r\n### 2、直接Jar引用\r\n需要将lts的各个模块打包成单独的jar包，并且将所有lts依赖包引入。具体引用哪些jar包可以参考lts中的例子即可。\r\n\r\n## JobTracker和LTS-Admin部署\r\n提供`(cmd)windows`和`(shell)linux`两种版本脚本来进行编译和部署:\r\n\r\n1. 运行根目录下的`sh build.sh`或`build.cmd`脚本，会在`dist`目录下生成`lts-{version}-bin`文件夹\r\n\r\n2. 下面是其目录结构，其中bin目录主要是JobTracker和LTS-Admin的启动脚本。`jobtracker` 中是 JobTracker的配置文件和需要使用到的jar包，`lts-admin`是LTS-Admin相关的war包和配置文件。\r\nlts-{version}-bin的文件结构\r\n\r\n```java\r\n-- lts-${version}-bin\r\n    |-- bin\r\n    |   |-- jobtracker.cmd\r\n    |   |-- jobtracker.sh\r\n    |   |-- lts-admin.cmd\r\n    |   |-- lts-admin.sh\r\n    |   |-- lts-monitor.cmd\r\n    |   |-- lts-monitor.sh\r\n    |   |-- tasktracker.sh\r\n    |-- conf\r\n    |   |-- log4j.properties\r\n    |   |-- lts-admin.cfg\r\n    |   |-- lts-monitor.cfg\r\n    |   |-- readme.txt\r\n    |   |-- tasktracker.cfg\r\n    |   |-- zoo\r\n    |       |-- jobtracker.cfg\r\n    |       |-- log4j.properties\r\n    |       |-- lts-monitor.cfg\r\n    |-- lib\r\n    |   |-- *.jar\r\n    |-- war\r\n        |-- jetty\r\n        |   |-- lib\r\n        |       |-- *.jar\r\n        |-- lts-admin.war\r\n\r\n```\t    \r\n        \r\n3. JobTracker启动。如果你想启动一个节点，直接修改下`conf/zoo`下的配置文件，然后运行 `sh jobtracker.sh zoo start`即可，如果你想启动两个JobTracker节点，那么你需要拷贝一份zoo,譬如命名为`zoo2`,修改下`zoo2`下的配置文件，然后运行`sh jobtracker.sh zoo2 start`即可。logs文件夹下生成`jobtracker-zoo.out`日志。\r\n4. LTS-Admin启动.修改`conf/lts-monitor.cfg`和`conf/lts-admin.cfg`下的配置，然后运行`bin`下的`sh lts-admin.sh`或`lts-admin.cmd`脚本即可。logs文件夹下会生成`lts-admin.out`日志，启动成功在日志中会打印出访问地址，用户可以通过这个访问地址访问了。\r\n\r\n## JobClient（部署）使用\r\n需要引入lts的jar包有`lts-jobclient-{version}.jar`，`lts-core-{version}.jar` 及其它第三方依赖jar。\r\n### API方式启动\r\n```java\r\nJobClient jobClient = new RetryJobClient();\r\njobClient.setNodeGroup(\"test_jobClient\");\r\njobClient.setClusterName(\"test_cluster\");\r\njobClient.setRegistryAddress(\"zookeeper://127.0.0.1:2181\");\r\njobClient.start();\r\n\r\n// 提交任务\r\nJob job = new Job();\r\njob.setTaskId(\"3213213123\");\r\njob.setParam(\"shopId\", \"11111\");\r\njob.setTaskTrackerNodeGroup(\"test_trade_TaskTracker\");\r\n// job.setCronExpression(\"0 0/1 * * * ?\");  // 支持 cronExpression表达式\r\n// job.setTriggerTime(new Date()); // 支持指定时间执行\r\nResponse response = jobClient.submitJob(job);\r\n```\r\n    \r\n### Spring XML方式启动\r\n```java\r\n\u003cbean id=\"jobClient\" class=\"com.github.ltsopensource.spring.JobClientFactoryBean\"\u003e\r\n    \u003cproperty name=\"clusterName\" value=\"test_cluster\"/\u003e\r\n    \u003cproperty name=\"registryAddress\" value=\"zookeeper://127.0.0.1:2181\"/\u003e\r\n    \u003cproperty name=\"nodeGroup\" value=\"test_jobClient\"/\u003e\r\n    \u003cproperty name=\"masterChangeListeners\"\u003e\r\n        \u003clist\u003e\r\n            \u003cbean class=\"com.github.ltsopensource.example.support.MasterChangeListenerImpl\"/\u003e\r\n        \u003c/list\u003e\r\n    \u003c/property\u003e\r\n    \u003cproperty name=\"jobFinishedHandler\"\u003e\r\n        \u003cbean class=\"com.github.ltsopensource.example.support.JobFinishedHandlerImpl\"/\u003e\r\n    \u003c/property\u003e\r\n    \u003cproperty name=\"configs\"\u003e\r\n        \u003cprops\u003e\r\n            \u003c!-- 参数 --\u003e\r\n            \u003cprop key=\"job.fail.store\"\u003eleveldb\u003c/prop\u003e\r\n        \u003c/props\u003e\r\n    \u003c/property\u003e\r\n\u003c/bean\u003e\r\n```    \r\n### Spring 全注解方式\r\n```java\r\n@Configuration\r\npublic class LTSSpringConfig {\r\n\r\n    @Bean(name = \"jobClient\")\r\n    public JobClient getJobClient() throws Exception {\r\n        JobClientFactoryBean factoryBean = new JobClientFactoryBean();\r\n        factoryBean.setClusterName(\"test_cluster\");\r\n        factoryBean.setRegistryAddress(\"zookeeper://127.0.0.1:2181\");\r\n        factoryBean.setNodeGroup(\"test_jobClient\");\r\n        factoryBean.setMasterChangeListeners(new MasterChangeListener[]{\r\n                new MasterChangeListenerImpl()\r\n        });\r\n        Properties configs = new Properties();\r\n        configs.setProperty(\"job.fail.store\", \"leveldb\");\r\n        factoryBean.setConfigs(configs);\r\n        factoryBean.afterPropertiesSet();\r\n        return factoryBean.getObject();\r\n    }\r\n}\r\n```\r\n## TaskTracker(部署使用)\r\n需要引入lts的jar包有`lts-tasktracker-{version}.jar`，`lts-core-{version}.jar` 及其它第三方依赖jar。\r\n### 定义自己的任务执行类\r\n```java\r\npublic class MyJobRunner implements JobRunner {\r\n    @Override\r\n    public Result run(JobContext jobContext) throws Throwable {\r\n        try {\r\n            // TODO 业务逻辑\r\n            // 会发送到 LTS (JobTracker上)\r\n            jobContext.getBizLogger().info(\"测试，业务日志啊啊啊啊啊\");\r\n\r\n        } catch (Exception e) {\r\n            return new Result(Action.EXECUTE_FAILED, e.getMessage());\r\n        }\r\n        return new Result(Action.EXECUTE_SUCCESS, \"执行成功了，哈哈\");\r\n    }\r\n}\r\n```\r\n### API方式启动\r\n```java \r\nTaskTracker taskTracker = new TaskTracker();\r\ntaskTracker.setJobRunnerClass(MyJobRunner.class);\r\ntaskTracker.setRegistryAddress(\"zookeeper://127.0.0.1:2181\");\r\ntaskTracker.setNodeGroup(\"test_trade_TaskTracker\");\r\ntaskTracker.setClusterName(\"test_cluster\");\r\ntaskTracker.setWorkThreads(20);\r\ntaskTracker.start();\r\n```\r\n### Spring XML方式启动\r\n```java\r\n\u003cbean id=\"taskTracker\" class=\"com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean\" init-method=\"start\"\u003e\r\n    \u003cproperty name=\"jobRunnerClass\" value=\"com.github.ltsopensource.example.support.MyJobRunner\"/\u003e\r\n    \u003cproperty name=\"bizLoggerLevel\" value=\"INFO\"/\u003e\r\n    \u003cproperty name=\"clusterName\" value=\"test_cluster\"/\u003e\r\n    \u003cproperty name=\"registryAddress\" value=\"zookeeper://127.0.0.1:2181\"/\u003e\r\n    \u003cproperty name=\"nodeGroup\" value=\"test_trade_TaskTracker\"/\u003e\r\n    \u003cproperty name=\"workThreads\" value=\"20\"/\u003e\r\n    \u003cproperty name=\"masterChangeListeners\"\u003e\r\n        \u003clist\u003e\r\n            \u003cbean class=\"com.github.ltsopensource.example.support.MasterChangeListenerImpl\"/\u003e\r\n        \u003c/list\u003e\r\n    \u003c/property\u003e\r\n    \u003cproperty name=\"configs\"\u003e\r\n        \u003cprops\u003e\r\n            \u003cprop key=\"job.fail.store\"\u003eleveldb\u003c/prop\u003e\r\n        \u003c/props\u003e\r\n    \u003c/property\u003e\r\n\u003c/bean\u003e\r\n```\r\n### Spring注解方式启动\r\n```java\r\n@Configuration\r\npublic class LTSSpringConfig implements ApplicationContextAware {\r\n    private ApplicationContext applicationContext;\r\n    @Override\r\n    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {\r\n        this.applicationContext = applicationContext;\r\n    }\r\n\t@Bean(name = \"taskTracker\")\r\n    public TaskTracker getTaskTracker() throws Exception {\r\n        TaskTrackerAnnotationFactoryBean factoryBean = new TaskTrackerAnnotationFactoryBean();\r\n        factoryBean.setApplicationContext(applicationContext);\r\n        factoryBean.setClusterName(\"test_cluster\");\r\n        factoryBean.setJobRunnerClass(MyJobRunner.class);\r\n        factoryBean.setNodeGroup(\"test_trade_TaskTracker\");\r\n        factoryBean.setBizLoggerLevel(\"INFO\");\r\n        factoryBean.setRegistryAddress(\"zookeeper://127.0.0.1:2181\");\r\n        factoryBean.setMasterChangeListeners(new MasterChangeListener[]{\r\n                new MasterChangeListenerImpl()\r\n        });\r\n        factoryBean.setWorkThreads(20);\r\n        Properties configs = new Properties();\r\n        configs.setProperty(\"job.fail.store\", \"leveldb\");\r\n        factoryBean.setConfigs(configs);\r\n\r\n        factoryBean.afterPropertiesSet();\r\n//        factoryBean.start();\r\n        return factoryBean.getObject();\r\n    }\r\n}\r\n```\r\n## 参数说明\r\n[参数说明](https://qq254963746.gitbooks.io/lts/content/use/config-name.html)\r\n\r\n## 使用建议\r\n一般在一个JVM中只需要一个JobClient实例即可，不要为每种任务都新建一个JobClient实例，这样会大大的浪费资源，因为一个JobClient可以提交多种任务。相同的一个JVM一般也尽量保持只有一个TaskTracker实例即可，多了就可能造成资源浪费。当遇到一个TaskTracker要运行多种任务的时候，请参考下面的 \"一个TaskTracker执行多种任务\"。\r\n## 一个TaskTracker执行多种任务\r\n有的时候，业务场景需要执行多种任务，有些人会问，是不是要每种任务类型都要一个TaskTracker去执行。我的答案是否定的，如果在一个JVM中，最好使用一个TaskTracker去运行多种任务，因为一个JVM中使用多个TaskTracker实例比较浪费资源（当然当你某种任务量比较多的时候，可以将这个任务单独使用一个TaskTracker节点来执行）。那么怎么才能实现一个TaskTracker执行多种任务呢。下面是我给出来的参考例子。\r\n\r\n```java\r\n/**\r\n * 总入口，在 taskTracker.setJobRunnerClass(JobRunnerDispatcher.class)\r\n * JobClient 提交 任务时指定 Job 类型  job.setParam(\"type\", \"aType\")\r\n */\r\npublic class JobRunnerDispatcher implements JobRunner {\r\n\r\n    private static final ConcurrentHashMap\u003cString/*type*/, JobRunner\u003e\r\n            JOB_RUNNER_MAP = new ConcurrentHashMap\u003cString, JobRunner\u003e();\r\n\r\n    static {\r\n        JOB_RUNNER_MAP.put(\"aType\", new JobRunnerA()); // 也可以从Spring中拿\r\n        JOB_RUNNER_MAP.put(\"bType\", new JobRunnerB());\r\n    }\r\n\r\n    @Override\r\n    public Result run(JobContext jobContext) throws Throwable {\r\n        Job job = jobContext.getJob();\r\n        String type = job.getParam(\"type\");\r\n        return JOB_RUNNER_MAP.get(type).run(job);\r\n    }\r\n}\r\n\r\nclass JobRunnerA implements JobRunner {\r\n    @Override\r\n    public Result run(JobContext jobContext) throws Throwable {\r\n        //  TODO A类型Job的逻辑\r\n        return null;\r\n    }\r\n}\r\n\r\nclass JobRunnerB implements JobRunner {\r\n    @Override\r\n    public Result run(JobContext jobContext) throws Throwable {\r\n        // TODO B类型Job的逻辑\r\n        return null;\r\n    }\r\n}\r\n```\r\n## TaskTracker的JobRunner测试\r\n一般在编写TaskTracker的时候，只需要测试JobRunner的实现逻辑是否正确，又不想启动LTS进行远程测试。为了方便测试，LTS提供了JobRunner的快捷测试方法。自己的测试类集成`com.github.ltsopensource.tasktracker.runner.JobRunnerTester`即可，并实现`initContext`和`newJobRunner`方法即可。如[lts-examples](https://github.com/ltsopensource/lts-examples)中的例子：\r\n\r\n```java\r\npublic class TestJobRunnerTester extends JobRunnerTester {\r\n\r\n    public static void main(String[] args) throws Throwable {\r\n        //  Mock Job 数据\r\n        Job job = new Job();\r\n        job.setTaskId(\"2313213\");\r\n\r\n        JobContext jobContext = new JobContext();\r\n        jobContext.setJob(job);\r\n\r\n        JobExtInfo jobExtInfo = new JobExtInfo();\r\n        jobExtInfo.setRetry(false);\r\n\r\n        jobContext.setJobExtInfo(jobExtInfo);\r\n\r\n        // 运行测试\r\n        TestJobRunnerTester tester = new TestJobRunnerTester();\r\n        Result result = tester.run(jobContext);\r\n        System.out.println(JSON.toJSONString(result));\r\n    }\r\n\r\n    @Override\r\n    protected void initContext() {\r\n        // TODO 初始化Spring容器\r\n    }\r\n\r\n    @Override\r\n    protected JobRunner newJobRunner() {\r\n        return new TestJobRunner();\r\n    }\r\n}\r\n```\r\n\r\n## Spring Quartz Cron任务无缝接入\r\n对于Quartz的Cron任务只需要在Spring配置中增加一下代码就可以接入LTS平台\r\n\r\n```xml\r\n\u003cbean class=\"com.github.ltsopensource.spring.quartz.QuartzLTSProxyBean\"\u003e\r\n    \u003cproperty name=\"clusterName\" value=\"test_cluster\"/\u003e\r\n    \u003cproperty name=\"registryAddress\" value=\"zookeeper://127.0.0.1:2181\"/\u003e\r\n    \u003cproperty name=\"nodeGroup\" value=\"quartz_test_group\"/\u003e\r\n\u003c/bean\u003e\r\n```\r\n## Spring Boot 支持\r\n\r\n```java\r\n@SpringBootApplication\r\n@EnableJobTracker       // 启动JobTracker\r\n@EnableJobClient        // 启动JobClient\r\n@EnableTaskTracker      // 启动TaskTracker\r\n@EnableMonitor          // 启动Monitor\r\npublic class Application {\r\n    public static void main(String[] args) {\r\n        SpringApplication.run(Application.class, args);\r\n    }\r\n}\r\n```\r\n\r\n剩下的就只是在application.properties中添加相应的配置就行了, 具体见lts-example中的`com.github.ltsopensource.examples.springboot`包下的例子\r\n\r\n\r\n## 多网卡选择问题\r\n当机器有内网两个网卡的时候，有时候，用户想让LTS的流量走外网网卡，那么需要在host中，把主机名称的映射地址改为外网网卡地址即可，内网同理。\r\n\r\n## 关于节点标识问题\r\n如果在节点启动的时候设置节点标识,LTS会默认设置一个UUID为节点标识,可读性会比较差,但是能保证每个节点的唯一性,如果用户能自己保证节点标识的唯一性,可以通过 `setIdentity` 来设置,譬如如果每个节点都是部署在一台机器(一个虚拟机)上,那么可以将identity设置为主机名称\r\n\r\n## SPI扩展说明\r\n支持JobLogger,JobQueue等等的SPI扩展\r\n\r\n## [和其它解决方案比较](https://qq254963746.gitbooks.io/lts/content/introduce/compareother.html)\r\n\r\n\r\n## LTS-Admin使用jetty启动(默认)，不定期挂掉解决方案\r\n见[issue#389](https://github.com/ltsopensource/light-task-scheduler/issues/389)\r\n\r\n\r\n# 招人！！！\r\n工作年限  三年以上\r\n\r\n学历要求  本科\r\n\r\n期望层级  P6(资深Java工程师)/P7(技术专家)\r\n\r\n岗位描述  \r\n\r\n会员平台，负责阿里巴巴集团的用户体系，支持集团内各线业务线用户类需求，支持集团对外合作的用户通和业务通。\r\n包括各个端的用户登录\u0026授权、Session体系、注册、账户管理、账户安全等功能，底层的用户信息服务，会话和凭证管理等等，是集团最核心的产品线之一，每天承载千亿次调用量、峰值千万QPS、以及分布全球的混合云架构等等。\r\n\r\n作为软件工程师，你将会在我们的核心产品上工作，这些产品为我们的商业基础设施提供关键功能，\r\n取决于你的兴趣和经验，你可以在如下的一个或多个领域工作：全球化，用户体验，数据安全，机器学习，系统高可用性等等。\r\n\r\n1. 独立完成中小型项目的系统分析、设计，并主导完成详细设计和编码的任务，确保项目的进度和质量； \r\n2. 能够在团队中完成code review的任务，确保相关代码的有效性和正确性，并能够通过code review提供相关性能以及稳定性的建议； \r\n3. 参与建设通用、灵活、智能的业务支撑平台，支撑上层多场景的复杂业务。\r\n岗位要求  \r\n1. 扎实的java编程基础，熟悉常用的Java开源框架； \r\n2. 具有基于数据库、缓存、分布式存储开发高性能、高可用数据应用的实际经验，熟练掌握LINUX操作系统； \r\n3. 具备良好的识别和设计通用框架及模块的能力； \r\n4. 热爱技术，工作认真、严谨，对系统质量有近乎苛刻的要求意识，善于沟通与团队协作；     \r\n5. 具备大型电子商务网站或金融行业核心系统开发、设计工作经验者优先；\r\n6. 具备大数据处理、算法、机器学习类工作经验优先。\r\n感兴趣，可以发简历到 hugui.hg@alibaba-inc.com 欢迎投递\r\n","funding_links":[],"categories":["Java","任务调度"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fltsopensource%2Flight-task-scheduler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fltsopensource%2Flight-task-scheduler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fltsopensource%2Flight-task-scheduler/lists"}