[fix] fix the hugo 404 in gitee pages

This commit is contained in:
tjq 2020-05-21 13:07:11 +08:00
parent a13f0cfa20
commit 7bbc9a25e8
16 changed files with 741 additions and 627 deletions

View File

@ -8,13 +8,13 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="404 Page not found" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/404.html" />
<meta property="og:url" content="https://kfcfans.gitee.io/404.html" />
<title>404 Page not found | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -40,7 +40,7 @@ https://github.com/alex-shpak/hugo-book
<h1>404</h1>
<h2>Page Not Found</h2>
<h3>
<a href="/ohmyscheduler/">OhMyScheduler</a>
<a href="/">OhMyScheduler</a>
</h3>
</div>
</main>

View File

@ -8,14 +8,14 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Categories" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/categories/" />
<meta property="og:url" content="https://kfcfans.gitee.io/categories/" />
<title>Categories | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/ohmyscheduler/categories/index.xml" title="OhMyScheduler" />
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/categories/index.xml" title="OhMyScheduler" />
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -31,7 +31,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -83,7 +83,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -93,7 +93,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -103,7 +103,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -116,10 +126,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -134,7 +144,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -144,7 +154,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -154,51 +170,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -239,13 +220,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>Categories</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>

View File

@ -2,12 +2,12 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on OhMyScheduler</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/categories/</link>
<link>https://kfcfans.gitee.io/categories/</link>
<description>Recent content in Categories on OhMyScheduler</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://kfcfans.gitee.io/ohmyscheduler/categories/index.xml" rel="self" type="application/rss+xml" />
<atom:link href="https://kfcfans.gitee.io/categories/index.xml" rel="self" type="application/rss+xml" />
</channel>

View File

@ -8,14 +8,14 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Docs" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/docs/" />
<meta property="og:url" content="https://kfcfans.gitee.io/docs/" />
<title>Docs | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/ohmyscheduler/docs/index.xml" title="OhMyScheduler" />
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/docs/index.xml" title="OhMyScheduler" />
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -31,7 +31,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -83,7 +83,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -93,7 +93,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -103,7 +103,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -116,10 +126,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -134,7 +144,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -144,7 +154,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -154,51 +170,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -239,13 +220,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>Docs</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>

View File

@ -2,12 +2,12 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Docs on OhMyScheduler</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/</link>
<link>https://kfcfans.gitee.io/docs/</link>
<description>Recent content in Docs on OhMyScheduler</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://kfcfans.gitee.io/ohmyscheduler/docs/index.xml" rel="self" type="application/rss+xml" />
<atom:link href="https://kfcfans.gitee.io/docs/index.xml" rel="self" type="application/rss+xml" />
</channel>

View File

@ -22,13 +22,13 @@
调度服务器oh-my-scheduler-server为了支持环境隔离分别采用了日常application-daily.properties、预发application-pre.properties和线上application-product.properties三套配置文件请根据实际需求进行修改以下为配置文件详解。
配置项 含义 可选 server.port SpringBoot配置HTTP端口号默认7700 否 oms." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/" />
<meta property="og:url" content="https://kfcfans.gitee.io/docs/startup/1-server-startup/" />
<title>调度中心Server部署 | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -44,7 +44,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -96,7 +96,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="active">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="active">调度中心Server部署</a>
</li>
@ -106,7 +106,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -116,7 +116,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -129,10 +139,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -147,7 +157,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -157,7 +167,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -167,51 +183,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -252,13 +233,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>调度中心Server部署</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>
@ -383,9 +364,10 @@ https://github.com/alex-shpak/hugo-book
<li>验证:访问<code>http://ip:port</code>查看是否出现OhMyScheduler的欢迎页面。</li>
</ul>
<h2 id="部署调度服务器docker">部署调度服务器—Docker</h2>
<blockquote>
<p><strong>建议自己根据项目中的Dockerfile稍作修改制作自己的Docker镜像而不是直接使用官方镜像</strong>原因在于容器功能需要用到Git和Maven来编译代码库而公司内部往往都会搭建自己的私有仓库所以Git容器功能没办法正常运行<strong>官方镜像中的调度服务器不支持Git容器的部署</strong>)。</p>
<blockquote class="book-hint warning">
<strong>建议自己根据项目中的Dockerfile稍作修改制作自己的Docker镜像而不是直接使用官方镜像</strong>原因在于容器功能需要用到Git和Maven来编译代码库而公司内部往往都会搭建自己的私有仓库所以Git容器功能没办法正常运行<strong>官方镜像中的调度服务器不支持Git容器的部署</strong>)。
</blockquote>
<p><a href="https://hub.docker.com/r/tjqq/oms-server">Docker Hub地址</a></p>
<p>部署流程:</p>
<ol>
@ -407,7 +389,7 @@ https://github.com/alex-shpak/hugo-book
<li>npm run build -&gt; nginx config</li>
</ol>
<hr>
<p><strong>特别鸣谢</strong>:感谢<a href="https://github.com/fengnan0929">某知名上市电商公司前端</a>对本项目的大力支持!</p>
<p><strong>特别鸣谢</strong>:感谢<a href="https://github.com/fengnan0929">某知名上市电商公司前端开发者</a>对本项目的大力支持!</p>
<h2 id="初始化应用分组">初始化应用分组</h2>
<blockquote>
<p>每一个业务系统初次接入OhMyScheduler时都需要<strong>先完成应用注册</strong></p>

View File

@ -5,24 +5,24 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="基于宿主应用的执行器初始化 宿主应用即原有的业务应用假如需要调度执行的任务与当前业务有较为紧密的联系建议采取该方式
OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
&lt;dependency&gt; &lt;groupId&gt;com.github.kfcfans&lt;/groupId&gt; &lt;artifactId&gt;oh-my-scheduler-worker&lt;/artifactId&gt; &lt;version&gt;1.2.0&lt;/version&gt; &lt;/dependency&gt; 其次填写执行器客户端配置文件OhMyConfig各参数说明如下表所示
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:">
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:
@Configuration public class OhMySchedulerConfig { @Bean public OhMyWorker initOMS() throws Exception { // 服务器HTTP地址端口号为 server.port而不是 ActorSystem port List&lt;String&gt; serverAddress = Lists.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="执行器Worker初始化" />
<meta property="og:description" content="基于宿主应用的执行器初始化 宿主应用即原有的业务应用假如需要调度执行的任务与当前业务有较为紧密的联系建议采取该方式
OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
&lt;dependency&gt; &lt;groupId&gt;com.github.kfcfans&lt;/groupId&gt; &lt;artifactId&gt;oh-my-scheduler-worker&lt;/artifactId&gt; &lt;version&gt;1.2.0&lt;/version&gt; &lt;/dependency&gt; 其次填写执行器客户端配置文件OhMyConfig各参数说明如下表所示
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:" />
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:
@Configuration public class OhMySchedulerConfig { @Bean public OhMyWorker initOMS() throws Exception { // 服务器HTTP地址端口号为 server.port而不是 ActorSystem port List&lt;String&gt; serverAddress = Lists." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/" />
<meta property="og:url" content="https://kfcfans.gitee.io/docs/startup/2-worker-startup/" />
<title>执行器Worker初始化 | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -38,7 +38,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -90,7 +90,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -100,7 +100,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="active">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="active">执行器Worker初始化</a>
</li>
@ -110,7 +110,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -123,10 +133,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -141,7 +151,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -151,7 +161,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -161,51 +177,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -246,13 +227,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>执行器Worker初始化</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>
@ -263,11 +244,8 @@ https://github.com/alex-shpak/hugo-book
<nav id="TableOfContents">
<ul>
<li><a href="#基于宿主应用的执行器初始化">基于宿主应用的执行器初始化</a>
<ul>
<li></li>
</ul>
</li>
<li><a href="#基于宿主应用的执行器初始化">基于宿主应用的执行器初始化</a></li>
<li><a href="#基于agent的执行器初始化">基于agent的执行器初始化</a></li>
</ul>
</nav>
@ -283,21 +261,6 @@ https://github.com/alex-shpak/hugo-book
<blockquote>
<p>宿主应用即原有的业务应用,假如需要调度执行的任务与当前业务有较为紧密的联系,建议采取该方式。</p>
</blockquote>
<blockquote>
<p>OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。</p>
</blockquote>
<ul>
<li>Java处理器可根据<strong>代码所处位置</strong>划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过<strong>容器技术</strong>详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。</li>
<li>Java处理器可根据<strong>对象创建者</strong>划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring<strong>强烈建议使用SpringBean处理器</strong>开发者仅需要将Processor注册进Spring IOC容器一个<code>@Component</code>注解或一句<code>bean</code>配置)。</li>
<li>Java处理器可根据<strong>功能</strong>划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。
<ul>
<li>单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。</li>
<li>广播处理器对应了广播任务,即某个任务的某次运行会<strong>调动集群内所有机器参与运算</strong></li>
<li>Map处理器对应了Map任务即某个任务在运行过程中<strong>允许产生子任务并分发到其他机器进行运算</strong></li>
<li>MapReduce处理器对应了MapReduce任务在Map任务的基础上<strong>增加了所有任务结束后的汇总统计</strong></li>
</ul>
</li>
</ul>
<p>首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库<a href="https://search.maven.org/search?q=oh-my-scheduler-worker">推荐地址</a>&amp;<a href="https://mvnrepository.com/search?q=com.github.kfcfans">备用地址</a></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;dependency&gt;</span>
<span style="color:#f92672">&lt;groupId&gt;</span>com.github.kfcfans<span style="color:#f92672">&lt;/groupId&gt;</span>
@ -371,19 +334,53 @@ https://github.com/alex-shpak/hugo-book
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><p>非Spring应用程序在创建<code>OhMyWorker</code>对象后手动调用<code>ohMyWorker.init()</code>方法完成初始化即可。</p>
<h4 id="基于agent的执行器初始化">基于agent的执行器初始化</h4>
<hr>
<p><strong>OhMyScheduler日志单独配置</strong></p>
<p>目前OhMyScheduler-Worker并没有实现自己的LogFactory如果有需求的话请提ISSUE可以考虑实现原因如下</p>
<ol>
<li>OhMyScheduler-Worker的日志基于<code>Slf4J</code>输出即采用了基于门面设计模式的日志框架宿主应用无论如何都可以搭起Slf4J与实际的日志框架这座桥梁。</li>
<li>减轻了部分开发工作量不再需要实现自己的LogFactory虽然不怎么难就是了&hellip;)。</li>
</ol>
<p>为此为了顺利且友好地输出日志请在日志配置文件logback.xml/log4j2.xml/&hellip;)中为<code>OhMyScheduler-Worker</code>单独进行日志配置比如logback示例</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;appender</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;OMS_WORKER_APPENDER&#34;</span> <span style="color:#a6e22e">class=</span><span style="color:#e6db74">&#34;ch.qos.logback.core.rolling.RollingFileAppender&#34;</span><span style="color:#f92672">&gt;</span>
<span style="color:#f92672">&lt;file&gt;</span>${LOG_PATH}/oms-worker.log<span style="color:#f92672">&lt;/file&gt;</span>
<span style="color:#f92672">&lt;rollingPolicy</span> <span style="color:#a6e22e">class=</span><span style="color:#e6db74">&#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy&#34;</span><span style="color:#f92672">&gt;</span>
<span style="color:#f92672">&lt;FileNamePattern&gt;</span>${LOG_PATH}/oms-worker.%d{yyyy-MM-dd}.log<span style="color:#f92672">&lt;/FileNamePattern&gt;</span>
<span style="color:#f92672">&lt;MaxHistory&gt;</span>7<span style="color:#f92672">&lt;/MaxHistory&gt;</span>
<span style="color:#f92672">&lt;/rollingPolicy&gt;</span>
<span style="color:#f92672">&lt;encoder</span> <span style="color:#a6e22e">class=</span><span style="color:#e6db74">&#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder&#34;</span><span style="color:#f92672">&gt;</span>
<span style="color:#f92672">&lt;pattern&gt;</span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n<span style="color:#f92672">&lt;/pattern&gt;</span>
<span style="color:#f92672">&lt;charset&gt;</span>UTF-8<span style="color:#f92672">&lt;/charset&gt;</span>
<span style="color:#f92672">&lt;/encoder&gt;</span>
<span style="color:#f92672">&lt;append&gt;</span>true<span style="color:#f92672">&lt;/append&gt;</span>
<span style="color:#f92672">&lt;/appender&gt;</span>
<span style="color:#f92672">&lt;logger</span> <span style="color:#a6e22e">name=</span><span style="color:#e6db74">&#34;com.github.kfcfans.oms.worker&#34;</span> <span style="color:#a6e22e">level=</span><span style="color:#e6db74">&#34;INFO&#34;</span> <span style="color:#a6e22e">additivity=</span><span style="color:#e6db74">&#34;false&#34;</span><span style="color:#f92672">&gt;</span>
<span style="color:#f92672">&lt;appender-ref</span> <span style="color:#a6e22e">ref=</span><span style="color:#e6db74">&#34;OMS_WORKER_APPENDER&#34;</span> <span style="color:#f92672">/&gt;</span>
<span style="color:#f92672">&lt;/logger&gt;</span>
</code></pre></div><p>无论如何OhMyScheduler-Worker启动时都会打印Banner如下所示您可以通过Banner来判断日志配置是否成功emmm&hellip;Markdown显示似乎有点丑实际上超帅的呢</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-text" data-lang="text"> ███████ ██ ████ ████ ████████ ██ ██ ██
██░░░░░██ ░██ ░██░██ ██░██ ██ ██ ██░░░░░░ ░██ ░██ ░██
██ ░░██░██ ░██░░██ ██ ░██ ░░██ ██ ░██ █████ ░██ █████ ░██ ██ ██ ░██ █████ ██████
░██ ░██░██████ ░██ ░░███ ░██ ░░███ ░█████████ ██░░░██░██████ ██░░░██ ██████░██ ░██ ░██ ██░░░██░░██░░█
░██ ░██░██░░░██░██ ░░█ ░██ ░██ ░░░░░░░░██░██ ░░ ░██░░░██░███████ ██░░░██░██ ░██ ░██░███████ ░██ ░
░░██ ██ ░██ ░██░██ ░ ░██ ██ ░██░██ ██░██ ░██░██░░░░ ░██ ░██░██ ░██ ░██░██░░░░ ░██
░░███████ ░██ ░██░██ ░██ ██ ████████ ░░█████ ░██ ░██░░██████░░██████░░██████ ███░░██████░███
░░░░░░░ ░░ ░░ ░░ ░░ ░░ ░░░░░░░░ ░░░░░ ░░ ░░ ░░░░░░ ░░░░░░ ░░░░░░ ░░░ ░░░░░░ ░░░
</code></pre></div><h2 id="基于agent的执行器初始化">基于agent的执行器初始化</h2>
<blockquote>
<p>agent是一个没有任何业务逻辑的执行器其实就是为worker加了一个main方法</p>
</blockquote>
<p>代码编译方式启动示例:<code>java -jar oh-my-scheduler-worker-agent-1.2.0.jar -a my-agent</code></p>
<pre><code>Usage: OhMyAgent [-hV] -a=&lt;appName&gt; [-l=&lt;length&gt;] [-p=&lt;storeStrategy&gt;]
[-s=&lt;server&gt;]
<pre><code>Usage: OhMyAgent [-hV] -a=&lt;appName&gt; [-e=&lt;storeStrategy&gt;] [-l=&lt;length&gt;]
[-p=&lt;port&gt;] [-s=&lt;server&gt;]
OhMyScheduler-Worker代理
-a, --app=&lt;appName&gt; worker-agent名称可通过调度中心控制台创建
-e, --persistence=&lt;storeStrategy&gt;
存储策略枚举值DISK 或 MEMORY
-h, --help Show this help message and exit.
-l, --length=&lt;length&gt; 返回值最大长度
-p, --persistence=&lt;storeStrategy&gt;
存储策略枚举值DISK 或 MEMORY
-p, --port=&lt;port&gt; worker-agent的ActorSystem监听端口不建议更改
-s, --server=&lt;server&gt; 调度中心地址,多值英文逗号分隔,格式 IP:Port OR domain
-V, --version Print version information and exit.
@ -422,11 +419,8 @@ OhMyScheduler-Worker代理
<nav id="TableOfContents">
<ul>
<li><a href="#基于宿主应用的执行器初始化">基于宿主应用的执行器初始化</a>
<ul>
<li></li>
</ul>
</li>
<li><a href="#基于宿主应用的执行器初始化">基于宿主应用的执行器初始化</a></li>
<li><a href="#基于agent的执行器初始化">基于agent的执行器初始化</a></li>
</ul>
</nav>

View File

@ -5,20 +5,22 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="处理器概述 OhMyScheduler当前支持ShellPython等脚本处理器和Java处理器脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述本章将重点阐述Java处理器开发方法与使用技巧
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 初始化宿主应用 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
&lt;dependency&gt; &lt;groupId&gt;com.github.kfcfans&lt;/groupId&gt; &lt;artifactId&gt;oh-my-scheduler-worker&lt;/artifactId&gt; &lt;version&gt;1.2.0&lt;/version&gt; &lt;/dependency&gt; ">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="处理器编写" />
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器BasicProcessor对应了单机任务即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器BroadcastProcessor对应了广播任务即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器MapProcessor对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器MapReduceProcessor对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 核心方法process 任意Java处理器都需要实现处理的核心方法其接口签名如下
ProcessResult process(TaskContext context) throws Exception; 方法入参TaskContext包含了本次处理的上下文信息具体属性如下
属性名称 意义/用法 jobId 任务ID开发者一般无需关心此参数 instanceId 任务实例ID全局唯一开发者一般无需关心此参数 subInstanceId 子任务实例ID秒级任务使用开发者一般无需关心此参数 taskId 采用链式命名法的ID在某个任务实例内唯一开发者一般无需关心此参数 taskName task名称Map/MapReduce任务的子任务的值为开发者指定否则为系统默认值开发者一般无需关心此参数 jobParams 任务参数,其值等同于控制台录入的任务参数,常用! instanceParams 任务实例参数其值等同于使用OpenAPI运行任务实例时传递的参数常用 maxRetryTimes Task的最大重试次数 currentRetryTimes Task的当前重试次数和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会 subTask 子TaskMap/MapReduce处理器专属开发者调用map方法时传递的子任务列表中的某一个 omsLogger 在线日志用法同Slf4J记录的日志可以直接通过控制台查看非常便捷和强大不过使用过程中需要注意频率可能对Server造成巨大的压力 方法的返回值为ProcessResult代表了本次Task执行的结果包含success和msg两个属性分别用于传递Task是否执行成功和Task需要返回的信息。">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="处理器开发" />
<meta property="og:description" content="处理器概述 OhMyScheduler当前支持ShellPython等脚本处理器和Java处理器脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述本章将重点阐述Java处理器开发方法与使用技巧
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 初始化宿主应用 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;备用地址
&lt;dependency&gt; &lt;groupId&gt;com.github.kfcfans&lt;/groupId&gt; &lt;artifactId&gt;oh-my-scheduler-worker&lt;/artifactId&gt; &lt;version&gt;1.2.0&lt;/version&gt; &lt;/dependency&gt; " />
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器BasicProcessor对应了单机任务即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器BroadcastProcessor对应了广播任务即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器MapProcessor对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器MapReduceProcessor对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 核心方法process 任意Java处理器都需要实现处理的核心方法其接口签名如下
ProcessResult process(TaskContext context) throws Exception; 方法入参TaskContext包含了本次处理的上下文信息具体属性如下
属性名称 意义/用法 jobId 任务ID开发者一般无需关心此参数 instanceId 任务实例ID全局唯一开发者一般无需关心此参数 subInstanceId 子任务实例ID秒级任务使用开发者一般无需关心此参数 taskId 采用链式命名法的ID在某个任务实例内唯一开发者一般无需关心此参数 taskName task名称Map/MapReduce任务的子任务的值为开发者指定否则为系统默认值开发者一般无需关心此参数 jobParams 任务参数,其值等同于控制台录入的任务参数,常用! instanceParams 任务实例参数其值等同于使用OpenAPI运行任务实例时传递的参数常用 maxRetryTimes Task的最大重试次数 currentRetryTimes Task的当前重试次数和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会 subTask 子TaskMap/MapReduce处理器专属开发者调用map方法时传递的子任务列表中的某一个 omsLogger 在线日志用法同Slf4J记录的日志可以直接通过控制台查看非常便捷和强大不过使用过程中需要注意频率可能对Server造成巨大的压力 方法的返回值为ProcessResult代表了本次Task执行的结果包含success和msg两个属性分别用于传递Task是否执行成功和Task需要返回的信息。" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/" />
<meta property="og:url" content="https://kfcfans.gitee.io/docs/startup/3-processor-develop/" />
<title>处理器编写 | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<title>处理器开发 | OhMyScheduler</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -34,7 +36,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -86,7 +88,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -96,7 +98,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -106,7 +108,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="active">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="active">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -119,10 +131,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -137,7 +149,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -147,7 +159,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -157,51 +175,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -242,13 +225,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>处理器编写</strong>
<strong>处理器开发</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>
@ -260,7 +243,13 @@ https://github.com/alex-shpak/hugo-book
<nav id="TableOfContents">
<ul>
<li><a href="#处理器概述">处理器概述</a></li>
<li><a href="#初始化宿主应用">初始化宿主应用</a></li>
<li><a href="#核心方法process">核心方法process</a></li>
<li><a href="#单机处理器basicprocessor">单机处理器BasicProcessor</a></li>
<li><a href="#广播处理器broadcastprocessor">广播处理器BroadcastProcessor</a></li>
<li><a href="#并行处理器mapreduceprocessor">并行处理器MapReduceProcessor</a></li>
<li><a href="#最佳实践mapreduce实现静态分片">最佳实践MapReduce实现静态分片</a></li>
<li><a href="#最佳实践mapreduce多级分发处理">最佳实践MapReduce多级分发处理</a></li>
<li><a href="#更多示例">更多示例</a></li>
</ul>
</nav>
@ -281,21 +270,281 @@ https://github.com/alex-shpak/hugo-book
<li>Java处理器可根据<strong>对象创建者</strong>划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring<strong>强烈建议使用SpringBean处理器</strong>开发者仅需要将Processor注册进Spring IOC容器一个<code>@Component</code>注解或一句<code>bean</code>配置)。</li>
<li>Java处理器可根据<strong>功能</strong>划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。
<ul>
<li>单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。</li>
<li>广播处理器对应了广播任务,即某个任务的某次运行会<strong>调动集群内所有机器参与运算</strong></li>
<li>Map处理器对应了Map任务即某个任务在运行过程中<strong>允许产生子任务并分发到其他机器进行运算</strong></li>
<li>MapReduce处理器对应了MapReduce任务在Map任务的基础上<strong>增加了所有任务结束后的汇总统计</strong></li>
<li>单机处理器<code>BasicProcessor</code>对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。</li>
<li>广播处理器<code>BroadcastProcessor</code>对应了广播任务,即某个任务的某次运行会<strong>调动集群内所有机器参与运算</strong></li>
<li>Map处理器<code>MapProcessor</code>对应了Map任务即某个任务在运行过程中<strong>允许产生子任务并分发到其他机器进行运算</strong></li>
<li>MapReduce处理器<code>MapReduceProcessor</code>对应了MapReduce任务在Map任务的基础上<strong>增加了所有任务结束后的汇总统计</strong></li>
</ul>
</li>
</ul>
<h2 id="初始化宿主应用">初始化宿主应用</h2>
<p>首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库<a href="https://search.maven.org/search?q=oh-my-scheduler-worker">推荐地址</a>&amp;<a href="https://mvnrepository.com/search?q=com.github.kfcfans">备用地址</a></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;dependency&gt;</span>
<span style="color:#f92672">&lt;groupId&gt;</span>com.github.kfcfans<span style="color:#f92672">&lt;/groupId&gt;</span>
<span style="color:#f92672">&lt;artifactId&gt;</span>oh-my-scheduler-worker<span style="color:#f92672">&lt;/artifactId&gt;</span>
<span style="color:#f92672">&lt;version&gt;</span>1.2.0<span style="color:#f92672">&lt;/version&gt;</span>
<span style="color:#f92672">&lt;/dependency&gt;</span>
</code></pre></div></article>
<h2 id="核心方法process">核心方法process</h2>
<p>任意Java处理器都需要实现处理的核心方法其接口签名如下</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java">ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception<span style="color:#f92672">;</span>
</code></pre></div><p>方法入参<code>TaskContext</code>,包含了本次处理的上下文信息,具体属性如下:</p>
<table>
<thead>
<tr>
<th>属性名称</th>
<th>意义/用法</th>
</tr>
</thead>
<tbody>
<tr>
<td>jobId</td>
<td>任务ID开发者一般无需关心此参数</td>
</tr>
<tr>
<td>instanceId</td>
<td>任务实例ID全局唯一开发者一般无需关心此参数</td>
</tr>
<tr>
<td>subInstanceId</td>
<td>子任务实例ID秒级任务使用开发者一般无需关心此参数</td>
</tr>
<tr>
<td>taskId</td>
<td>采用链式命名法的ID在某个任务实例内唯一开发者一般无需关心此参数</td>
</tr>
<tr>
<td>taskName</td>
<td>task名称Map/MapReduce任务的子任务的值为开发者指定否则为系统默认值开发者一般无需关心此参数</td>
</tr>
<tr>
<td>jobParams</td>
<td>任务参数,其值等同于控制台录入的<strong>任务参数</strong>,常用!</td>
</tr>
<tr>
<td>instanceParams</td>
<td>任务实例参数其值等同于使用OpenAPI运行任务实例时传递的参数常用</td>
</tr>
<tr>
<td>maxRetryTimes</td>
<td>Task的最大重试次数</td>
</tr>
<tr>
<td>currentRetryTimes</td>
<td>Task的当前重试次数和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会</td>
</tr>
<tr>
<td>subTask</td>
<td>子TaskMap/MapReduce处理器专属开发者调用map方法时传递的子任务列表中的某一个</td>
</tr>
<tr>
<td>omsLogger</td>
<td>在线日志用法同Slf4J记录的日志可以直接通过控制台查看非常便捷和强大不过使用过程中需要注意频率可能对Server造成巨大的压力</td>
</tr>
</tbody>
</table>
<p>方法的返回值为<code>ProcessResult</code>代表了本次Task执行的结果包含<code>success</code><code>msg</code>两个属性分别用于传递Task是否执行成功和Task需要返回的信息。</p>
<h2 id="单机处理器basicprocessor">单机处理器BasicProcessor</h2>
<p>单机执行的策略下server会在所有可用worker中选取健康度最佳的机器进行执行。单机执行任务需要实现接口<code>BasicProcessor</code>,代码示例如下:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#75715e">// 支持 SpringBean 的形式
</span><span style="color:#75715e"></span><span style="color:#a6e22e">@Component</span>
<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">BasicProcessorDemo</span> <span style="color:#66d9ef">implements</span> BasicProcessor <span style="color:#f92672">{</span>
<span style="color:#a6e22e">@Resource</span>
<span style="color:#66d9ef">private</span> MysteryService mysteryService<span style="color:#f92672">;</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#75715e">// 在线日志功能,可以直接在控制台查看任务日志,非常便捷
</span><span style="color:#75715e"></span> OmsLogger omsLogger <span style="color:#f92672">=</span> context<span style="color:#f92672">.</span><span style="color:#a6e22e">getOmsLogger</span><span style="color:#f92672">();</span>
omsLogger<span style="color:#f92672">.</span><span style="color:#a6e22e">info</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;BasicProcessorDemo start to process, current JobParams is {}.&#34;</span><span style="color:#f92672">,</span> context<span style="color:#f92672">.</span><span style="color:#a6e22e">getJobParams</span><span style="color:#f92672">());</span>
<span style="color:#75715e">// TaskContext为任务的上下文信息包含了在控制台录入的任务元数据常用字段为
</span><span style="color:#75715e"></span> <span style="color:#75715e">// jobParams任务参数在控制台录入instanceParams任务实例参数通过 OpenAPI 触发的任务实例才可能存在该参数)
</span><span style="color:#75715e"></span>
<span style="color:#75715e">// 进行实际处理...
</span><span style="color:#75715e"></span> mysteryService<span style="color:#f92672">.</span><span style="color:#a6e22e">hasaki</span><span style="color:#f92672">();</span>
<span style="color:#75715e">// 返回结果,该结果会被持久化到数据库,在前端页面直接查看,极为方便
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;result is xxx&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><h2 id="广播处理器broadcastprocessor">广播处理器BroadcastProcessor</h2>
<p>广播执行的策略下,所有机器都会被调度执行该任务。为了便于资源的准备和释放,广播处理器在<code>BasicProcessor</code>的基础上额外增加了<code>preProcess</code><code>postProcess</code>方法,分别在整个集群开始之前/结束之后<strong>选一台机器</strong>执行相关方法。代码示例如下:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a6e22e">@Component</span>
<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">BroadcastProcessorDemo</span> <span style="color:#66d9ef">extends</span> BroadcastProcessor <span style="color:#f92672">{</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">preProcess</span><span style="color:#f92672">(</span>TaskContext taskContext<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#75715e">// 预执行,会在所有 worker 执行 process 方法前调用
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;init success&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#75715e">// 撰写整个worker集群都会执行的代码逻辑
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;release resource success&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">postProcess</span><span style="color:#f92672">(</span>TaskContext taskContext<span style="color:#f92672">,</span> List<span style="color:#f92672">&lt;</span>TaskResult<span style="color:#f92672">&gt;</span> taskResults<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#75715e">// taskResults 存储了所有worker执行的结果包括preProcess
</span><span style="color:#75715e"></span>
<span style="color:#75715e">// 收尾,会在所有 worker 执行完毕 process 方法后调用,该结果将作为最终的执行结果
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;process success&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><h2 id="并行处理器mapreduceprocessor">并行处理器MapReduceProcessor</h2>
<p>MapReduce是最复杂也是最强大的一种执行器它允许开发者完成任务的拆分将子任务派发到集群中其他Worker执行是执行大批量处理任务的不二之选实现MapReduce处理器需要继承<code>MapReduceProcessor</code>类,具体用法如下示例代码所示:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a6e22e">@Component</span>
<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">MapReduceProcessorDemo</span> <span style="color:#66d9ef">extends</span> MapReduceProcessor <span style="color:#f92672">{</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#75715e">// 判断是否为根任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>isRootTask<span style="color:#f92672">())</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 构造子任务
</span><span style="color:#75715e"></span> List<span style="color:#f92672">&lt;</span>SubTask<span style="color:#f92672">&gt;</span> subTaskList <span style="color:#f92672">=</span> Lists<span style="color:#f92672">.</span><span style="color:#a6e22e">newLinkedList</span><span style="color:#f92672">();</span>
<span style="color:#75715e">/*
</span><span style="color:#75715e"> * 子任务的构造由开发者自己定义
</span><span style="color:#75715e"> * eg. 现在需要从文件中读取100W个ID并处理数据库中这些ID对应的数据那么步骤如下
</span><span style="color:#75715e"> * 1. 根任务RootTask读取文件流式拉取100W个ID并按1000个一批的大小组装成子任务进行派发
</span><span style="color:#75715e"> * 2. 非根任务获取子任务,完成业务逻辑的处理
</span><span style="color:#75715e"> */</span>
<span style="color:#75715e">// 调用 map 方法,派发子任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> map<span style="color:#f92672">(</span>subTaskList<span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;DATA_PROCESS_TASK&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#75715e">// 非子任务,可根据 subTask 的类型 或 TaskName 来判断分支
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>context<span style="color:#f92672">.</span><span style="color:#a6e22e">getSubTask</span><span style="color:#f92672">()</span> <span style="color:#66d9ef">instanceof</span> SubTask<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 执行子任务,注:子任务人可以 map 产生新的子任务,可以构建任意级的 MapReduce 处理器
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;PROCESS_SUB_TASK_SUCCESS&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">false</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;UNKNOWN_BUG&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">reduce</span><span style="color:#f92672">(</span>TaskContext taskContext<span style="color:#f92672">,</span> List<span style="color:#f92672">&lt;</span>TaskResult<span style="color:#f92672">&gt;</span> taskResults<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 所有 Task 执行结束后reduce 将会被执行
</span><span style="color:#75715e"></span> <span style="color:#75715e">// taskResults 保存了所有子任务的执行结果
</span><span style="color:#75715e"></span>
<span style="color:#75715e">// 用法举例,统计执行结果
</span><span style="color:#75715e"></span> AtomicLong successCnt <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> AtomicLong<span style="color:#f92672">(</span>0<span style="color:#f92672">);</span>
taskResults<span style="color:#f92672">.</span><span style="color:#a6e22e">forEach</span><span style="color:#f92672">(</span>tr <span style="color:#f92672">-&gt;</span> <span style="color:#f92672">{</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>tr<span style="color:#f92672">.</span><span style="color:#a6e22e">isSuccess</span><span style="color:#f92672">())</span> <span style="color:#f92672">{</span>
successCnt<span style="color:#f92672">.</span><span style="color:#a6e22e">incrementAndGet</span><span style="color:#f92672">();</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">});</span>
<span style="color:#75715e">// 该结果将作为任务最终的执行结果
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;success task num:&#34;</span> <span style="color:#f92672">+</span> successCnt<span style="color:#f92672">.</span><span style="color:#a6e22e">get</span><span style="color:#f92672">());</span>
<span style="color:#f92672">}</span>
<span style="color:#75715e">// 自定义的子任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">SubTask</span> <span style="color:#f92672">{</span>
<span style="color:#66d9ef">private</span> Long siteId<span style="color:#f92672">;</span>
<span style="color:#66d9ef">private</span> List<span style="color:#f92672">&lt;</span>Long<span style="color:#f92672">&gt;</span> idList<span style="color:#f92672">;</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><p>Map处理器相当于MapReduce处理器的阉割版本阉割了<code>reduce</code>方法),此处不再单独举例。</p>
<h2 id="最佳实践mapreduce实现静态分片">最佳实践MapReduce实现静态分片</h2>
<p>虽然说这有点傻鸡焉用牛刀的感觉,不过既然目前市场上同类产品都处于静态分片的阶段,我也就在这里给大家举个例子吧~</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a6e22e">@Component</span>
<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">StaticSliceProcessor</span> <span style="color:#66d9ef">extends</span> MapReduceProcessor <span style="color:#f92672">{</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
OmsLogger omsLogger <span style="color:#f92672">=</span> context<span style="color:#f92672">.</span><span style="color:#a6e22e">getOmsLogger</span><span style="color:#f92672">();</span>
<span style="color:#75715e">// root task 负责分发任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>isRootTask<span style="color:#f92672">())</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 从控制台传递分片参数架设格式为KV1=a&amp;2=b&amp;3=c
</span><span style="color:#75715e"></span> String jobParams <span style="color:#f92672">=</span> context<span style="color:#f92672">.</span><span style="color:#a6e22e">getJobParams</span><span style="color:#f92672">();</span>
Map<span style="color:#f92672">&lt;</span>String<span style="color:#f92672">,</span> String<span style="color:#f92672">&gt;</span> paramsMap <span style="color:#f92672">=</span> Splitter<span style="color:#f92672">.</span><span style="color:#a6e22e">on</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;&amp;&#34;</span><span style="color:#f92672">).</span><span style="color:#a6e22e">withKeyValueSeparator</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;=&#34;</span><span style="color:#f92672">).</span><span style="color:#a6e22e">split</span><span style="color:#f92672">(</span>jobParams<span style="color:#f92672">);</span>
List<span style="color:#f92672">&lt;</span>SubTask<span style="color:#f92672">&gt;</span> subTasks <span style="color:#f92672">=</span> Lists<span style="color:#f92672">.</span><span style="color:#a6e22e">newLinkedList</span><span style="color:#f92672">();</span>
paramsMap<span style="color:#f92672">.</span><span style="color:#a6e22e">forEach</span><span style="color:#f92672">((</span>k<span style="color:#f92672">,</span> v<span style="color:#f92672">)</span> <span style="color:#f92672">-&gt;</span> subTasks<span style="color:#f92672">.</span><span style="color:#a6e22e">add</span><span style="color:#f92672">(</span><span style="color:#66d9ef">new</span> SubTask<span style="color:#f92672">(</span>Integer<span style="color:#f92672">.</span><span style="color:#a6e22e">parseInt</span><span style="color:#f92672">(</span>k<span style="color:#f92672">),</span> v<span style="color:#f92672">)));</span>
<span style="color:#66d9ef">return</span> map<span style="color:#f92672">(</span>subTasks<span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;SLICE_TASK&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
Object subTask <span style="color:#f92672">=</span> context<span style="color:#f92672">.</span><span style="color:#a6e22e">getSubTask</span><span style="color:#f92672">();</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>subTask <span style="color:#66d9ef">instanceof</span> SubTask<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 实际处理
</span><span style="color:#75715e"></span> <span style="color:#75715e">// 当然,如果觉得 subTask 还是很大,也可以继续分发哦
</span><span style="color:#75715e"></span>
<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;subTask:&#34;</span> <span style="color:#f92672">+</span> <span style="color:#f92672">((</span>SubTask<span style="color:#f92672">)</span> subTask<span style="color:#f92672">).</span><span style="color:#a6e22e">getIndex</span><span style="color:#f92672">()</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34; process successfully&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">false</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;UNKNOWN BUG&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">reduce</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">,</span> List<span style="color:#f92672">&lt;</span>TaskResult<span style="color:#f92672">&gt;</span> taskResults<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// 按需求做一些统计工作... 不需要的话,直接使用 Map 处理器即可
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;xxxx&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Getter</span>
<span style="color:#a6e22e">@NoArgsConstructor</span>
<span style="color:#a6e22e">@AllArgsConstructor</span>
<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">SubTask</span> <span style="color:#f92672">{</span>
<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">int</span> index<span style="color:#f92672">;</span>
<span style="color:#66d9ef">private</span> String params<span style="color:#f92672">;</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><h2 id="最佳实践mapreduce多级分发处理">最佳实践MapReduce多级分发处理</h2>
<p>利用MapReduce实现 Root -&gt; A -&gt; B/C -&gt; Reduce的DAG 工作流。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#a6e22e">@Component</span>
<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">DAGSimulationProcessor</span> <span style="color:#66d9ef">extends</span> MapReduceProcessor <span style="color:#f92672">{</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">process</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> Exception <span style="color:#f92672">{</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>isRootTask<span style="color:#f92672">())</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// L1. 执行根任务
</span><span style="color:#75715e"></span>
<span style="color:#75715e">// 执行完毕后产生子任务 A需要传递的参数可以作为 TaskA 的属性进行传递
</span><span style="color:#75715e"></span> TaskA taskA <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> TaskA<span style="color:#f92672">();</span>
<span style="color:#66d9ef">return</span> map<span style="color:#f92672">(</span>Lists<span style="color:#f92672">.</span><span style="color:#a6e22e">newArrayList</span><span style="color:#f92672">(</span>taskA<span style="color:#f92672">),</span> <span style="color:#e6db74">&#34;LEVEL1_TASK_A&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>context<span style="color:#f92672">.</span><span style="color:#a6e22e">getSubTask</span><span style="color:#f92672">()</span> <span style="color:#66d9ef">instanceof</span> TaskA<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// L2. 执行A任务
</span><span style="color:#75715e"></span>
<span style="color:#75715e">// 执行完成后产生子任务 BC并行执行
</span><span style="color:#75715e"></span> TaskB taskB <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> TaskB<span style="color:#f92672">();</span>
TaskC taskC <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> TaskC<span style="color:#f92672">();</span>
<span style="color:#66d9ef">return</span> map<span style="color:#f92672">(</span>Lists<span style="color:#f92672">.</span><span style="color:#a6e22e">newArrayList</span><span style="color:#f92672">(</span>taskB<span style="color:#f92672">,</span> taskC<span style="color:#f92672">),</span> <span style="color:#e6db74">&#34;LEVEL2_TASK_BC&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>context<span style="color:#f92672">.</span><span style="color:#a6e22e">getSubTask</span><span style="color:#f92672">()</span> <span style="color:#66d9ef">instanceof</span> TaskB<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// L3. 执行B任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;xxx&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>context<span style="color:#f92672">.</span><span style="color:#a6e22e">getSubTask</span><span style="color:#f92672">()</span> <span style="color:#66d9ef">instanceof</span> TaskC<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// L3. 执行C任务
</span><span style="color:#75715e"></span> <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;xxx&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">false</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;UNKNOWN_TYPE_OF_SUB_TASK&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#a6e22e">@Override</span>
<span style="color:#66d9ef">public</span> ProcessResult <span style="color:#a6e22e">reduce</span><span style="color:#f92672">(</span>TaskContext context<span style="color:#f92672">,</span> List<span style="color:#f92672">&lt;</span>TaskResult<span style="color:#f92672">&gt;</span> taskResults<span style="color:#f92672">)</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// L4. 执行最终 Reduce 任务taskResults保存了之前所有任务的结果
</span><span style="color:#75715e"></span> taskResults<span style="color:#f92672">.</span><span style="color:#a6e22e">forEach</span><span style="color:#f92672">(</span>taskResult <span style="color:#f92672">-&gt;</span> <span style="color:#f92672">{</span>
<span style="color:#75715e">// do something...
</span><span style="color:#75715e"></span> <span style="color:#f92672">});</span>
<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> ProcessResult<span style="color:#f92672">(</span><span style="color:#66d9ef">true</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;reduce success&#34;</span><span style="color:#f92672">);</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">TaskA</span> <span style="color:#f92672">{</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">TaskB</span> <span style="color:#f92672">{</span>
<span style="color:#f92672">}</span>
<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">TaskC</span> <span style="color:#f92672">{</span>
<span style="color:#f92672">}</span>
<span style="color:#f92672">}</span>
</code></pre></div><h2 id="更多示例">更多示例</h2>
<p>没看够?更多示例请见:<a href="https://github.com/KFCFans/OhMyScheduler/tree/master/oh-my-scheduler-worker-samples">oh-my-scheduler-worker-samples</a></p>
</article>
@ -330,7 +579,13 @@ https://github.com/alex-shpak/hugo-book
<nav id="TableOfContents">
<ul>
<li><a href="#处理器概述">处理器概述</a></li>
<li><a href="#初始化宿主应用">初始化宿主应用</a></li>
<li><a href="#核心方法process">核心方法process</a></li>
<li><a href="#单机处理器basicprocessor">单机处理器BasicProcessor</a></li>
<li><a href="#广播处理器broadcastprocessor">广播处理器BroadcastProcessor</a></li>
<li><a href="#并行处理器mapreduceprocessor">并行处理器MapReduceProcessor</a></li>
<li><a href="#最佳实践mapreduce实现静态分片">最佳实践MapReduce实现静态分片</a></li>
<li><a href="#最佳实践mapreduce多级分发处理">最佳实践MapReduce多级分发处理</a></li>
<li><a href="#更多示例">更多示例</a></li>
</ul>
</nav>

View File

@ -8,14 +8,14 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="快速开始" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/" />
<meta property="og:url" content="https://kfcfans.gitee.io/docs/startup/" />
<title>快速开始 | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/index.xml" title="OhMyScheduler" />
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/docs/startup/index.xml" title="OhMyScheduler" />
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -31,7 +31,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -83,7 +83,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -93,7 +93,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -103,7 +103,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -116,10 +126,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -134,7 +144,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -144,7 +154,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -154,51 +170,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -239,13 +220,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>快速开始</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>

View File

@ -2,20 +2,20 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>快速开始 on OhMyScheduler</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/</link>
<link>https://kfcfans.gitee.io/docs/startup/</link>
<description>Recent content in 快速开始 on OhMyScheduler</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://kfcfans.gitee.io/ohmyscheduler/docs/startup/index.xml" rel="self" type="application/rss+xml" />
<atom:link href="https://kfcfans.gitee.io/docs/startup/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>调度中心Server部署</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/</link>
<link>https://kfcfans.gitee.io/docs/startup/1-server-startup/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/</guid>
<guid>https://kfcfans.gitee.io/docs/startup/1-server-startup/</guid>
<description>环境要求 Open JDK 8+
Apache Maven 3+
任意 Spring Data Jpa 支持的关系型数据库MySQL/Oracle/MS SQLServer&amp;hellip;
@ -28,26 +28,45 @@
<item>
<title>执行器Worker初始化</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/</link>
<link>https://kfcfans.gitee.io/docs/startup/2-worker-startup/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/</guid>
<guid>https://kfcfans.gitee.io/docs/startup/2-worker-startup/</guid>
<description>基于宿主应用的执行器初始化 宿主应用即原有的业务应用,假如需要调度执行的任务与当前业务有较为紧密的联系,建议采取该方式。
OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.kfcfans&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;oh-my-scheduler-worker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 其次填写执行器客户端配置文件OhMyConfig各参数说明如下表所示
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:</description>
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:
@Configuration public class OhMySchedulerConfig { @Bean public OhMyWorker initOMS() throws Exception { // 服务器HTTP地址端口号为 server.port而不是 ActorSystem port List&amp;lt;String&amp;gt; serverAddress = Lists.</description>
</item>
<item>
<title>处理器编写</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/</link>
<title>处理器开发</title>
<link>https://kfcfans.gitee.io/docs/startup/3-processor-develop/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/</guid>
<guid>https://kfcfans.gitee.io/docs/startup/3-processor-develop/</guid>
<description>处理器概述 OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 初始化宿主应用 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.kfcfans&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;oh-my-scheduler-worker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; </description>
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器BasicProcessor对应了单机任务即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器BroadcastProcessor对应了广播任务即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器MapProcessor对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器MapReduceProcessor对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 核心方法process 任意Java处理器都需要实现处理的核心方法其接口签名如下
ProcessResult process(TaskContext context) throws Exception; 方法入参TaskContext包含了本次处理的上下文信息具体属性如下
属性名称 意义/用法 jobId 任务ID开发者一般无需关心此参数 instanceId 任务实例ID全局唯一开发者一般无需关心此参数 subInstanceId 子任务实例ID秒级任务使用开发者一般无需关心此参数 taskId 采用链式命名法的ID在某个任务实例内唯一开发者一般无需关心此参数 taskName task名称Map/MapReduce任务的子任务的值为开发者指定否则为系统默认值开发者一般无需关心此参数 jobParams 任务参数,其值等同于控制台录入的任务参数,常用! instanceParams 任务实例参数其值等同于使用OpenAPI运行任务实例时传递的参数常用 maxRetryTimes Task的最大重试次数 currentRetryTimes Task的当前重试次数和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会 subTask 子TaskMap/MapReduce处理器专属开发者调用map方法时传递的子任务列表中的某一个 omsLogger 在线日志用法同Slf4J记录的日志可以直接通过控制台查看非常便捷和强大不过使用过程中需要注意频率可能对Server造成巨大的压力 方法的返回值为ProcessResult代表了本次Task执行的结果包含success和msg两个属性分别用于传递Task是否执行成功和Task需要返回的信息。</description>
</item>
<item>
<title>任务管理与在线运维</title>
<link>https://kfcfans.gitee.io/docs/startup/4-console-guide/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/docs/startup/4-console-guide/</guid>
<description>前端控制台允许开发者可视化地进行任务增、删、改、查等管理操作,同时也能直观地看到任务的运行数据,包括运行状态、详情和在线日志等。以下为对控制台的详细介绍: 主页 展示了系统整体的概览和集群Worker列表。
任务创建 创建需要被调度执行的任务,入口为主页 -&amp;gt; 任务管理 -&amp;gt; 新建任务。
任务名称:名称,便于记忆与搜索,无特殊用途,请尽量简短(占用数据库字段空间)
任务描述:描述,无特殊作用,请尽量简短(占用数据库字段空间)
任务参数任务处理时能够获取到的参数即各个Processor的process方法入参TaskContext对象的jobParams字段进行一次处理器开发就能理解了
定时信息:由下拉框和输入框组成
API -&amp;gt; 不需要填写任何参数(填了也不起作用) CRON -&amp;gt; 填写 CRON 表达式(可以找个在线生成网站生成) 固定频率 -&amp;gt; 填写整数,单位毫秒 固定延迟 -&amp;gt; 填写整数,单位毫秒 执行配置由执行类型单机、广播和MapReduce、处理器类型和处理器参数组成后两项相互关联。
内置Java处理器 -&amp;gt; 填写该处理器的全限定类名eg, com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo Java容器 -&amp;gt; 填写容器ID#处理器全限定类名eg1#com.github.kfcfans.oms.container.DemoProcessor SHELL -&amp;gt; 填写需要处理的脚本直接复制文件内容或脚本下载连接http://xxx PYTHON -&amp;gt; 填写完整的python脚本或下载连接http://xxx 运行配置
最大实例数:该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例) 单机线程并发数该实例执行过程中每个Worker使用的线程数量MapReduce任务生效其余无论填什么都只会使用1个线程或3个线程&amp;hellip; 运行时间限制限定任务的最大运行时间超时则视为失败单位毫秒0代表不限制超时时间。 重试配置:
任务重试次数实例级别失败了整个任务实例重试会更换TaskTracker本次任务实例的Master节点代价较大大型Map/MapReduce慎用。 子任务重试次数Task级别每个子Task失败后单独重试会更换ProcessorTracker本次任务实际执行的Worker节点代价较小推荐使用。 注对于单机任务来说假如任务重试次数和子任务重试次数都配置了1且都执行失败实际执行次数会变成4次推荐任务实例重试配置为0子任务重试次数根据实际情况配置。 机器配置用来标明允许执行任务的机器状态避开那些摇摇欲坠的机器0代表无任何限制。</description>
</item>
</channel>

View File

@ -11,14 +11,14 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="介绍" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/" />
<meta property="og:url" content="https://kfcfans.gitee.io/" />
<title>介绍 | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/ohmyscheduler/index.xml" title="OhMyScheduler" />
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/index.xml" title="OhMyScheduler" />
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -34,7 +34,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -86,7 +86,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -96,7 +96,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -106,7 +106,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -119,10 +129,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -137,7 +147,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -147,7 +157,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -157,51 +173,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -242,13 +223,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>介绍</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>
@ -259,7 +240,7 @@ https://github.com/alex-shpak/hugo-book
<article class="markdown"><p><img src="/oms-logo.png" alt="logo" /></p>
<article class="markdown"><p><img src="oms-logo.png" alt="logo" /></p>
<h2 id="项目地址">项目地址</h2>
<p><a href="https://github.com/KFCFans/OhMyScheduler">GitHub</a> | <a href="https://gitee.com/KFCFans/OhMyScheduler">Gitee</a></p>
<h2 id="产品介绍">产品介绍</h2>

View File

@ -2,20 +2,32 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>介绍 on OhMyScheduler</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/</link>
<link>https://kfcfans.gitee.io/</link>
<description>Recent content in 介绍 on OhMyScheduler</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://kfcfans.gitee.io/ohmyscheduler/index.xml" rel="self" type="application/rss+xml" />
<atom:link href="https://kfcfans.gitee.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>调度中心Server部署</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/</link>
<title>容器</title>
<link>https://kfcfans.gitee.io/docs/super/container/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/</guid>
<guid>https://kfcfans.gitee.io/docs/super/container/</guid>
<description>什么是容器? 介绍 OhMyScheduler的容器技术允许开发者开发独立于Worker项目之外Java处理器简单来说就是以Maven工程项目的维度去组织一堆Java文件开发者开发的众多脚本处理器进而兼具开发效率和可维护性。
用途举例 比如突然出现了某个数据库数据清理任务与主业务无关写进原本的项目工程中不太优雅这时候就可以单独创建一个用于数据操作的容器在里面完成处理器的开发通过OhMyScheduler的容器部署技术在Worker集群上被加载执行。 比如常见的日志清理啊机器状态上报啊对于广大Java程序员来说也许并不是很会写shell脚本此时也可以借用agent+容器技术利用Java完成各项原本需要通过脚本进行的操作。 (感觉例子举的都不是很好&amp;hellip;这个东西嘛,只可意会不可言传,大家努力理解一下吧~超好用哦~)
生成容器模版 为了方便开发者使用,最新版本的前端页面已经支持容器工程模版的自动生成,开发者仅需要填入相关信息即可下载容器模版开始开发。 Group对应Maven的&amp;lt;groupId&amp;gt;标签,一般填入倒写的公司域名。 Artifact对于Maven的&amp;lt;artifactId&amp;gt;标签,填入代表该容器的唯一标示。 Name对应Maven的&amp;lt;name&amp;gt;标签,填入该容器名称。 Package Name包名代表了的容器工程内部所使用的包名警告包名一旦生成后请勿更改否则会导致运行时容器加载错误当然如有必须修改包名的需求可以尝试替换/resource下以oms-worker-container开头的所有文件相关的值。 Java Version容器工程的Java版本请务必与容器目标部署Worker平台的Java版本保持一致。 开发容器工程 完成容器模版创建后下载解压会得到如下结构的Java工程
oms-template-origin // 工程名称,可以自由更改 ├── pom.xml └── src ├── main │ ├── java │ │ └── cn │ │ └── edu │ │ └── zju │ │ └── tjq │ │ └── container │ │ └── samples // 所有处理器代码必须位于该目录下,其余类随意 │ └── resources // 严禁随意更改以下两个配置文件(允许添加,不允许更改现有内容) │ ├── oms-worker-container-spring-context.xml │ └── oms-worker-container.</description>
</item>
<item>
<title>调度中心Server部署</title>
<link>https://kfcfans.gitee.io/docs/startup/1-server-startup/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/docs/startup/1-server-startup/</guid>
<description>环境要求 Open JDK 8+
Apache Maven 3+
任意 Spring Data Jpa 支持的关系型数据库MySQL/Oracle/MS SQLServer&amp;hellip;
@ -26,101 +38,60 @@
配置项 含义 可选 server.port SpringBoot配置HTTP端口号默认7700 否 oms.</description>
</item>
<item>
<title>OpenAPI</title>
<link>https://kfcfans.gitee.io/docs/super/openapi/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/docs/super/openapi/</guid>
<description>OpenAPI允许开发者通过接口来完成手工的操作让系统整体变得更加灵活。开发者可以基于API便捷地扩展OhMyScheduler原有的功能。 依赖 最新依赖版本请参考Maven中央仓库推荐地址&amp;amp;备用地址。
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.kfcfans&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;oh-my-scheduler-client&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 简单示例 // 初始化 client需要server地址和应用名称作为参数 OhMyClient ohMyClient = new OhMyClient(&amp;#34;127.0.0.1:7700&amp;#34;, &amp;#34;oms-test&amp;#34;); // 调用相关的API ohMyClient.stopInstance(1586855173043L) API列表 创建/修改任务 接口签名ResultDTO&amp;lt;Long&amp;gt; saveJob(ClientJobInfo newJobInfo)
入参:任务信息(详细说明见下表,也可以参考前端任务创建各参数的正确填法)
返回值ResultDTO根据success判断操作是否成功。若操作成功data字段返回任务ID
属性 说明 jobId 任务ID可选null代表创建任务否则填写需要修改的任务ID jobName 任务名称 jobDescription 任务描述 jobParams 任务参数Processor#process方法入参TaskContext对象的jobParams字段 timeExpressionType 时间表达式类型,枚举值 timeExpression 时间表达式填写类型由timeExpressionType决定比如CRON需要填写CRON表达式 executeType 执行类型,枚举值 processorType 处理器类型,枚举值 processorInfo 处理器参数填写类型由processorType决定如Java处理器需要填写全限定类名com.</description>
</item>
<item>
<title>执行器Worker初始化</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/</link>
<link>https://kfcfans.gitee.io/docs/startup/2-worker-startup/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/</guid>
<guid>https://kfcfans.gitee.io/docs/startup/2-worker-startup/</guid>
<description>基于宿主应用的执行器初始化 宿主应用即原有的业务应用,假如需要调度执行的任务与当前业务有较为紧密的联系,建议采取该方式。
OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.kfcfans&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;oh-my-scheduler-worker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; 其次填写执行器客户端配置文件OhMyConfig各参数说明如下表所示
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:</description>
属性名称 含义 默认值 appName 宿主应用名称,需要提前在控制台完成注册 无,必填项,否则启动报错 port Worker工作端口 27777 serverAddress 调度中心oh-my-scheduler-server地址列表 无,必填项,否则启动报错 storeStrategy 本地存储策略,枚举值磁盘/内存大型MapReduce等会产生大量Task的任务推荐使用磁盘降低内存压力否则建议使用内存加速计算 StoreStrategy.DISK磁盘 maxResultLength 每个Task返回结果的默认长度超长将被截断。过长可能导致网络拥塞 8096 enableTestMode 是否启用测试模式启用后无需Server也能顺利启动OhMyScheduler-Worker用于处理器本地的单元测试 false 最后,初始化客户端,完成执行器的启动,代码示例如下:
@Configuration public class OhMySchedulerConfig { @Bean public OhMyWorker initOMS() throws Exception { // 服务器HTTP地址端口号为 server.port而不是 ActorSystem port List&amp;lt;String&amp;gt; serverAddress = Lists.</description>
</item>
<item>
<title>处理器编写</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/</link>
<title>处理器开发</title>
<link>https://kfcfans.gitee.io/docs/startup/3-processor-develop/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/</guid>
<guid>https://kfcfans.gitee.io/docs/startup/3-processor-develop/</guid>
<description>处理器概述 OhMyScheduler当前支持Shell、Python等脚本处理器和Java处理器。脚本处理器只需要开发者完成脚本的编写xxx.sh / xxx.py在控制台填入脚本内容即可本章不再赘述。本章将重点阐述Java处理器开发方法与使用技巧。
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器对应了单机任务,即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器对应了广播任务,即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 初始化宿主应用 首先添加相关的jar包依赖最新依赖版本请参考maven中央仓库推荐地址&amp;amp;备用地址
&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.github.kfcfans&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;oh-my-scheduler-worker&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt; &amp;lt;/dependency&amp;gt; </description>
Java处理器可根据代码所处位置划分为内置Java处理器和容器Java处理器前者直接集成在宿主应用也就是接入本系统的业务应用一般用来处理业务需求后者可以在一个独立的轻量级的Java工程中开发通过容器技术详见容器章节被worker集群热加载提供Java的“脚本能力”一般用于处理灵活多变的需求。 Java处理器可根据对象创建者划分为SpringBean处理器和普通Java对象处理器前者由Spring IOC容器完成处理器的创建和初始化后者则有OhMyScheduler维护其状态。如果宿主应用支持Spring强烈建议使用SpringBean处理器开发者仅需要将Processor注册进Spring IOC容器一个@Component注解或一句bean配置。 Java处理器可根据功能划分为单机处理器、广播处理器、Map处理器和MapReduce处理器。 单机处理器BasicProcessor对应了单机任务即某个任务的某次运行只会有某一台机器的某一个线程参与运算。 广播处理器BroadcastProcessor对应了广播任务即某个任务的某次运行会调动集群内所有机器参与运算。 Map处理器MapProcessor对应了Map任务即某个任务在运行过程中允许产生子任务并分发到其他机器进行运算。 MapReduce处理器MapReduceProcessor对应了MapReduce任务在Map任务的基础上增加了所有任务结束后的汇总统计。 核心方法process 任意Java处理器都需要实现处理的核心方法其接口签名如下
ProcessResult process(TaskContext context) throws Exception; 方法入参TaskContext包含了本次处理的上下文信息具体属性如下
属性名称 意义/用法 jobId 任务ID开发者一般无需关心此参数 instanceId 任务实例ID全局唯一开发者一般无需关心此参数 subInstanceId 子任务实例ID秒级任务使用开发者一般无需关心此参数 taskId 采用链式命名法的ID在某个任务实例内唯一开发者一般无需关心此参数 taskName task名称Map/MapReduce任务的子任务的值为开发者指定否则为系统默认值开发者一般无需关心此参数 jobParams 任务参数,其值等同于控制台录入的任务参数,常用! instanceParams 任务实例参数其值等同于使用OpenAPI运行任务实例时传递的参数常用 maxRetryTimes Task的最大重试次数 currentRetryTimes Task的当前重试次数和maxRetryTimes联合起来可以判断当前是否为该Task的最后一次运行机会 subTask 子TaskMap/MapReduce处理器专属开发者调用map方法时传递的子任务列表中的某一个 omsLogger 在线日志用法同Slf4J记录的日志可以直接通过控制台查看非常便捷和强大不过使用过程中需要注意频率可能对Server造成巨大的压力 方法的返回值为ProcessResult代表了本次Task执行的结果包含success和msg两个属性分别用于传递Task是否执行成功和Task需要返回的信息。</description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/columns/</link>
<title>任务管理与在线运维</title>
<link>https://kfcfans.gitee.io/docs/startup/4-console-guide/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/columns/</guid>
<description>Columns Columns help organize shorter pieces of content horizontally for readability.
{{&amp;lt; columns &amp;gt;}} &amp;lt;!-- begin columns block --&amp;gt; # Left Content Lorem markdownum insigne... &amp;lt;---&amp;gt; &amp;lt;!-- magic sparator, between columns --&amp;gt; # Mid Content Lorem markdownum insigne... &amp;lt;---&amp;gt; &amp;lt;!-- magic sparator, between columns --&amp;gt; # Right Content Lorem markdownum insigne... {{&amp;lt; /columns &amp;gt;}} Example Left Content Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter!</description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/details/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/details/</guid>
<description>Details Details shortcode is a helper for details html5 element. It is going to replace expand shortcode.
Example {{&amp;lt; details &amp;#34;Title&amp;#34; [open] &amp;gt;}} ## Markdown content Lorem markdownum insigne... {{&amp;lt; /details &amp;gt;}} {{&amp;lt; details title=&amp;#34;Title&amp;#34; open=true &amp;gt;}} ## Markdown content Lorem markdownum insigne... {{&amp;lt; /details &amp;gt;}} Title Markdown content Lorem markdownum insigne&amp;hellip; </description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/expand/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/expand/</guid>
<description>Expand Expand shortcode can help to decrease clutter on screen by hiding part of text. Expand content by clicking on it.
Example Default {{&amp;lt; expand &amp;gt;}} ## Markdown content Lorem markdownum insigne... {{&amp;lt; /expand &amp;gt;}} Expand ↕ Markdown content Lorem markdownum insigne&amp;hellip; With Custom Label {{&amp;lt; expand &amp;#34;Custom Label&amp;#34; &amp;#34;...&amp;#34; &amp;gt;}} ## Markdown content Lorem markdownum insigne... {{&amp;lt; /expand &amp;gt;}} Custom Label .</description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/hints/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/hints/</guid>
<description>Hints Hint shortcode can be used as hint/alerts/notification block.
There are 3 colors to choose: info, warning and danger.
{{&amp;lt; hint [info|warning|danger] &amp;gt;}} **Markdown content** Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa {{&amp;lt; /hint &amp;gt;}} Example Markdown content
Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa Markdown content</description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/katex/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/katex/</guid>
<description>KaTeX KaTeX shortcode let you render math typesetting in markdown document. See KaTeX
Example {{&amp;lt; katex [display] [class=&amp;#34;text-center&amp;#34;] &amp;gt;}} f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi {{&amp;lt; /katex &amp;gt;}} Display Mode Example Here is some inline example: \(\pi(x)\) , rendered in the same line. And below is display example, having display: block \[f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi\] Text continues here.</description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/mermaid/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/mermaid/</guid>
<description>Mermaid Chart Mermaid is library for generating svg charts and diagrams from text.
Example {{&amp;lt; mermaid [class=&amp;#34;text-center&amp;#34;]&amp;gt;}} sequenceDiagram Alice-&amp;gt;&amp;gt;Bob: Hello Bob, how are you? alt is sick Bob-&amp;gt;&amp;gt;Alice: Not so good :( else is well Bob-&amp;gt;&amp;gt;Alice: Feeling fresh like a daisy end opt Extra response Bob-&amp;gt;&amp;gt;Alice: Thanks for asking end {{&amp;lt; /mermaid &amp;gt;}} </description>
</item>
<item>
<title></title>
<link>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/tabs/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/tabs/</guid>
<description>Tabs Tabs let you organize content by context, for example installation instructions for each supported platform.
{{&amp;lt; tabs &amp;#34;uniqueid&amp;#34; &amp;gt;}} {{&amp;lt; tab &amp;#34;MacOS&amp;#34; &amp;gt;}} # MacOS Content {{&amp;lt; /tab &amp;gt;}} {{&amp;lt; tab &amp;#34;Linux&amp;#34; &amp;gt;}} # Linux Content {{&amp;lt; /tab &amp;gt;}} {{&amp;lt; tab &amp;#34;Windows&amp;#34; &amp;gt;}} # Windows Content {{&amp;lt; /tab &amp;gt;}} {{&amp;lt; /tabs &amp;gt;}} Example MacOS MacOS This is tab MacOS content.
Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter!</description>
<guid>https://kfcfans.gitee.io/docs/startup/4-console-guide/</guid>
<description>前端控制台允许开发者可视化地进行任务增、删、改、查等管理操作,同时也能直观地看到任务的运行数据,包括运行状态、详情和在线日志等。以下为对控制台的详细介绍: 主页 展示了系统整体的概览和集群Worker列表。
任务创建 创建需要被调度执行的任务,入口为主页 -&amp;gt; 任务管理 -&amp;gt; 新建任务。
任务名称:名称,便于记忆与搜索,无特殊用途,请尽量简短(占用数据库字段空间)
任务描述:描述,无特殊作用,请尽量简短(占用数据库字段空间)
任务参数任务处理时能够获取到的参数即各个Processor的process方法入参TaskContext对象的jobParams字段进行一次处理器开发就能理解了
定时信息:由下拉框和输入框组成
API -&amp;gt; 不需要填写任何参数(填了也不起作用) CRON -&amp;gt; 填写 CRON 表达式(可以找个在线生成网站生成) 固定频率 -&amp;gt; 填写整数,单位毫秒 固定延迟 -&amp;gt; 填写整数,单位毫秒 执行配置由执行类型单机、广播和MapReduce、处理器类型和处理器参数组成后两项相互关联。
内置Java处理器 -&amp;gt; 填写该处理器的全限定类名eg, com.github.kfcfans.oms.processors.demo.MapReduceProcessorDemo Java容器 -&amp;gt; 填写容器ID#处理器全限定类名eg1#com.github.kfcfans.oms.container.DemoProcessor SHELL -&amp;gt; 填写需要处理的脚本直接复制文件内容或脚本下载连接http://xxx PYTHON -&amp;gt; 填写完整的python脚本或下载连接http://xxx 运行配置
最大实例数:该任务同时执行的数量(任务和实例就像是类和对象的关系,任务被调度执行后被称为实例) 单机线程并发数该实例执行过程中每个Worker使用的线程数量MapReduce任务生效其余无论填什么都只会使用1个线程或3个线程&amp;hellip; 运行时间限制限定任务的最大运行时间超时则视为失败单位毫秒0代表不限制超时时间。 重试配置:
任务重试次数实例级别失败了整个任务实例重试会更换TaskTracker本次任务实例的Master节点代价较大大型Map/MapReduce慎用。 子任务重试次数Task级别每个子Task失败后单独重试会更换ProcessorTracker本次任务实际执行的Worker节点代价较小推荐使用。 注对于单机任务来说假如任务重试次数和子任务重试次数都配置了1且都执行失败实际执行次数会变成4次推荐任务实例重试配置为0子任务重试次数根据实际情况配置。 机器配置用来标明允许执行任务的机器状态避开那些摇摇欲坠的机器0代表无任何限制。</description>
</item>
</channel>

View File

@ -1,14 +1,14 @@
{
"name": "OhMyScheduler",
"short_name": "OhMyScheduler",
"start_url": "/ohmyscheduler/",
"scope": "/ohmyscheduler/",
"start_url": "/",
"scope": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#000000",
"icons": [
{
"src": "/ohmyscheduler/favicon.svg",
"src": "/favicon.svg",
"sizes": "512x512"
}
]

View File

@ -3,67 +3,55 @@
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/</loc>
<loc>https://kfcfans.gitee.io/docs/super/container/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/1-server-startup/</loc>
<loc>https://kfcfans.gitee.io/docs/startup/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/2-worker-startup/</loc>
<loc>https://kfcfans.gitee.io/docs/startup/1-server-startup/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/startup/3-processor-develop/</loc>
<loc>https://kfcfans.gitee.io/docs/super/openapi/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/</loc>
<loc>https://kfcfans.gitee.io/docs/startup/2-worker-startup/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/columns/</loc>
<loc>https://kfcfans.gitee.io/docs/super/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/details/</loc>
<loc>https://kfcfans.gitee.io/docs/startup/3-processor-develop/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/expand/</loc>
<loc>https://kfcfans.gitee.io/docs/startup/4-console-guide/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/hints/</loc>
<loc>https://kfcfans.gitee.io/docs/version/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/katex/</loc>
<loc>https://kfcfans.gitee.io/categories/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/mermaid/</loc>
<loc>https://kfcfans.gitee.io/docs/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/shortcodes/tabs/</loc>
<loc>https://kfcfans.gitee.io/tags/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/categories/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/docs/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/tags/</loc>
</url>
<url>
<loc>https://kfcfans.gitee.io/ohmyscheduler/</loc>
<loc>https://kfcfans.gitee.io/</loc>
</url>
</urlset>

View File

@ -8,14 +8,14 @@
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Tags" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://kfcfans.gitee.io/ohmyscheduler/tags/" />
<meta property="og:url" content="https://kfcfans.gitee.io/tags/" />
<title>Tags | OhMyScheduler</title>
<link rel="manifest" href="/ohmyscheduler/manifest.json">
<link rel="icon" href="/ohmyscheduler/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/ohmyscheduler/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/ohmyscheduler/en.search.min.1272dfb3df2a3f60e11485e0a1158d434da32177db3be3e28aae8e28aa7e9a15.js" integrity="sha256-EnLfs98qP2DhFIXgoRWNQ02jIXfbO&#43;Piiq6OKKp&#43;mhU="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/ohmyscheduler/tags/index.xml" title="OhMyScheduler" />
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.e161f1fe2b283b6a43c29a52fde96e2387fade573e78efa6701d44c8499da76b.css" integrity="sha256-4WHx/isoO2pDwppS/eluI4f63lc&#43;eO&#43;mcB1EyEmdp2s=">
<script defer src="/en.search.min.c80848d3c77260233d9a08502d528e5cb516bb11e5df300ef34c5507c61f37fd.js" integrity="sha256-yAhI08dyYCM9mghQLVKOXLUWuxHl3zAO80xVB8YfN/0="></script>
<link rel="alternate" type="application/rss+xml" href="https://kfcfans.gitee.io/tags/index.xml" title="OhMyScheduler" />
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
@ -31,7 +31,7 @@ https://github.com/alex-shpak/hugo-book
<nav>
<h2 class="book-brand">
<a href="/ohmyscheduler"><span>OhMyScheduler</span>
<a href="/"><span>OhMyScheduler</span>
</a>
</h2>
@ -83,7 +83,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
<a href="/docs/startup/1-server-startup/" class="">调度中心Server部署</a>
</li>
@ -93,7 +93,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
<a href="/docs/startup/2-worker-startup/" class="">执行器Worker初始化</a>
</li>
@ -103,7 +103,17 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/startup/3-processor-develop/" class="">处理器编写</a>
<a href="/docs/startup/3-processor-develop/" class="">处理器开发</a>
</li>
<li>
<a href="/docs/startup/4-console-guide/" class="">任务管理与在线运维</a>
</li>
@ -116,10 +126,10 @@ https://github.com/alex-shpak/hugo-book
<li class="book-section-flat" >
<li>
<span>Shortcodes</span>
<span>高级特性</span>
@ -134,7 +144,7 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/columns/" class="">Columns</a>
<a href="/docs/super/container/" class="">容器</a>
</li>
@ -144,7 +154,13 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/details/" class="">Details</a>
<a href="/docs/super/openapi/" class="">OpenAPI</a>
</li>
</ul>
</li>
@ -154,51 +170,16 @@ https://github.com/alex-shpak/hugo-book
<li>
<a href="/ohmyscheduler/docs/shortcodes/expand/" class="">Expand</a>
<span>更新日志</span>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/hints/" class="">Hints</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/katex/" class="">Katex</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/mermaid/" class="">Mermaid</a>
</li>
<li>
<a href="/ohmyscheduler/docs/shortcodes/tabs/" class="">Tabs</a>
</li>
<ul>
</ul>
@ -239,13 +220,13 @@ https://github.com/alex-shpak/hugo-book
<div class="flex align-center justify-between">
<label for="menu-control">
<img src="/ohmyscheduler/svg/menu.svg" class="book-icon" alt="Menu" />
<img src="/svg/menu.svg" class="book-icon" alt="Menu" />
</label>
<strong>Tags</strong>
<label for="toc-control">
<img src="/ohmyscheduler/svg/toc.svg" class="book-icon" alt="Table of Contents" />
<img src="/svg/toc.svg" class="book-icon" alt="Table of Contents" />
</label>
</div>

View File

@ -2,12 +2,12 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Tags on OhMyScheduler</title>
<link>https://kfcfans.gitee.io/ohmyscheduler/tags/</link>
<link>https://kfcfans.gitee.io/tags/</link>
<description>Recent content in Tags on OhMyScheduler</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://kfcfans.gitee.io/ohmyscheduler/tags/index.xml" rel="self" type="application/rss+xml" />
<atom:link href="https://kfcfans.gitee.io/tags/index.xml" rel="self" type="application/rss+xml" />
</channel>