k8s+springboot+CronJob定時任務(wù)部署實現(xiàn)
kubernetes+springboot+CronJob 定時任務(wù)配置如下代碼:

cronjob.yaml k8s 文件
apiVersion: batch/v1
kind: CronJob
metadata:
name: k8s-springboot-demo
namespace: rz-dt
spec:
failedJobsHistoryLimit: 3 #執(zhí)行失敗job任務(wù)保留數(shù)量
successfulJobsHistoryLimit: 5 #執(zhí)行成功job任務(wù)保留數(shù)量
startingDeadlineSeconds: 180
concurrencyPolicy: Forbid
schedule: "*/1 * * * *" #每分鐘執(zhí)行一次
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"] # 配置任務(wù)類的名稱
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/ShanghaiDockerfile 文件
#基礎(chǔ)鏡像,如果本地倉庫沒有,會從遠(yuǎn)程倉庫拉取 openjdk:8 FROM openjdk:8 #暴露端口 EXPOSE 8089 #容器中創(chuàng)建目錄 RUN mkdir -p /usr/local/cenobitor #編譯后的jar包copy到容器中創(chuàng)建到目錄內(nèi) COPY target/k8s-springboot-demo.jar /usr/local/cenobitor/k8s-springboot-demo.jar #指定容器啟動時要執(zhí)行的命令 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 "當(dāng)前時間:$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個代碼實現(xiàn)類:
package com.example.demo.job;
public interface Command {
/**
* 遵循Unix約定,如果命令執(zhí)行正常,則返回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 {
// 省略業(yè)務(wù)邏輯代碼
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 {
// 省略業(yè)務(wù)邏輯代碼
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);
}
//執(zhí)行成功則,正常退出0, 異常退出非0
System.exit(0);
}
}
kubectl 客戶端執(zhí)行,sh test.sh :




到此這篇關(guān)于k8s+springboot+CronJob定時任務(wù)部署實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot CronJob定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot定時任務(wù)兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法
- 詳解SpringBoot 創(chuàng)建定時任務(wù)(配合數(shù)據(jù)庫動態(tài)執(zhí)行)
- Springboot整個Quartz實現(xiàn)動態(tài)定時任務(wù)的示例代碼
- SpringBoot 定時任務(wù)遇到的坑
- Springboot定時任務(wù)Scheduled重復(fù)執(zhí)行操作
- springboot如何配置定時任務(wù)
- SpringBoot 動態(tài)定時器的使用方法
- 淺談SpringBoot集成Quartz動態(tài)定時任務(wù)
- 基于Springboot執(zhí)行多個定時任務(wù)并動態(tài)獲取定時任務(wù)信息
- SpringBoot與Quartz集成實現(xiàn)分布式定時任務(wù)集群的代碼實例
- springboot定時任務(wù)@Scheduled執(zhí)行多次的問題
- springboot整合quartz實現(xiàn)定時任務(wù)示例
相關(guān)文章
Maven和MyBatis框架簡單實現(xiàn)數(shù)據(jù)庫交互的示例
本文主要介紹了Maven和MyBatis框架簡單實現(xiàn)數(shù)據(jù)庫交互的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Spring Boot的filter(過濾器)簡單使用實例詳解
過濾器(Filter)的注冊方法和 Servlet 一樣,有兩種方式:代碼注冊或者注解注冊,下面通過實例給大家介紹Spring Boot的filter(過濾器)簡單使用,一起看看吧2017-04-04
Java并發(fā)編程之JUC并發(fā)核心AQS同步隊列原理剖析
AbstractQueuedSynchronizer 簡稱 AQS,可能我們幾乎不會直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實現(xiàn),大神 Doug Lea 在設(shè)計 JUC 包時希望能夠抽象一個基礎(chǔ)且通用的組件以支撐上層模塊的實現(xiàn),AQS 應(yīng)運而生2021-09-09
Spring.Net在MVC中實現(xiàn)注入的原理解析
這篇文章主要介紹了Spring.Net在MVC中實現(xiàn)注入的原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
SpringBoot啟動多數(shù)據(jù)源找不到合適的驅(qū)動類問題
這篇文章主要介紹了SpringBoot啟動多數(shù)據(jù)源找不到合適的驅(qū)動類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Swagger實現(xiàn)動態(tài)條件注入與全局?jǐn)r截功能詳細(xì)流程
這篇文章主要介紹了Swagger實現(xiàn)動態(tài)條件注入與全局?jǐn)r截功能詳細(xì)流程,Swagger 可以提供 API 操作的測試文檔,本文記錄 Swagger 使用過程中遇到的小問題2023-01-01

