【序列晉升】29 Spring Cloud Task 微服務架構下的輕量級任務調度框架

Spring Cloud Task作為微服務架構中的輕量級任務調度框架,為開發人員提供了一種構建短生命周期微服務任務的便捷方式。它允許開發者快速創建、執行和管理一次性任務或短期批處理作業,任務執行完成后自動關閉以釋放系統資源,避免了傳統長期運行微服務的資源浪費問題。本文將深入解析Spring Cloud Task的定義、背景、架構設計、核心組件、關鍵特性、使用方法以及在微服務場景下的實際應用,幫助技術開發人員更好地理解和應用這一框架。

一、什么是Spring Cloud Task?

Spring Cloud Task是一個輕量級框架,專為構建短生命周期微服務任務而設計。與傳統長期運行的微服務不同,Spring Cloud Task應用啟動后執行預定義的業務邏輯,完成后自動關閉,不會持續消耗系統資源。這種設計使得它特別適合處理一次性任務(如數據遷移)、短期批處理(如文件處理)以及定時任務(如訂單狀態檢查、緩存清理)等場景。

在技術實現上,Spring Cloud Task基于Spring Boot構建,通過@EnableTask注解啟用任務功能。它提供了一套完整的API和工具,用于管理任務的執行狀態、參數傳遞和結果存儲。框架會自動跟蹤任務的執行情況,包括啟動時間、結束時間、退出碼等信息,并將這些元數據持久化到數據庫中。這種輕量級、自包含的特性使得Spring Cloud Task成為微服務架構中處理短暫任務的理想選擇

二、誕生背景

Spring Cloud Task的誕生源于微服務架構的普及和發展。在單體應用時代,定時任務通常通過Quartz或Spring Task等框架實現,但在微服務架構下,傳統任務調度方式面臨諸多挑戰:

首先,微服務架構的分布式特性使得任務調度變得復雜。傳統定時任務難以保證在分布式環境中不重復執行,且缺乏有效的任務協調機制。其次,微服務應用通常長期運行,導致資源浪費。許多任務只需執行一次或短時間運行,卻需要持續占用服務器資源。最后,微服務環境中的任務管理缺乏統一的視角。隨著服務數量的增加,任務執行狀態的跟蹤和歷史查詢變得困難。

正是針對這些挑戰,Spring Cloud Task于2016年隨Spring Cloud 1.0版本一起推出,旨在簡化微服務環境中的任務調度與管理。它作為Spring Cloud生態系統的一部分,填補了微服務架構中短暫任務管理的空白,為開發人員提供了一種更輕量、更靈活的任務執行方式。

三、架構設計

Spring Cloud Task采用分層架構設計,主要包括以下四個層次:

+-------------------+       +-------------------+       +-------------------+
|   Coordinator     |<----->|   Database        |<----->|  TaskExecutor     |
| (任務協調中心)     |       | (任務元數據存儲)   |       | (任務執行器)       |
+-------------------+       +-------------------+       +-------------------+|                            |                            || 1.任務觸發                 |                            ||------------------------->|                            ||                            | 3.創建任務實例并存儲狀態   ||                            |------------------------->||                            |                            | 4.執行任務邏輯|                            |                            |------------------------->||                            |                            |                            | 5.更新任務狀態|                            |                            |<-------------------------|| 2.分配任務到Executor       |                            ||------------------------->|                            ||                            |                            |

網關層:負責接收外部任務請求,如HTTP API或命令行觸發,并將請求轉發到任務調度中心 。在微服務環境中,這一層通常由Spring Cloud Gateway或Zuul實現,提供統一的入口和路由功能。

核心處理層:這是Spring Cloud Task的核心,包含任務生成器和任務調度中心 。任務生成器負責將外部請求解析為具體任務,并根據任務類型進行拆分(如單一任務、批量任務或組合任務) 。任務調度中心則負責管理任務狀態,使用分布式鎖機制從數據庫獲取待分配任務列表,并將任務分配到不同的服務模塊 。

任務執行層:這一層由各個微服務模塊組成,負責執行具體任務邏輯 。任務執行可以是簡單的CommandLineRunner或復雜的Tasklet,也可以集成Spring Batch進行大規模批處理。執行完成后,各模塊將結果反饋給任務調度中心,更新任務狀態。

存儲層:負責持久化任務元數據和執行信息 。Spring Cloud Task默認使用H2內存數據庫,但在生產環境中通常配置為MySQL、PostgreSQL等關系型數據庫 。存儲層通過TaskRepository接口管理任務執行記錄,確保任務狀態的可靠存儲。

在組件協作方面,Spring Cloud Task采用以下流程:任務請求從前端或第三方應用觸發后,經過網關層轉發到核心處理層,由任務生成器拆分任務并存儲到數據庫(TaskExecution記錄);任務調度中心通過定時器和分布式鎖獲取待處理任務,分配至注冊的服務模塊;任務執行后,結果反饋至核心處理層,更新任務狀態 。

四、解決的問題

Spring Cloud Task主要解決以下問題:

任務的高可用性:在分布式環境中,確保任務即使在節點故障時也能可靠執行,避免任務丟失或重復執行。通過任務元數據的持久化存儲和分布式鎖機制,Spring Cloud Task能夠保證任務的正確執行和狀態更新。

任務的分布式管理:在微服務架構中,任務可能需要在多個節點間分配執行,Spring Cloud Task通過任務調度中心和注冊中心(如Eureka、Nacos)的配合,實現任務的動態分配和負載均衡 。

任務狀態跟蹤與歷史查詢:傳統定時任務難以追蹤執行歷史和狀態,Spring Cloud Task通過TaskExecutionTaskExplorer接口,提供完整的任務執行歷史記錄和狀態查詢能力 。

資源優化短生命周期設計使得任務執行完畢后自動關閉,避免了資源浪費。這一特性在處理一次性或低頻任務時尤為重要,可以顯著降低系統資源占用。

任務依賴管理:對于有依賴關系的任務,Spring Cloud Task支持前置條件校驗,確保任務按正確順序執行 。例如,任務B的執行必須等待任務A完成,系統會自動處理這種依賴關系。

五、關鍵特性

Spring Cloud Task具備以下關鍵特性:

輕量級設計:基于Spring Boot構建,無需復雜配置即可快速開發短生命周期任務。與傳統長期運行的微服務相比,它在任務執行完畢后自動關閉,節省系統資源。

任務元數據持久化:通過TaskRepository將任務執行信息(如任務名稱、開始時間、結束時間、狀態、參數等)持久化到數據庫,支持后續的查詢和分析。

任務狀態管理:任務狀態分為待分發(INIT)、執行中(PROGRESS)、已完成(SUCCESS)和失敗(FAILURE)四種,提供完整的生命周期跟蹤 。

任務分區(Task Partitioning):對于大型任務,Spring Cloud Task支持將其拆分為多個子任務并行執行,通過TaskSplitterTaskProcessor實現分布式計算,提高執行效率 。

與Spring Cloud生態深度集成:與配置中心(Config)、服務發現(Eureka、Nacos)、API網關(Gateway)、負載均衡(Ribbon)等組件無縫協作,提供統一的微服務任務管理解決方案 。

命令行和HTTP API觸發:支持通過命令行參數或HTTP API觸發任務執行,提供靈活的任務啟動方式。

自動關閉上下文:默認情況下,任務執行完畢后Spring Boot應用上下文會自動關閉,釋放資源。可通過配置spring.cloud.task.closecontext_enabled=false禁用此特性,使應用持續運行。

六、與同類產品對比

在任務調度領域,Spring Cloud Task與Quartz、Spring Batch等產品有顯著差異:

特性Spring Cloud TaskQuartzSpring Batch
適用場景短生命周期任務、微服務環境長期運行、復雜調度規則大規模批處理作業
資源占用任務執行完畢后自動關閉,資源占用低長期運行,資源占用較高資源占用較高,適合批量處理
分布式支持原生支持分布式環境,避免重復執行需額外配置集群,容易重復執行需結合其他框架實現分布式
微服務集成與Spring Cloud生態無縫集成需自行處理微服務環境下的協調專注于批處理,與微服務集成度高
任務持久化自動記錄任務執行元數據需自行實現任務狀態跟蹤提供完善的作業元數據管理

與Quartz相比,Spring Cloud Task更適合微服務架構下的任務調度,它解決了Quartz在分布式環境中容易重復執行的問題,并與Spring Cloud生態深度集成,簡化了配置和管理。與Spring Batch相比,Task更專注于任務調度和執行,而Batch則專注于大規模批處理作業的實現。兩者可以結合使用,發揮各自優勢。

七、使用方法

1. 基礎配置

首先,創建一個Spring Boot項目,并添加Spring Cloud Task依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-task</artifactId><version>3.0.4</version>
</dependency>

application.properties中配置數據源和任務參數 :

# 數據源配置(使用MySQL)
spring.datasource.url=jdbc:mysql://localhost:3306/task_db
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Task配置
spring.cloud.task.name=myTask
spring.cloud.task.initialize.enable=true
spring.cloud.task.tablePrefix=TASK_
2. 定義任務邏輯

使用CommandLineRunnerTasklet定義任務邏輯:

@SpringBootApplication
@EnableTask
public class MyTaskApplication {public static void main(String[] args) {SpringApplication.run(MyTaskApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner() {return args -> {System.out.println("任務開始執行...");// 任務邏輯Thread.sleep(5000);System.out.println("任務執行完成");// 應用自動關閉};}}

或使用Tasklet實現更復雜的任務邏輯:

@Component
public class MyTasklet implements Tasklet {@Overridepublic RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {System.out.println("執行任務let邏輯...");// 獲取任務參數Map<String, Object> arguments = chunkContext.getStepContext().getJobParameters().getParameters();String param = (String) arguments.get("myParam");System.out.println("參數值:" + param);// 處理任務return RepeatStatus.FINISHED;}}
3. 任務執行與監控

啟動應用后,任務將自動執行:

java -jar my-task.jar --spring.cloud.task.name=myTask

或通過HTTP API觸發任務執行:

curl -X POST "http://localhost:8080/actuator/task"

任務執行狀態可通過TaskExplorer接口查詢 :

@Autowired
private TaskExplorer taskExplorer;public void checkTaskStatus() {List<TaskExecution> taskExecutions = taskExplorer.findTaskExecutionsByTaskName("myTask");for (TaskExecution execution : taskExecutions) {System.out.println("任務ID:" + execution.getExecutionId());System.out.println("任務狀態:" + execution.getExitCode());System.out.println("開始時間:" + execution.getStartTime());System.out.println("結束時間:" + execution.getEndTime());}
}
4. 任務分區(Task Partitioning)

對于大型任務,可以啟用任務分區以提高執行效率 :

@SpringBootApplication
@EnableTask
@EnableTaskPartitioning
public class PartitionedTaskApplication {public static void main(String[] args) {SpringApplication.run(PartitionedTaskApplication.class, args);}@Beanpublic Partitioner partitioner() {return new Partitioner() {@Overridepublic Map<String, Partition> getPartitions() {Map<String, Partition> partitions = new HashMap<>();for (int i = 0; i < 10; i++) {Partition partition = new Partition();partition.set arguments(Collections.singletonMap("chunk", i));partitions.put("partition-" + i, partition);}return partitions;}};}@Beanpublic Step step() {return new StepBuilder("step").<Partition, Partition>chunk(1).reader(partition -> {// 根據分區參數讀取數據return partition.getArguments().get("chunk");}).processor(item -> {// 處理數據return item;}).writer(items -> {// 寫入結果}).build();}@Beanpublic Job job() {return new JobBuilder("myJob").start(step()).build();}}

application.properties中配置分區數量:

spring.cloud.task-partitioning.grid-size=10
5. Spring Cloud Data Flow集成

Spring Cloud Task可以與Spring Cloud Data Flow集成,實現更復雜的任務編排和管理:

首先,創建一個Maven項目,并添加Data Flow相關依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-data-flow任務</artifactId><version>2.9.0</version>
</dependency>

定義任務應用:

@SpringBootApplication
@EnableTask
public class DataFlowTaskApplication {public static void main(String[] args) {SpringApplication.run(DataFlowTaskApplication.class, args);}@BeanpublicCommandLineRunner commandLineRunner() {return args -> {System.out.println("Data Flow任務執行開始...");// 任務邏輯System.out.println("Data Flow任務執行結束");};}}

然后,將任務應用上傳到Spring Cloud Data Flow Server,并定義任務流:

# 上傳任務應用
spring cloud task create --name data-flow_task --definition "data-flow_task:1.0-SNAPSHOT"# 定義任務流
task launch data-flow_task

八、實際應用示例

1. 數據同步任務

以下是一個數據同步任務的實現示例,使用Spring Cloud Task從數據庫中讀取數據并寫入文件:

@SpringBootApplication
@EnableTask
public class DataSyncTaskApplication {public static void main(String[] args) {SpringApplication.run(DataSyncTaskApplication.class, args);}@BeanpublicCommandLineRunner commandLineRunner(JdbcTemplate模板) {return args -> {System.out.println("數據同步任務開始執行...");// 從數據庫讀取數據List<Map<String, Object>> results = template.queryForList("SELECT * FROM my_table");// 寫入文件FileWriter writer = new FileWriter("output.txt");for (Map<String, Object> row : results) {writer.write(row.toString() + "\n");}writer.close();System.out.println("數據同步任務執行完成");};}}
2. 定時清理任務

以下是一個定時清理任務的實現示例,使用Spring Cloud Task定期清理緩存數據:

@SpringBootApplication
@EnableTask
public class CacheCleanupTaskApplication {public static void main(String[] args) {SpringApplication.run(CacheCleanupTaskApplication.class, args);}@BeanpublicCommandLineRunner commandLineRunner(RedisTemplate<String, String> redisTemplate) {return args -> {System.out.println("緩存清理任務開始執行...");// 清理過期緩存redisTemplate.keys("*").forEach(key -> {if (redisTemplate.getExpire(key) <= 0) {redisTemplate.delete(key);}});System.out.println("緩存清理任務執行完成");};}}
3. 分布式任務調度

以下是一個分布式任務調度的實現示例,使用Spring Cloud Task與Eureka集成,實現任務的分布式執行 :

@SpringBootApplication
@EnableTask
@EnableEurekaClient
public class DistributedTaskApplication {public static void main(String[] args) {SpringApplication.run(DistributedTaskApplication.class, args);}@BeanpublicCommandLineRunner commandLineRunner() {return args -> {System.out.println("分布式任務開始執行...");// 獲取Eureka注冊的服務列表List<InstanceInfo> instances = eurekaClient.getApplications().get instances();// 將任務分配到不同服務實例instances.forEach(instance -> {RestTemplate template = new RestTemplate();template.postForLocation("http://"+instance.get hostname port() +"/api/executeTask", null);});System.out.println("分布式任務執行完成");};}}

九、最佳實踐與注意事項

在使用Spring Cloud Task時,建議遵循以下最佳實踐:

使用配置中心管理任務參數:將任務參數(如數據庫連接信息、執行頻率等)集中管理在Spring Cloud Config或Nacos中,便于動態更新和維護 。

啟用任務分區處理大數據量任務:對于需要處理大量數據的任務,啟用任務分區(@EnableTaskPartitioning)并合理設置grid-size,以提高執行效率 。

配置適當的JVM參數:在Dockerfile中設置合理的JVM參數(如內存限制、垃圾回收策略),避免任務執行過程中出現內存溢出等問題。

FROM openjdk:17-jre-slim
WORKDIR /app
COPY target/my-task.jar /app/my-task.jar
ENV JAVA_OPTS="-Xmx512m -Xms256m"
ENTRYPOINT ["java", "$JAVA_OPTS", "-jar", "/app/my-task.jar"]

設置任務重試策略:在application.properties中配置任務重試策略,確保任務在失敗時能夠自動重試:

spring.cloud.task retry.max-attempts=3
spring.cloud.task retry(initial delay=1000
spring.cloud.task retry delay-multiplier=2.0

集成監控工具:添加Spring Boot Actuator依賴,啟用任務執行監控和健康檢查 :

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

避免任務重復執行:在分布式環境中,確保任務調度中心使用分布式鎖(如Redis鎖)獲取任務,避免多個實例同時執行同一任務 。

合理選擇數據庫:在生產環境中,避免使用H2內存數據庫,選擇MySQL、PostgreSQL等持久化數據庫,并根據需要配置spring.cloud.task.tablePrefix自定義表前綴。

結合Spring Cloud Data Flow:對于復雜的任務編排場景,考慮與Spring Cloud Data Flow集成,實現任務的統一管理和調度。

十、總結與展望

Spring Cloud Task通過輕量級設計和微服務原生支持,為分布式系統中的短生命周期任務管理提供了理想解決方案。它簡化了任務開發、執行和管理流程,提供了完善的任務元數據持久化和狀態跟蹤機制,與Spring Cloud生態深度集成,適應了現代微服務架構的需求。

隨著云原生和微服務技術的不斷發展,Spring Cloud Task也在持續優化和演進。未來,我們可以期待它在以下方面取得更多進展:

更好的云平臺支持:進一步優化與Kubernetes、AWS等云平臺的集成,實現任務的自動擴縮容和調度優化。

更強大的任務編排能力:增強與Spring Cloud Data Flow的集成,提供更靈活的任務流定義和執行策略。

更完善的監控和告警機制:整合Prometheus、Grafana等監控工具,提供任務執行的可視化監控和異常告警。

更高效的資源管理:優化任務執行時的資源分配和回收機制,進一步降低資源占用。

更豐富的任務類型支持:擴展對不同類型任務(如流式任務、事件驅動任務等)的支持,滿足更多業務場景的需求。

對于技術開發人員來說,Spring Cloud Task提供了一種簡潔而強大的方式來構建和管理微服務中的短暫任務。通過合理配置和使用,可以顯著提升系統的可擴展性、可靠性和資源利用率。在實際應用中,Spring Cloud Task尤其適合那些只需要執行一次或短時間運行的任務,數據遷移、緩存清理、日志歸檔等場景。通過與Spring Cloud Data Flow的集成,還可以實現更復雜的任務編排和管理,為微服務架構提供完整的任務調度解決方案。


?參考資料:
  • Spring Cloud Task 文檔

?本博客專注于分享開源技術、微服務架構、職場晉升以及個人生活隨筆,這里有:

📌 技術決策深度文(從選型到落地的全鏈路分析)

💭 開發者成長思考(職業規劃/團隊管理/認知升級)

🎯 行業趨勢觀察(AI對開發的影響/云原生下一站)

關注我,每周日與你聊“技術內外的那些事”,讓你的代碼之外,更有“技術眼光”。

日更專刊:

🥇 《Thinking in Java》 🌀 java、spring、微服務的序列晉升之路!
🏆 《Technology and Architecture》 🌀 大數據相關技術原理與架構,幫你構建完整知識體系!

關于博主:

🌟博主GitHub

🌞博主知識星球


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96024.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【1分鐘速通】 HTML快速入門

HTML&#xff08;HyperText Markup Language&#xff0c;超文本標記語言&#xff09; 是構建網頁的基礎語言。它通過 標簽&#xff08;Tag&#xff09; 來描述網頁的結構和內容&#xff0c;常與 CSS&#xff08;負責樣式 – <style></style>&#xff09;和 JavaScr…

【GeoServer】WMS GetFeatureInfo URL 逐個參數解釋

我來把你構造的這個 WMS GetFeatureInfo URL 逐個參數解釋一下&#xff0c;方便你理解&#xff1a;http://127.0.0.1:8090/geoserver/xxxx/wms? SERVICEWMS& VERSION1.1.1& REQUESTGetFeatureInfo& QUERY_LAYERSloess:yourLayer& LAYERSloess:yourLayer& …

OBS直播教程:點歌直播間怎么弄?直播點歌用什么軟件?

OBS直播教程&#xff1a;點歌直播間怎么弄&#xff1f;直播點歌用什么軟件&#xff1f; 第一步&#xff1a;安裝OBS直播軟件&#xff0c;如果你電腦已經安裝了OBS&#xff0c;請直接看第二步 OBS直播軟件下載地址①&#xff1a; https://d.obscj.com/obs-Studio-29.1.3-Full-…

【數據庫】Redis詳解:內存數據庫與緩存之王

什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的數據結構存儲系統&#xff0c;可以用作數據庫、緩存和消息代理。它支持多種數據結構&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;具有極高的性能和…

【iOS】 單例模式

1. 認識單例模式首先讓我們先看下關于單例模式的定義&#xff08;來自于《設計模式》(Addison-Wesley,1994)&#xff09;一個類有且僅有一個實例&#xff0c;并且自行實例化向整個系統提供。如果說每一個人都是一個類&#xff0c;那么從他出生開始&#xff0c;他就是生活中的唯…

多目標輪廓匹配

前面我們使用模板匹配&#xff0c;得到的結果都是一個圖&#xff0c;那么如果我們圖片中有許多我們的目標&#xff0c;那么該如何找出來呢&#xff1f;如上我們圖片中有許多箭頭和我們的模板一致&#xff0c;只不過方向不對&#xff0c;那么該如何匹配呢&#xff1f;圖片和模板…

【C++】簡單介紹lambda表達式

各位大佬好&#xff0c;我是落羽&#xff01;一個堅持不斷學習進步的學生。 如果您覺得我的文章還不錯&#xff0c;歡迎多多互三分享交流&#xff0c;一起學習進步&#xff01; 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、 什么是lambda表達式二、 表達式語法三、lambd…

磁共振成像原理(理論)4:自由進動和弛豫 (Free Precession and Relaxation)

當磁化自旋系統被射頻脈沖擾動而偏離其熱平衡態后&#xff0c;一旦移除外部激勵并給予足夠時間&#xff0c;系統將根據熱力學定律返回平衡態。這一過程包含三個特征現象&#xff1a; (a) 自由進動——宏觀磁化矢量 (M?\vec{M}M) 繞( B0?\vec {B_0}B0?? )場的進動&#xff1…

ubuntu 20.04 安裝spark

安裝openjdk21 下載 wget https://download.java.net/openjdk/jdk21/ri/openjdk-2135_linux-x64_bin.tar.gz解壓 tar -xvf openjdk-2135_linux-x64_bin.tar.gzsudo mv jdk-21/ /opt/jdk-21/設置環境變量 echo export JAVA_HOME/opt/jdk-21 | sudo tee /etc/profile.d/java2…

第三方區塊鏈應用測評:【多簽錢包合約安全評估_閾值簽名機制與私鑰存儲安全性測試】

閾值簽名機制安全測試密碼學審計 采用門限簽名方案&#xff08;TSS&#xff09;的多簽錢包需驗證其閾值BLS簽名或ECDSA簽名算法的正確性。測試重點包括&#xff1a;分布式密鑰生成&#xff08;DKG&#xff09;過程的保密性&#xff08;無密鑰信息泄露&#xff09;、簽名碎片驗證…

大模型處理長文檔的挑戰和解決方案?

當前&#xff0c;AI 應用正處于極速發展階段&#xff0c;大語言模型&#xff08;LLM&#xff09;與檢索增強生成&#xff08;RAG&#xff09;系統已成為構建智能問答、知識管理等高階 AI 應用的核心引擎&#xff0c;被廣泛應用于金融分析、學術研究、企業合規等多個領域。然而&…

JavaWeb--day1--HTMLCSS

(以下內容全部來自上述課程及課件) web開發介紹 1. 什么是web&#xff1f; Web&#xff1a;全球廣域網&#xff0c;也稱為萬維網&#xff0c;能夠通過瀏覽器訪問的網站。 2. Web網站的工作流程 3. Web標準 Web標準也稱為網頁標準&#xff0c;由一系列的標準組成&#xf…

OpenEuler安裝gitlab,部署gitlab-runner

目錄 一、安裝gitlab 二、安裝部署docker設置源 三、下載部署runner ?編輯 四、構建CI/CD 一、安裝gitlab 1.查看OpenEuler版本 [rootlocalhost ~]# cat /etc/os-release NAME"openEuler" VERSION"24.03 (LTS-SP1)" ID"openEuler" VERSI…

實戰項目-----在圖片 hua.png 中,用紅色畫出花的外部輪廓,用綠色畫出其簡化輪廓(ε=周長×0.005),并在同一窗口顯示

實戰項目實現以下功能&#xff1a;對圖片 hua.png 進行輪廓提取&#xff0c;并在同一窗口中完成以下兩個繪制操作&#xff1a;用紅色畫出花的外部輪廓&#xff08;即最外層輪廓&#xff09;用綠色畫出該輪廓的近似多邊形&#xff0c;其中近似精度參數 ε 設置為輪廓周長的 0.00…

開源鴻蒙北向框架開發:系統服務理論詳解

系統服務的啟動 基本可以認為&#xff1a;OpenHarmony 的系統服務進程都是“由 init 直接或間接拉起”的。 直接方式&#xff1a; init 按 /system/etc/init/.cfg 啟動可執行&#xff08;如 /system/bin/sa_main、/system/bin/samgr 等&#xff09;&#xff0c;這些進程的 PPid…

龍虎榜——20250909

上證指數今天縮量收陰線&#xff0c;跌破10日均線&#xff0c;目前日線總體處于高位寬幅震蕩中&#xff0c;小級別暫未明確方向&#xff0c;指數面臨方向選擇&#xff0c;需要注意高位股的風險。 深證指數今天縮量收陰線&#xff0c;跌破5日均線&#xff0c;接下來幾天方向的選…

基于dijkstra算法的WSN網絡MAC協議matlab仿真,分析網絡延遲與網絡開銷

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 無線傳感器網絡&#xff08;WSN, Wireless Sensor Network&#xff09;是由大量低成本、低功耗的傳感器節點組成&#xff0c;通過無線通信實現數據采集、傳輸與…

ES數據庫啟動時可以設置1G一下內存嗎

可以&#xff0c;但強烈不建議在生產環境中這樣做。ES 7.0 版本確實可以設置小于 1GB 的堆內存&#xff0c;但這會帶來嚴重的性能問題和穩定性風險。 快速回答 # 最小化配置示例 - 僅用于測試或開發環境 export ES_JAVA_OPTS"-Xms512m -Xmx512m" ./bin/elasticsearch…

TI-92 Plus計算器:單位換算功能介紹

1 TI-92 Plus計算器&#xff1a;單位換算功能介紹 TI-92 Plus 內置了全面的單位換算功能&#xff0c;支持長度、質量、時間、溫度、面積、體積、速度等數十種物理量的單位轉換&#xff0c;操作直觀&#xff0c;無需手動輸入換算系數。以下是具體使用方法、示例及功能特點&#…

雪球科技Java開發工程師筆試題

單選 1.下列哪些語句關于內存回收的說明是正確的?( C ) A.內存回收程序允許程序員直接釋放內存 B.程序員必須創建一個線程來釋放內存 C.內存回收程序負責釋放無用內存 D.內存回收程序可以在指定的時間釋放內存對象 2.以下哪項不是Java基礎類型(A) A.String B.int C.b…