micro-job
是一款分布式任务调度执行框架
,内部通过各个组件的Jersey
共享出的Rest
路径进行数据访问。
详细开发文档 访问官网
名词解释:
consumer
->任务消费节点
schedule
->任务调度器
provider
->任务生产者
registry
->任务注册中心
registry
是任务注册中心,在整个生态圈内担任着各个组件注册节点的任务,任务注册中心实现方式是多样化的,目前包含:memory
、zookeeper
、redis
、consul
等。
通过idea、eclipse
工具创建SpringBoot
项目并添加如下依赖到pom.xml
文件内。
<dependency>
<groupId>com.github.hengboy</groupId>
<artifactId>spring-boot-starter-registry-memory</artifactId>
<version>{lastVersion}</version>
</dependency>
在resources
资源目录下添加application.yml
配置文件,配置内容如下所示:
server:
port: 9000
hengboy:
job:
registry:
# 任务注册中心节点注册方式
away: memory
schedule
是任务调度器,每一个任务的创建都是通过调度器进行分配执行,分配过程中根据消费节点的负载均衡策略配置进行不同消费者节点任务消费。
在生产任务时,也会根据调度器的负载均衡策略
来进行筛选执行任务调度的调度器节点
。
通过idea、eclipse
工具创建SpringBoot
项目并添加如下依赖到pom.xml
文件内。
<dependency>
<groupId>com.github.hengboy</groupId>
<artifactId>spring-boot-starter-schedule</artifactId>
<version>{lastVersion}</version>
</dependency>
在resources
资源目录下添加application.yml
配置文件,配置内容如下所示:
server:
port: 8081
hengboy:
job:
registry:
# 保持与任务注册中心节点注册方式一致即可
away: memory
schedule:
# 内存方式调度器处理任务队列以及任务日志的存储
job-store-type: memory
consumer
是任务消费者执行节点,任务由consumer
进行定义以及上报,当schedule
调用消费者执行任务请求时,会自动根据jobKey
来执行对应的任务逻辑方法。
通过idea、eclipse
工具创建SpringBoot
项目并添加如下依赖到pom.xml
文件内。
<dependency>
<groupId>com.github.hengboy</groupId>
<artifactId>spring-boot-starter-consumer</artifactId>
<version>{lastVersion}</version>
</dependency>
在resources
资源目录下添加application.yml
配置文件,配置内容如下所示:
server:
port: 8082
hengboy:
job:
registry:
# 保持与任务注册中心节点注册方式一致即可
away: memory
我们来定义一个简单的Job
,示例如下所示:
@Job(jobExecuteAway = JobExecuteAwayEnum.ONCE)
public class TestJob implements MicroJob {
/**
* logger instance
*/
static Logger logger = LoggerFactory.getLogger(TestJob.class);
@Override
public JobExecuteResult execute(JobExecuteParam jobExecuteParam) throws JobException {
logger.info("执行Key:{},执行参数:{}", jobExecuteParam.getJobKey(), jobExecuteParam.getJsonParam());
return JobExecuteResult.JOB_EXECUTE_SUCCESS;
}
}
在上面定义的
Job
对应的JobKey
为testJob
.
provider
是任务生产节点,由业务方进行添加依赖并执行MicroJobProvider.newXxxJob
调用创建任务,如:创建订单后
执行发送邮件
通知操作。
通过idea、eclipse
工具创建SpringBoot
项目并添加如下依赖到pom.xml
文件内。
<dependency>
<groupId>com.github.hengboy</groupId>
<artifactId>spring-boot-starter-provider</artifactId>
<version>{lastVersion}</version>
</dependency>
在resources
资源目录下添加application.yml
配置文件,配置内容如下所示:
server:
port: 8083
hengboy:
job:
registry:
# 保持与任务注册中心节点注册方式一致即可
away: memory
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProviderTester {
/**
* 注册任务提供者
*/
@Autowired
private MicroJobProvider microJobProvider;
@Test
public void newJob() {
// 创建的任务仅执行一次
microJobProvider.newOnceJob(OnceJobWrapper.Context()
// 对应consumer内定义任务的jobKey,默认为类名首字母小写
.jobKey("testJob")
// 自定义的任务队列key,可以准确定位任务并操作暂停、删除等操作
.jobQueueKey(UUID.randomUUID().toString())
// 参数,任意类型参数,consumer消费时会转换为json字符串
.param(new HashMap() {
{
put("name", "admin");
}
})
.wrapper());
}
}
- 启动任务注册中心
- 启动任务调度中心
- 启动任务消费者节点
- 执行ProviderTester#newJob单元测试方法
```
.
├── micro-job-autoconfigure
├── micro-job-dependencies
├── micro-job-samples
│ ├── sample-consumer
│ ├── sample-provider
│ ├── sample-registry-consul
│ ├── sample-registry-memory
│ ├── sample-registry-redis
│ ├── sample-registry-zookeeper
│ ├── sample-schedule
│ ├── pom.xml
│ └── README.md
├── micro-job-starters
│ ├── spring-boot-starter
│ ├── spring-boot-starter-provider
│ ├── spring-boot-starter-registry-consul
│ ├── spring-boot-starter-registry-memory
│ ├── spring-boot-starter-registry-redis
│ ├── spring-boot-starter-registry-zookeeper
│ ├── spring-boot-starter-schedule
│ └── pom.xml
├── .travis.yml
├── LICENSE
├── pom.xml
└── README.md
```
The Apache License