【PowerJob】从源码编译到k8s部署

前言

虽然PowerJob官方说支持JPA各种数据源,但在PG数据库的兼容性上,确实存在小问题,issue也有相关原理描述,官方采用的优雅方式并未真正解决问题,因为只解决了从@Lob字段读取的时候,自动建表的时候还是会生成oid类型。本文从0到1,从源码开始一步步解决编译、运行、部署过程中遇到的问题,并分享出来,希望对大家有所帮助。

本地开发环境说明

开发依赖版本
数据库PostgreSQL
JDK17

源码编译、启动

  • 调度中心(powerjob-server):
    • https://github.com/PowerJob/PowerJob.git
    • https://gitee.com/KFCFans/PowerJob.git
  • 修改源码tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect
package tech.powerjob.server.persistence.config.dialect;import org.hibernate.dialect.PostgreSQL10Dialect;
import org.hibernate.type.descriptor.sql.LongVarbinaryTypeDescriptor;
import org.hibernate.type.descriptor.sql.LongVarcharTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;import java.sql.Types;/*** PostgreSQL 数据库支持,需要在 application.properties 中添加以下配置项进行激活* spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect** @author Kung Yao* @author Echo009* 2021/3/24 下午 04:23* 1074_King*/
public class PowerJobPGDialect extends PostgreSQL10Dialect {/**解决建表时,@Lob字段会生成oid类型,需要改成text类型*/public PowerJobPGDialect() {super();registerColumnType(Types.BLOB, "bytea");registerColumnType(Types.CLOB, "text");}/**解决读取@Lob字段时,使用Text类型*/@Overridepublic SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {switch (sqlCode) {case Types.CLOB:return LongVarcharTypeDescriptor.INSTANCE;case Types.NCLOB:case Types.BLOB:return LongVarbinaryTypeDescriptor.INSTANCE;}return super.getSqlTypeDescriptorOverride(sqlCode);}
}
  • 编译
    • JDK17+
    • 修改lombok版本
      <properties><lombok.version>1.18.28</lombok.version>
      </properties>
      
    • 增加依赖
          <dependency><groupId>org.jboss.xnio</groupId><artifactId>xnio-nio</artifactId><version>3.8.7.Final</version><scope>runtime</scope></dependency>
      
    • 编译: mvn compile -Pdev -DskipTests=true -e
    • PG数据库需要增加配置: spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect
      • 相关问题描述: https://github.com/PowerJob/PowerJob/issues/153#issuecomment-812771783
    • 数据库初始化
    CREATE DATABASE "powerjob-daily" WITH ENCODING = 'UTF8' CONNECTION LIMIT = -1 IS_TEMPLATE = False
    CREATE ROLE powerjob WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1 PASSWORD 'powerjob';
    COMMENT ON ROLE powerjob IS 'powerjob';
    GRANT ALL PRIVILEGES ON DATABASE "powerjob-daily" TO powerjob;
    
    • 启动参数增加: --spring.profiles.active=daily
    • 浏览器访问: http://127.0.0.1:7700/
    • 4.x: 注册应用,然后登录
    • 5.x: 超级管理员登录: ADMIN/powerjob_admin
  • 前端页面(powerjob-console):
    • https://github.com/PowerJob/PowerJob-Console.git
    • https://gitee.com/KFCFans/PowerJob-Console.git

执行器(powerjob-worker)

  • 参考资料: https://www.yuque.com/powerjob/guidence/deploy_worker
  • pom依赖
<dependency><groupId>tech.powerjob</groupId><artifactId>powerjob-worker-spring-boot-starter</artifactId><version>${powerjob.version}</version>
</dependency>

处理器(Processor)

package com.wen3.powerjob.demo.jobs;import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import tech.powerjob.worker.annotation.PowerJobHandler;
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;/*** 单机处理器:BasicProcessor** 单机执行的策略下,server 会在所有可用 worker 中选取健康度最佳的机器进行执行。单机执行任务需要实现接口 BasicProcessor,代码示例如下:*/
// 支持 SpringBean 的形式
@Component
public class BasicProcessorDemo implements BasicProcessor {@Overridepublic ProcessResult process(TaskContext context) throws Exception {System.out.println("BasicProcessorDemo");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("BasicProcessorDemo start to process, current JobParams is {}.", context.getJobParams());return new ProcessResult(true, "result is xxx");}@PowerJobHandler(name = "xxx1")public void xx1(TaskContext context) throws Exception {System.out.println("xxx1");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("xx1");}@PowerJobHandler(name = "xxx2")public void xx2(TaskContext context) throws Exception {System.out.println("xxx2");// 在线日志功能,可以直接在控制台查看任务日志,非常便捷OmsLogger omsLogger = context.getOmsLogger();omsLogger.info("xx2");}
}

docker镜像制作

  • java打包: mvn package -Pdev -DskipTests=true -e
  • 把打包后的powerjob-server-starter-4.3.9.jar、构建脚本、Dockerfile放到同一个目录
-rwxr-xr-x 1 root root       268 May  4 11:05 docker-build.sh
-rw-r--r-- 1 root root      2712 May  4 10:43 Dockerfile
-rw-r--r-- 1 root root 135117797 May  4 11:03 powerjob-server-starter-4.3.9.jar
  • 执行构建脚本: ./docker-build.sh

构建脚本

version=4.3.9# 删除旧镜像
docker rmi -f imgsreg.ipipa.cn:20443/base/powerjob-server:$version
# 构建 powerjob-server 镜像
docker build -t imgsreg.ipipa.cn:20443/base/powerjob-server:$version .
docker push imgsreg.ipipa.cn:20443/base/powerjob-server:$version

k8s部署yaml文件制作

service制作

apiVersion: v1
kind: Service
metadata:name: powerjobnamespace: kube-publiclabels:app: vxiao-powerjob
spec:type: NodePortports:- name: httpport: 17700targetPort: 7700nodePort: 17700- name: akkaport: 10086targetPort: 10086nodePort: 10086- name: oms-httpport: 10010targetPort: 10010nodePort: 10010selector:app: powerjob

deployment制作

apiVersion: apps/v1
kind: Deployment
metadata:name: powerjobnamespace: kube-public
spec:replicas: 1revisionHistoryLimit: 0selector:matchLabels:app: powerjobtemplate:metadata:labels:app: powerjobspec:containers:- name: powerjobimagePullPolicy: Alwaysimage: xxxx:port/base/powerjob-server:4.3.9env:- name: JAVA_PROGRAM_ARGSvalue: >---spring.profiles.active=product--spring.datasource.remote.hibernate.properties.hibernate.dialect=tech.powerjob.server.persistence.config.dialect.PowerJobPGDialect--spring.datasource.core.driver-class-name=org.postgresql.Driver--spring.datasource.core.jdbc-url=jdbc:postgresql://xxx:5432/powerjob-product?autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&useNewIO=true&rewriteBatchedStatements=true&CharSet=utf8&serverTimezone=GMT&autoReconnection=true&remarks=true&useSSL=false--spring.datasource.core.username=powerjob--spring.datasource.core.password=powerjobports:- containerPort: 7700- containerPort: 10086- containerPort: 10010livenessProbe:httpGet:path: /actuator/health/livenessport: 7700initialDelaySeconds: 30failureThreshold: 2periodSeconds: 15readinessProbe:httpGet:path: /actuator/health/readinessport: 7700initialDelaySeconds: 15periodSeconds: 15startupProbe:httpGet:path: /actuator/health/readinessport: 7700failureThreshold: 30periodSeconds: 15resources:requests:cpu: 0.5memory: 500Milimits:cpu: 1memory: 1Gi

k8s部署

kubectl apply -f powerjob.yaml -n kube-public

运行截图

  • 在首页先注册应用
  • 使用注册的应用名称和密码进行登录
  • 在任务管理中新建任务
    在这里插入图片描述

参考资料

  • 官网: http://www.powerjob.tech/
  • 在线文档: https://www.yuque.com/powerjob/guidence/intro
  • 快速开始: https://www.yuque.com/powerjob/guidence/quick_start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List集合中对asList的使用

List<String> sArrays.asList(“qwe”,”cvb”,”mnb”); List<String> s1s.subList(1,2); System.out.Pintln(“s”);//输出结果&#xff1a;[qwe,cvb,mnb] System.out.Pintln(“s1”);//输出结果&#xff1a;[cvb] s1.add(“123qwe”);//报错&#xff1a;java…

【机器学习300问】82、RMSprop梯度下降优化算法的原理是什么?

RMSprop&#xff0c;全称Root Mean Square Propagation&#xff0c;中文名称“均方根传播”算法。让我来举个例子给大家介绍一下它的原理&#xff01; 一、通过举例来感性认识 建议你第一次看下面的例子时忽略小括号里的内容&#xff0c;在看完本文当你对RMSprop有了一定理解时…

使用单片机的IO引脚直接驱动段码屏

使用单片机的IO引脚直接驱动段码屏,目的是为了降低成本。这种古老的应用,在低功耗产品中比较多见。 如:水表&#xff0c;燃气表等需要电池供电的产品。 下面纯属个人理解&#xff0c;未经测试。 1/3Duty表示LCD共有3个COM引脚,分别占显示周期的1/3 1/2BIAS表示电压0和VCC 1、…

通义千问2.5中文能力地表最强

随着人工智能技术的不断进步&#xff0c;智能问答系统已成为人们日常生活中不可或缺的一部分。阿里巴巴集团作为全球领先的科技公司&#xff0c;一直致力于AI领域的研发和创新。最近&#xff0c;阿里巴巴发布了其最新的智能问答系统——通义千问2.5。 通义千问2.5在AI问答领域…

企业签名分发跟应用商城分发有什么区别

企业签名分发是移动应用开发者在应用程序发布前测试、内部分发和特定的受众群体分发等方面比较常用的一种工具。那对于应用商城分发有啥区别&#xff0c;下面简单的探讨一下。 独立分发能力 通过企业签名分发开发者可以自己决定应用程序的发布时间和方式&#xff0c;不用受应…

真驱鸟农业专用插电款驱鸟器,防喜鹊、麻雀各种鸟类

成年喜鹊的栖息地非常多样化&#xff0c;它们常常在人类活动的区域出没&#xff0c;喜欢把鸟巢建在民宅旁边的大树上、旷野的高树上或者电线塔杆上。白天&#xff0c;它们会飞到农田等开阔的地方觅食&#xff0c;到了傍晚则会返回巢内栖息。 喜鹊食性杂&#xff0c;它们的食物组…

【Linux】编写一个简易的shell

思维导图 学习目标 将简易的shell代码进行编写。 一、阐述shell的基本思路 在进程程序替换中&#xff0c;我们可以将一个指令交给子进程&#xff0c;让子进程去完成这个指令。如果这个命令是一个内建命令&#xff0c;我们需要将这个命令交给bash进行处理。 大致思路是&#xf…

【更具吸引力的回答】Java中final、finally、finalize的区别(二)

当谈到Java中的final、finally和finalize关键字时&#xff0c;它们各自在编程中扮演着不同的角色。下面我将从您提出的几个方面来详细解释它们之间的区别&#xff1a; 1. final 概念与用途&#xff1a;final关键字在Java中用于表示不可变性。它可以修饰类、方法和变量&#x…

在CentOS 7服务器及Windows 10客户端间建立并配置NFS服务

在CentOS 7服务器及Windows 10客户端间建立并配置NFS服务 引言 网络文件系统(Network File System)&#xff0c;简称NFS&#xff0c;是一种分布式文件系统协议。它允许网络上的客户端机器像访问本地磁盘文件一样&#xff0c;通过网络访问服务器上的文件。在某些特定的业务场景中…

从drugbank提取药物对应的靶点和基因信息

DrugBank是一个综合性的在线数据库,它提供了关于药物的详细化学、药理、药代动力学和药物-药物相互作用的信息。这个数据库是一个宝贵的资源,广泛用于药物研究、药理学、毒理学、药物设计和个性化医疗等领域。 以下是DrugBank的一些主要特点和用途: 药物信息:DrugBank提供了…

HTTP/1.0、HTTP/1.1、HTTP/2.0区别

文章目录 区别HTTP/1.0HTTP/1.11. 持久连接&#xff08;长连接&#xff09;2. 管道化3. Host头字段4. 分块传输编码5. 缓存机制6. 请求方法 HTTP/2.01. 二进制分帧2. 多路复用3. 服务器推送4. 优先级设置5. 头信息压缩6. 安全性7. 流量控制 区别 特性HTTP/1.0HTTP/1.1HTTP/2.0…

【笔试训练】day23

一、打怪 思路 由于是先手攻击&#xff0c;如果一次攻击就能杀死小怪&#xff0c;那么说明可以为无限杀小怪。 再计算杀一只小怪要扣多少血就好了&#xff0c;再用总生命值去除这个扣血量&#xff0c;得到的就是最多杀死小怪的数量。注意&#xff0c;由于最后一定要活下来&am…

博客系统问题

1.数据库相关的问题&#xff0c;包括定义表的结构、创建数据库表、增删改查操作的实现&#xff1a; Flask程序中&#xff0c;使用了ORM(Object Relation Mapping, 对象关系映射)这种思想来定义实体类并据此创建数据库表。 创建&#xff1a;首先是在代码中定义python类&#xf…

React面试经验2

1.执行顺序题 onClick () > {//athis.setState({num: this.state.num 1,})console.log(1:,this.state.num);//bthis.setState({num: this.state.num 1,})console.log(2:,this.state.num);setTimeout(() > {//cthis.setState({num: this.state.num 1,});console.log(…

将矩阵按对角线排序(Lc1329)——排序

矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线&#xff0c;沿右下方向一直到矩阵末尾的元素。例如&#xff0c;矩阵 mat 有 6 行 3 列&#xff0c;从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。 给你一个 m * n 的整…

DevEco:智能、灵活、实时的集成开发环境

引言 前端性能是一个老生常谈的话题了&#xff0c;它不单单是一个技术概念&#xff0c;而是用户体验中非常重要的一环。通常在一些面向用户的产品中它直接影响了用户转化率、粘性等重要指标。 那么是不是不在乎转化率的中后台产品就可以不在乎性能了&#xff1f;显然不是&…

API接口开发实现一键智能化自动抓取电商平台商品评论数据支持高并发免费接入示例

为了实现一键智能化自动抓取电商平台商品评论数据可支持高并发免费接入&#xff0c;你可以使用Python编程语言和相关库&#xff08;如requests、BeautifulSoup等&#xff09;来开发一个API接口&#xff0c;也可以使用封装好的api接口获取&#xff0c;注册一个api账号获取key和s…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

星途重启:244亿公里外的「旅行者1号」,修好了

2024年4月20日&#xff0c;旅行者1号工程团队时隔5个月&#xff0c;终于重新收到了来自47年前所发射的探测器传回的有效数据。 ▲收到数据当天&#xff0c;工程团队成员在NASA喷气动力实验室的会议室中欢呼。 01.关于旅行者1号 在当下5G和WIFI已经普及的时代&#xff0c;NASA喷…

【QT教程】QT6硬件数据库编程 QT硬件数据库

QT6硬件数据库编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免…