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…