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

news2024/12/26 22:24:24

前言

虽然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类型*/
    @Override
    public 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 {

    @Override
    public 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: powerjob
  namespace: kube-public
  labels:
    app: vxiao-powerjob
spec:
  type: NodePort
  ports:
    - name: http
      port: 17700
      targetPort: 7700
      nodePort: 17700
    - name: akka
      port: 10086
      targetPort: 10086
      nodePort: 10086
    - name: oms-http
      port: 10010
      targetPort: 10010
      nodePort: 10010
  selector:
    app: powerjob

deployment制作

apiVersion: apps/v1
kind: Deployment
metadata:
  name: powerjob
  namespace: kube-public
spec:
  replicas: 1
  revisionHistoryLimit: 0
  selector:
    matchLabels:
      app: powerjob
  template:
    metadata:
      labels:
        app: powerjob
    spec:
      containers:
        - name: powerjob
          imagePullPolicy: Always
          image: xxxx:port/base/powerjob-server:4.3.9
          env:
            - name: JAVA_PROGRAM_ARGS
              value: >-
                --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=powerjob
          ports:
            - containerPort: 7700
            - containerPort: 10086
            - containerPort: 10010
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 7700
            initialDelaySeconds: 30
            failureThreshold: 2
            periodSeconds: 15
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 7700
            initialDelaySeconds: 15
            periodSeconds: 15
          startupProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 7700
            failureThreshold: 30
            periodSeconds: 15
          resources:
            requests:
              cpu: 0.5
              memory: 500Mi
            limits:
              cpu: 1
              memory: 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.coloradmin.cn/o/1642569.html

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

相关文章

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

mac nvm install node<version> error 404

mac m2芯片遇到的问题&#xff0c;估计m系列的应该也有这个问题&#xff0c;在这里记录一下 解决方案&#xff1a; ## 需要先处理一下兼容就OK了arch -x86_64 zsh nvm install returns curl: (22) The requested URL returned error: 404 Issue #2667 nvm-sh/nvm GitHub

平平科技工作室-Python-猜数字游戏

一.代码展示 import random print(__猜数字游戏__) print(由平平科技工作室制作) print(游戏规则:1至10随机数随便猜) print (三次没猜对游戏结束) numrandom.randint (1,10) for i in range(3):aint(input(输入你想要猜测的数字))if a>num:print (数字猜的有点大了)elif a…

Three.js的摄像机

什么是摄像机 一般情况下&#xff0c;显示屏是二维的&#xff0c;如何把三维的场景显示到屏幕上呢&#xff1f;摄像机就是这样的一个抽象&#xff0c;它定义了三维空间到二维屏幕上的投影方式。 根据投影方法的不同&#xff0c;摄像机又分为正交投影照相机和透视投影摄像机。…

未发表!QRCNN-BiGRU-MultiAttention实现区间预测!轻松发顶刊!区间预测全家桶再更新!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 结果展示 数据介绍 原理讲解与流程 1.CN…

IOS 开发 - block 使用详解

1.Blobk的定义 block的写法相对难记,不必司机应被,只需要在xcode里打出"inlineBlock"--回车, 系统会自动帮你把基础版写法给你匹配出来 //Block的基础声明//等号""之前是blobk的声明,等号“”后面是block的实现/*returnType:返回类型(void、int、String *…

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&a…

ThreeJS:常见几何体与基础材质入门

在前文《ThreeJS:Geometry与顶点|索引|面》中&#xff0c;我们了解了与Geometry几何体相关的基础概念&#xff0c;也尝试了如何通过BufferGeometry自定义几何体。 常见Geometry几何体 ThreeJS内部也提供了诸多封装好的几何体&#xff0c;常见的Geometry几何体如下图所示&#…

Java | Leetcode Java题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(), b.length()), carry 0;for (int i 0; i < n; i) {carry i < a.length() ? (a.charAt(a.leng…

【平衡二叉树】AVL树(右单旋和左单旋的情况)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | 初阶数据结构 | Linux 文章目录 1. AVL树的定义2. C实现AVL树2.1 插入——左左型的右旋2.2 插入——右右型的左旋 3. 总结 1. AVL树的定…

本地部署大模型ollama+docker+open WebUI/Lobe Chat

文章目录 大模型工具Ollama下载安装运行Spring Ai 代码测试加依赖配置写代码 ollama的web&Desktop搭建部署Open WebUI有两种方式Docker DesktopDocker部署Open WebUIDocker部署Lobe Chat可以配置OpenAI的key也可以配置ollama 大模型的选择 本篇基于windows环境下配置 大模型…

【多变量控制系统 Multivariable Control System】(3)系统的状态空间模型至转换方程模型(使用Python)【新加坡南洋理工大学】

一、转换式 二、系统的状态空间模型 由矩阵A, B, C, D给出&#xff1a; 三、由状态空间模型转化为转换方程模型 函数原型&#xff08;版权所有&#xff1a;scipy&#xff09;&#xff1a; def ss2tf(A, B, C, D, input0):r"""State-space to transfer functi…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

毕业设计&#xff08;论文&#xff09;任务书 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于大数据的高考志愿推荐系统 设计&#xff08;论文&#xff09;的主要内容与要求&#xff1a; 主要内容&#xff1a; 高…

Unity 编辑器工具 - 资源引用查找器

在Unity项目开发过程中&#xff0c;管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 功能概述 资源引用查找器允许开发者选择一个目标资源&#xff0c;并在整个项目中查找引用了该资…

STM32:GPIO输出

文章目录 1、GPIO介绍1.1 GPIO的基本结构1.1 GPIO的位结构 2、 GPIO工作模式3、GPIO标准外设库接口函数3.1 RCC接口函数3.2 GPIO接口函数3.2.1 GPIO的读取函数3.2.1 GPIO的写入函数 4、GPIO的初始化 1、GPIO介绍 GPIO&#xff08;General Purpose Input Output&#xff09;通用…

腾讯云CentOS7使用Docker安装ElasticSearch与Kibana详细教程

文章目录 一、安装ElasticSearch二、安装Kibana 一、安装ElasticSearch 使用Docker拉取ElasticSearch镜像 这里版本选择的是7.15.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.22. 查看ElasticSearch的镜像id docker images3. 创建ElasticSearch容器 …

Linux基础指令001

名称日期版本说明作者了解并熟练运用Linux基础指令2024/05/04v0.0.1汇总篇lgb 一&#xff0c;了解Linux,并安装 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协…

基于OpenCv的图像金字塔

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…