【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类型*/
    @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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

去哪儿网机票服务请求头pre逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; url&#xff1a;aHR0cHM6Ly9tLmZsaWdodC5xdW5hci5jb20v 一、加密位…

噪声嵌入提升语言模型微调性能

在自然语言处理&#xff08;NLP&#xff09;的快速发展中&#xff0c;大模型&#xff08;LLMs&#xff09;的微调技术一直是研究的热点。最近&#xff0c;一篇名为《NEFTUNE: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING》的论文提出了一种新颖的方法&#xff0c;通过在训…

网络基础-网络设备介绍

本系列文章主要介绍思科、华为、华三三大厂商的网络设备 网络设备 网络设备是指用于构建和管理计算机网络的各种硬件设备和设备组件。以下是常见的网络设备类型&#xff1a; 路由器&#xff08;Router&#xff09;&#xff1a;用于连接不同网络并在它们之间转发数据包的设备…

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

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

docker-compose启动mysql5.7报错

描述一下问题经过&#xff1a; 使用docker compose 部署mysql5.7 文件如下: services:mysql:restart: alwaysimage: mysql:5.7container_name: mysql-devports:- 3306:3306environment:- MYSQL_DATABASEdev- MYSQL_ROOT_PASSWORD123456healthcheck:test: ["CMD", &q…

VMware虚拟机中ubuntu使用记录(5)—— 如何在ubuntu中安装USB相机ros驱动并获取usb摄像头数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、ROS下USB相机驱动1.准备工作(1) 下载驱动(2) 创建ROS工作空间 2. 安装usb_cam驱动(1) 安装usb_cam驱动包(2) 编译代码 3. 修改usb_cam驱动的配置文件(1) 查看US…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

分享一篇关于AGI的短文:苦涩的教训

学习强化学习之父、加拿大计算机科学家理查德萨顿&#xff08; Richard S. Sutton &#xff09;2019年的经典文章《The Bitter Lesson&#xff08;苦涩的教训&#xff09;》。 文章指出&#xff0c;过去70年来AI研究走过的最大弯路&#xff0c;就是过于重视人类既有经验和知识&…

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

Leetcode—422. 有效的单词方块【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—422. 有效的单词方块 实现代码 class Solution { public:bool validWordSquare(vector<string>& words) {int row words.size();for(int i 0; i < row; i) {// 当前这一行的列数int col words[i].length(…

HTML_CSS学习:浮动

一、浮动简介 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>浮动_简介</title><style>div{width: 600px;height: 400px;background-color: #1c80d9;}img{float:…

c++多线程基础

简介 c多线程基础需要掌握这三个标准库&#xff1a;std::thread, std::mutex, and std::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::thread…

如何获得 FHE Circuit Privacy

参考文献&#xff1a; [AJL12] Asharov G, Jain A, Lpez-Alt A, et al. Multiparty computation with low communication, computation and interaction via threshold FHE[C]. EUROCRYPT 2012: 483-501[DS16] Ducas L, Stehl D. Sanitization of FHE Ciphertexts[C]. EUROCRY…

连接和使用vCenter Server嵌入式vPostgres数据库

vCenter Server 早期支持内嵌(embedded)和外部(external)数据库,内嵌数据库就是vPostgres,基于VMware Postgres数据库(PostgreSQL数据库),外部数据库用的多的是Oracle数据库和SQL Server数据库。因为早期使用内嵌的PostgreSQL数据库只能用于小型环境,比如仅支持几十台…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色&#xff1a;保存最近使用的多个颜色&…

Python设计模式 - 单例模式

定义 单例模式是一种创建型设计模式&#xff0c; 其主要目的是确保一个类只有一个实例&#xff0c; 并提供一个全局访问点来访问该实例。 结构 应用场景 资源管理&#xff1a;当需要共享某个资源时&#xff0c;例如数据库连接、线程池、日志对象等&#xff0c;可以使用单例模…

电路板/硬件---器件

电阻 电阻作用 电阻在电路中扮演着重要的角色&#xff0c;其作用包括&#xff1a; 限制电流&#xff1a;电阻通过阻碍电子流动的自由而限制电流。这是电阻最基本的功能之一。根据欧姆定律&#xff0c;电流与电阻成正比&#xff0c;电阻越大&#xff0c;通过电阻的电流就越小。…

OpenCV(六) —— Android 下的人脸识别

本篇我们来介绍在 Android 下如何实现人脸识别。 上一篇我们介绍了如何在 Windows 下通过 OpenCV 实现人脸识别&#xff0c;实际上&#xff0c;在 Android 下的实现的核心原理是非常相似的&#xff0c;因为 OpenCV 部分的代码改动不大&#xff0c;绝大部分代码可以直接移植到 …

Pytorch: nn.Embedding

文章目录 1. 本质2. 用Embedding产生一个10 x 5 的随机词典3. 用这个词典编码两个简单单词4. Embedding的词典是可以学习的5. 例子完整代码 1. 本质 P y t o r c h \mathrm{Pytorch} Pytorch 的 E m b e d d i n g \mathrm{Embedding} Embedding 模块是一个简单的查找表&#…

【多变量控制系统 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…