原文网址:SpringBoot整合PowerJob--使用/教程/实例_IT利刃出鞘的博客-CSDN博客
简介
说明
本文用示例介绍Power Job的用法。
PowerJob是一个定时任务中间件(框架),优点很多,PowerJob官网的对比图中可以看到PowerJob比Quartz、XXL-JOB等更加优秀。
个人认为XXL-JOB与PowerJob各有优缺点,它们的对比见:SpringBoot--定时任务--选型/对比/框架_IT利刃出鞘的博客-CSDN博客
官方
官网:PowerJob
文档:PowerJob 简介 · 语雀
快速开始:快速开始(本地IDE版) · 语雀
github:GitHub - PowerJob/PowerJob: Enterprise job scheduling middleware with distributed computing ability.
相关网址
PowerJob的特性:PowerJob 简介 · 语雀
实战
下载项目
git clone https://github.com/PowerJob/PowerJob.git
启动服务端
1.创建数据库(仅需要创建数据库):
CREATE DATABASE IF NOT EXISTS `powerjob-daily` DEFAULT CHARSET utf8mb4
2.修改配置文件
配置文件的说明:官方文档写的非常详细,此处不再赘述。
需要修改的地方为数据库配置:
- spring.datasource.core.jdbc-url
- spring.datasource.core.username
- spring.datasource.core.password
(当然,有 mongoDB 的同学也可以修改spring.data.mongodb.uri以获取完全版体验。)
本处我的配置为:
-
oms.env=DAILY
-
logging.config=classpath:logback-dev.xml
-
####### Database properties(Configure according to the the environment) #######
-
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
-
spring.datasource.core.jdbc-url=jdbc:mysql://localhost:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
-
spring.datasource.core.username=root
-
spring.datasource.core.password=222333
-
spring.datasource.core.hikari.maximum-pool-size=20
-
spring.datasource.core.hikari.minimum-idle=5
-
####### MongoDB properties(Non-core configuration properties) #######
-
####### configure oms.mongodb.enable=false to disable mongodb #######
-
oms.mongodb.enable=false
-
####### Email properties(Non-core configuration properties) #######
-
####### Delete the following code to disable the mail #######
-
####### DingTalk properties(Non-core configuration properties) #######
-
####### Delete the following code to disable the DingTalk #######
-
####### Resource cleaning properties #######
-
oms.instanceinfo.retention=1
-
oms.container.retention.local=1
-
oms.container.retention.remote=-1
-
####### Cache properties #######
-
oms.instance.metadata.cache.size=1024
-
####### Threshold in precise fetching server(0~100). 100 means full detection of server, in which #######
-
####### split-brain could be avoided while performance overhead would increase. #######
-
oms.accurate.select.server.percentage = 50
3. 启动服务
启动此类:tech.powerjob.server.PowerJobServerApplication
即:
4. 注册应用
注册应用。应用名:powerjob-agent-test;密码:111111
编写示例代码
进入示例工程(powerjob-worker-samples),修改配置文件连接powerjob-server并编写自己的处理器代码。
1. 修改配置文件
修改 powerjob-worker-samples 的 application.properties,将 powerjob.worker.app-name 改为刚刚在控制台注册的名称。
application.properties(修改后的)
-
server.port=8081
-
spring.jpa.open-in-view=false
-
########### PowerJob-worker properties. ###########
-
# Akka port, default is 27777
-
powerjob.worker.akka-port=27777
-
# Application name, used for grouping applications. Recommend to set the same value as project name.
-
powerjob.worker.app-name=powerjob-agent-test
-
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
-
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
-
# Store strategy of H2 database. disk or memory. Default value is disk.
-
powerjob.worker.store-strategy=disk
-
# Max length of result. Results that are longer than the value will be truncated.
-
powerjob.worker.max-result-length=4096
-
# Max length of appended workflow context . Appended workflow context value that is longer than the value will be ignore.
-
powerjob.worker.max-appended-wf-context-length=4096
2. 编写自己的处理器
随便找个地方新建类,继承你想要使用的处理器(各个处理器的介绍可见官方文档,文档非常详细)。
源码里已有的处理器的示例代码:
这里为了简单演示,选择使用单机处理器BasicProcessor,新建类:
-
package tech.powerjob.samples.processors;
-
import lombok.extern.slf4j.Slf4j;
-
import org.springframework.stereotype.Component;
-
import tech.powerjob.worker.core.processor.ProcessResult;
-
import tech.powerjob.worker.core.processor.TaskContext;
-
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
-
import tech.powerjob.worker.log.OmsLogger;
-
import java.util.Collections;
-
/**
-
* 单机处理器 示例
-
*
-
* @author knife
-
*/
-
@Slf4j
-
@Component
-
public class MyStandaloneProcessorDemo implements BasicProcessor {
-
@Override
-
public ProcessResult process(TaskContext context) throws Exception {
-
OmsLogger omsLogger = context.getOmsLogger();
-
omsLogger.info("处理器启动成功,context 是 {}.", context);
-
log.info("单机处理器正在处理");
-
log.info(context.getJobParams());
-
omsLogger.info("处理器执行结束");
-
boolean success = true;
-
return new ProcessResult(success, context + ": " + success);
-
}
-
}
3. 启动示例程序
直接运行主类:tech.powerjob.samples.SampleApplication
即:
再以另一个端口启动第二个客户端:
-
server.port=8082
-
spring.jpa.open-in-view=false
-
########### PowerJob-worker properties. ###########
-
# Akka port, default is 27777
-
powerjob.worker.akka-port=27778
-
# Application name, used for grouping applications. Recommend to set the same value as project name.
-
powerjob.worker.app-name=powerjob-agent-test
-
# Address of PowerJob-server node(s). Ip:port or domain. Multiple addresses should be separated with comma.
-
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
-
# Store strategy of H2 database. disk or memory. Default value is disk.
-
powerjob.worker.store-strategy=disk
-
# Max length of result. Results that are longer than the value will be truncated.
-
powerjob.worker.max-result-length=4096
-
# Max length of appended workflow context . Appended workflow context value that is longer than the value will be ignore.
-
powerjob.worker.max-appended-wf-context-length=4096
Idea启动两个同一程序的方法:
任务配置与运行
调度服务器与示例工程都启动完毕后,再次前往Web页面( http://127.0.0.1:7700/ ),进行任务的配置与运行。
配置任务
1. 登录
在首页输入框输入配置的应用名称,成功操作后会正式进入前端管理界面。
2. 创建任务
任务管理=> 新建任务(右上角)
执行结果
运行结果
可以看到,只会有一台机器在执行。我用的是单机处理器,它会选择一台最健康的机器进行执行。
执行记录
问题及解决
问题:我设置的是CRON,每5秒执行,但它实际15秒执行一次。
原因:Powerjob的CRON模式下,时间轮是15秒扫描一次,这时间间隔不能小于15秒。若低于15秒会按15秒运行。
解决方案:改为固定频率或固定延迟进行。
修改设置如下:
执行结果: