k8s+springboot+CronJob定时任务部署实现

 更新时间:2023年07月11日 15:17:21   作者:xiaogg3678  
本文主要介绍了k8s+springboot+CronJob定时任务部署实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

kubernetes+springboot+CronJob 定时任务配置如下代码:

cronjob.yaml k8s 文件  

apiVersion: batch/v1
kind: CronJob
metadata:
  name: k8s-springboot-demo
  namespace: rz-dt
spec:
  failedJobsHistoryLimit: 3 #执行失败job任务保留数量
  successfulJobsHistoryLimit: 5 #执行成功job任务保留数量
  startingDeadlineSeconds: 180
  concurrencyPolicy: Forbid
  schedule: "*/1 * * * *" #每分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: k8s-springboot-demo
              image: rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:$IMG_TAG
              imagePullPolicy: Always
              #command: ["java","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"]#dockerfile已有此处不需要配置
              args: ["sendEmail","sendEmail2"] # 配置任务类的名称
              volumeMounts:
                - name: time-config
                  mountPath: /etc/localtime
                  readOnly: true
              #envFrom:
              # - configMapRef:
              #      name: smcp-config
              # - secretRef:
              #     name: smcp-service-secret
              resources:
                requests:
                  cpu: "250m"
                  memory: 216Mi
                limits:
                  cpu: "500m"
                  memory: 512Mi
          restartPolicy: Never
          #从私有仓库拉取镜像凭证
          imagePullSecrets:
            - name: rz-dt-miyue-vpc
          volumes:
            - name: time-config
              hostPath:
                path: /usr/share/zoneinfo/Asia/Shanghai

Dockerfile 文件

#基础镜像,如果本地仓库没有,会从远程仓库拉取 openjdk:8
FROM openjdk:8
#暴露端口
EXPOSE 8089
#容器中创建目录
RUN mkdir -p /usr/local/cenobitor
#编译后的jar包copy到容器中创建到目录内
COPY target/k8s-springboot-demo.jar /usr/local/cenobitor/k8s-springboot-demo.jar
#指定容器启动时要执行的命令
ENTRYPOINT ["java","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"]

test.sh 文件

echo "开始制作镜像..."
image_tag=`date +%Y-%m-%d-%H-%M-%S` #_%H%M
echo "当前时间:$image_tag"
docker build -t k8s-springboot-demo:${image_tag} .
echo "制作镜像成功!"
echo "登录"
sudo docker login --username=aliyun0398513152 rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com --password=1234
echo "镜像最新版本提交"
docker tag k8s-springboot-demo:${image_tag} rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:${image_tag}
docker push rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:${image_tag}
echo "k8s一键部署"
export IMG_TAG=${image_tag}
envsubst < cronjob.yaml | kubectl --kubeconfig ~/.kube-rz/config apply -f -
 

4个代码实现类:

package com.example.demo.job;
public interface Command {
    /**
     * 遵循Unix约定,如果命令执行正常,则返回0;否则为非0。
     */
    int execute(String... args);
}
package com.example.demo.job;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class SendEmailCommand implements Command {
    @Override
    public int execute(String... args) {
        try {
            // 省略业务逻辑代码
            for (String arg:args) {
                log.info("send email  success args:" +arg);
            }
            log.info("send email success");
            return 0;
        } catch (Exception e) {
            log.error("send email error", e);
            return -1;
        }
    }
}
package com.example.demo.job;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class SendEmail2Command implements Command {
    @Override
    public int execute(String... args) {
        try {
            // 省略业务逻辑代码
            for (String arg:args) {
                log.info("send email 2  success args:" +arg);
            }
            log.info("send email 2 success");
            return 0;
        } catch (Exception e) {
            log.error("send email error", e);
            return -1;
        }
    }
}
package com.example.demo.job;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Component
@Slf4j
public class ProjectCommandLineRunner implements CommandLineRunner {
    Map<String, Command> commandMap = new HashMap<>();
    @Autowired
    private SendEmailCommand sendEmailCommand;
    @Autowired
    private SendEmail2Command sendEmail2Command;
    @PostConstruct
    private void init() {
        commandMap.put("sendEmail", sendEmailCommand);
        commandMap.put("sendEmail2", sendEmail2Command);
    }
    @Override
    public void run(String... args) throws Exception {
        if (args.length == 0) {
            return;
        }
        if (!commandMap.containsKey(args[0])) {
            log.error("'{}' command not found", args[0]);
            System.exit(-1);
        }
        for (String arg:args) {
            log.info("command args:" +arg);
        }
       for (int i = 0; i < args.length; i++) {
            Command command =  commandMap.get(args[i]);
            String[] arguments = Arrays.copyOfRange(args, 0, args.length);
            command.execute(arguments);
        }
        //执行成功则,正常退出0, 异常退出非0
        System.exit(0);
    }
}
 

kubectl 客户端执行,sh test.sh :

到此这篇关于k8s+springboot+CronJob定时任务部署实现的文章就介绍到这了,更多相关springboot CronJob定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈JAVA Actor模型的一致性与隔离性

    浅谈JAVA Actor模型的一致性与隔离性

    这篇文章主要介绍了JAVA Actor模型的的相关资料,文中讲解非常细致,帮助大家更好的学习JAVA,感兴趣的朋友可以了解下
    2020-06-06
  • 如何在java 8 map中使用stream

    如何在java 8 map中使用stream

    这篇文章主要介绍了如何在java 8 map中使用stream,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java 读取本地文件实例详解

    java 读取本地文件实例详解

    这篇文章主要介绍了java 读取本地文件实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • springboot @ConditionalOnMissingBean注解的作用详解

    springboot @ConditionalOnMissingBean注解的作用详解

    这篇文章主要介绍了springboot @ConditionalOnMissingBean注解的作用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 将RestTemplate的编码格式改为UTF-8,防止乱码问题

    将RestTemplate的编码格式改为UTF-8,防止乱码问题

    这篇文章主要介绍了将RestTemplate的编码格式改为UTF-8,防止乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java多线程之线程,进程和Synchronized概念初解

    java多线程之线程,进程和Synchronized概念初解

    这篇文章主要介绍了java多线程之线程,进程和Synchronized概念初解,涉及进程与线程的简单概念,实现多线程的方式,线程安全问题,synchronized修饰符等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • SpringMVC互联网软件架构REST使用详解

    SpringMVC互联网软件架构REST使用详解

    这篇文章主要为大家详细介绍了SpringMVC互联网软件架构REST的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • JDK1.7 Paths,Files类实现文件夹的复制与删除的实例

    JDK1.7 Paths,Files类实现文件夹的复制与删除的实例

    下面小编就为大家分享一篇JDK1.7 Paths,Files类实现文件夹的复制与删除的实例,具有很好的参考价值,希望对大家有所帮助。以前跟随小编过来看看吧
    2017-11-11
  • Java Rabbitmq中四种集群架构的区别详解

    Java Rabbitmq中四种集群架构的区别详解

    这篇文章主要为大家详细介绍了Java Rabbitmq中四种集群架构的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • MyBatis 中使用 Mapper 简化代码的方法

    MyBatis 中使用 Mapper 简化代码的方法

    这篇文章主要介绍了MyBatis 中使用 Mapper 简化代码的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论