图思维胜过链式思维:JGraphlet构建任务流水线的八大核心原则

news/2025/9/26 21:32:19/文章来源:https://www.cnblogs.com/qife122/p/19110571

图思维胜过链式思维:JGraphlet构建任务流水线 🚀

JGraphlet是一个轻量级、零依赖的Java库,用于构建任务流水线。它的强大之处不在于冗长的功能列表,而在于一小套协同工作的核心设计原则。

JGraphlet的核心是简洁性,基于图模型构建。向流水线添加任务并连接它们以创建图。
每个任务都有输入和输出,TaskPipeline构建并执行流水线,同时管理每个任务的I/O。例如,使用Map进行扇入操作,使用Record定义自定义数据模型等。TaskPipeline还包含PipelineContext在任务间共享数据,此外任务还可以被缓存,避免重复计算。

您可以自定义任务流水线的流程,并选择使用SyncTask或AsyncTask。默认情况下所有任务都是异步的。

1. 图优先执行模型

JGraphlet将工作流视为有向无环图。您将任务定义为节点,并显式绘制它们之间的连接。这使得扇出和扇入等复杂模式变得自然。

import dev.shaaf.jgraphlet.*;
import java.util.Map;
import java.util.concurrent.CompletableFuture;try (TaskPipeline pipeline = new TaskPipeline()) {Task<String, String> fetchInfo = (id, ctx) -> CompletableFuture.supplyAsync(() -> "Info for " + id);Task<String, String> fetchFeed = (id, ctx) -> CompletableFuture.supplyAsync(() -> "Feed for " + id);Task<Map<String, Object>, String> combine = (inputs, ctx) -> CompletableFuture.supplyAsync(() ->inputs.get("infoNode") + " | " + inputs.get("feedNode"));pipeline.addTask("infoNode", fetchInfo).addTask("feedNode", fetchFeed).addTask("summaryNode", combine);pipeline.connect("infoNode", "summaryNode").connect("feedNode", "summaryNode");String result = (String) pipeline.run("user123").join();System.out.println(result); // "Info for user123 | Feed for user123"
}

2. 两种任务风格:Task<I,O>和SyncTask<I,O>

JGraphlet提供两种可混合使用的任务类型:

  • Task<I, O>(异步):返回CompletableFuture,适合I/O操作或繁重计算
  • SyncTask<I, O>(同步):直接返回O,适合快速的CPU密集型操作
try (TaskPipeline pipeline = new TaskPipeline()) {Task<String, String> fetchName = (userId, ctx) ->CompletableFuture.supplyAsync(() -> "John Doe");SyncTask<String, String> toUpper = (name, ctx) -> name.toUpperCase();pipeline.add("fetch", fetchName).then("transform", toUpper);String result = (String) pipeline.run("user-42").join();System.out.println(result); // "JOHN DOE"
}

3. 简单显式的API

JGraphlet避免复杂的构建器或魔法配置,API简洁明了:

  • 创建流水线:new TaskPipeline()
  • 注册节点:addTask("uniqueId", task)
  • 连接节点:connect("fromId", "toId")
try (TaskPipeline pipeline = new TaskPipeline()) {SyncTask<String, Integer> lengthTask = (s, c) -> s.length();SyncTask<Integer, String> formatTask = (i, c) -> "Length is " + i;pipeline.addTask("calculateLength", lengthTask);pipeline.addTask("formatOutput", formatTask);pipeline.connect("calculateLength", "formatOutput");String result = (String) pipeline.run("Hello").join();System.out.println(result); // "Length is 5"
}

4. 清晰的扇入输入形状

扇入任务接收Map<String, Object>,其中键是父任务ID,值是它们的结果。

try (TaskPipeline pipeline = new TaskPipeline()) {SyncTask<String, String> fetchUser = (id, ctx) -> "User: " + id;SyncTask<String, String> fetchPerms = (id, ctx) -> "Role: admin";Task<Map<String, Object>, String> combine = (inputs, ctx) -> CompletableFuture.supplyAsync(() -> {String userData = (String) inputs.get("userNode");String permsData = (String) inputs.get("permsNode");return userData + " (" + permsData + ")";});pipeline.addTask("userNode", fetchUser).addTask("permsNode", fetchPerms).addTask("combiner", combine);pipeline.connect("userNode", "combiner").connect("permsNode", "combiner");String result = (String) pipeline.run("user-1").join();System.out.println(result); // "User: user-1 (Role: admin)"
}

5. 清晰的运行契约

执行流水线很简单:pipeline.run(input)返回最终结果的CompletableFuture。您可以使用.join()阻塞或使用异步链式调用。

String input = "my-data";// 阻塞方式
try {String result = (String) pipeline.run(input).join();System.out.println("Result (blocking): " + result);
} catch (Exception e) {System.err.println("Pipeline failed: " + e.getMessage());
}// 非阻塞方式
pipeline.run(input).thenAccept(result -> System.out.println("Result (non-blocking): " + result)).exceptionally(ex -> {System.err.println("Async pipeline failed: " + ex.getMessage());return null;});

6. 内置资源生命周期

JGraphlet实现AutoCloseable。使用try-with-resources保证内部资源的安全关闭。

try (TaskPipeline pipeline = new TaskPipeline()) {pipeline.add("taskA", new SyncTask<String, String>() {@Overridepublic String executeSync(String input, PipelineContext context) {if (input == null) {throw new IllegalArgumentException("Input cannot be null");}return "Processed: " + input;}});pipeline.run("data").join();} // pipeline.shutdown()自动调用
System.out.println("Pipeline resources have been released.");

7. 上下文

PipelineContext是线程安全的、每次运行的工作空间,用于存储元数据。

SyncTask<String, String> taskA = (input, ctx) -> {ctx.put("requestID", "xyz-123");return input;
};
SyncTask<String, String> taskB = (input, ctx) -> {String reqId = ctx.get("requestID", String.class).orElse("unknown");return "Processed input " + input + " for request: " + reqId;
};

8. 可选缓存

任务可以选择加入缓存以避免重复计算。

Task<String, String> expensiveApiCall = new Task<>() {@Overridepublic CompletableFuture<String> execute(String input, PipelineContext context) {System.out.println("Performing expensive call for: " + input);return CompletableFuture.completedFuture("Data for " + input);}@Overridepublic boolean isCacheable() { return true; }
};try (TaskPipeline pipeline = new TaskPipeline()) {pipeline.add("expensive", expensiveApiCall);System.out.println("First call...");pipeline.run("same-key").join();System.out.println("Second call...");pipeline.run("same-key").join(); // 结果来自缓存
}

最终结果是提供了一种清晰、可测试的方式来编排同步或异步任务,用于组合复杂流程,如并行检索、合并、判断和防护栏,而无需引入重量级的工作流引擎。

了解更多或尝试使用:

  • Maven中央仓库
  • Github仓库
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    公众号二维码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两月九城,纷享销客渠道携手伙伴共创CRM新纪元

9月18日,SCEE 2025 中国软件渠道生态大会华南峰会在深圳成功举办。纷享销客作为中国 CRM 行业领导者再度登台,全国渠道运营负责人冯涛发表《智享未来,创领CRM新纪元》主题演讲,向华南区域伙伴全面传递纷享销客渠道…

el-upload上传图片

<el-upload上传图片1 官方文档文档2 说明这个组件提供了一种默认的上传模式,点击图片上传的时候就自动把图片发送到服务端,而不是在提交表单的时候上传。这钟模式不够灵活,也可以设置不自动上传到服务器,自己提…

wordpress 爱奇艺插件下载专业的网站优化公司

一、ADC简介 ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 STM32f103 系列有3个ADC&#xff0c;精度为12位&#xf…

东莞网站建设企业营销型网站建设哪家好

1、第一步肯定是要新建自己还原的目标数据库&#xff0c;例如&#xff1a; 2、进入postgresql的安装目录下的bin目录下 然后地址栏输入cmd进入命令 输入以下 psql -h localhost -U postgres -p 5432 -d SamsinoYardStandard_karamay -f "D:\desktop\zk\20230628.bak&quo…

做网站为什么要用php哈尔滨做设计和网站的公司吗

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路&#xff0c;接下来会继续讲统计基础以及在SAS软件内的应用&#xff0c;在这之前&#xff0c;本文先进行SAS基础使用编程的基础介绍&#xff0c;后续会主要阐述SAS软件内的统计数学的应用&#xff0c;如分析或初步建…

学校微网站模板下载建设网站优化

每天学习一个Linux命令之paste 介绍 在Linux系统中&#xff0c;有许多强大而实用的命令&#xff0c;它们可以帮助我们更高效地处理文本文件。其中一个有趣的命令就是paste。paste命令可以将多个文件的内容按列合并&#xff0c;并输出到标准输出或指定的文件中。 在本篇博客中…

建设网站群的指导思想龙岗爱联网站建设

导读&#xff1a; 前面章节&#xff0c;我们讲到过 接口&#xff08;Interface&#xff09;可以用于对「对象的形状&#xff08;Shape&#xff09;」进行描述。 本章节主要介绍接口的另一个用途&#xff0c;对类的一部分行为进行抽象。 类配合实现接口 实现&#xff08;impleme…

淘宝网站建设方式建网站企划书

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

上海骏域网站建设专家从化企业网站建设

俗话说“好记性不如烂笔头”&#xff0c;编程的海洋如此的浩大&#xff0c;养成做笔记的习惯是成功的一步&#xff01; 此笔记主要是antlr4.13版本的笔记&#xff0c;并且笔记都是博主自己一字一字编写和记录&#xff0c;有错误的地方欢迎大家指正。 一、基础概念&#xff1a;…

正能量网站入口地址网站建设属于哪个行业分类

PHP 循环 - While 循环循环执行代码块指定的次数&#xff0c;或者当指定的条件为真时循环执行代码块。PHP 循环在您编写代码时&#xff0c;您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。在 PHP 中&#xff0c;提供了下列循环语…

国外直播做游戏视频网站有哪些老实人做网站

React 开发问题积累1. 修改antd的组件样式2. antd级联选择框&#xff08;后台数据渲染&#xff09;1. 修改antd的组件样式 问题&#xff1a;直接修改样式好像不起作用&#xff0c;直接在组件上加style行内样式也不生效 方案&#xff1a;用 :global样式穿透 全局样式直接使用 …

贵州网站建设设计公司杭州网站优化平台

目录 keepalived概述 vrrp工作原理 keepalived体系主要的模块及其作用 模块 core模块 vrrp模块 check模块 作用 keepalived工作原理 keepalived和lvs-DR实验 keepalived概述 keepalived高可用应用&#xff08;健康检查&#xff0c;故障切换&#xff09; 节点服务器…

网站服务器错误403wordpress电影下载

我们首先来看一下数电模电在单片机中的应用。数电知识在单片机中主要解决各种数字信号的处理、运算&#xff0c;如数制转换、数据运算等。模电知识在单片机中主要解决各种模拟信号的处理问题&#xff0c;如采集光照强度、声音的分贝、温度等模拟信号。而数电、模电的相互转换就…

国内大中型网站建设知名公司网站开发课设心得

目录 原因分析一 原因分析二 原因分析三 第一次使用 MySQL Command Line Client 有可能输入密码后一按下回车键&#xff0c;程序窗口就自动关闭&#xff0c;出现闪退现象。本节主要分析产生闪退现象的原因以及如何处理这种情况。 原因分析一 首先可以查看程序默认执行文件…

网站优化外链个人网站需要什么页面

组合模式&#xff08;Composite&#xff09; 组合模式是一种结构型模式&#xff0c;它可以将对象组合成树状结构&#xff0c;用来区分部分和整体的层次机构&#xff0c;又叫部分整体模式 角色 组件&#xff1a;组合中所有对象的通用接口&#xff0c;可以是抽象类或者接口&…

C. Strange Function

https://codeforces.com/problemset/problem/1542/C 题意:给定数字n,对于所有i∈[1, n], 找出第一个不被n整除的正数,计算这些正数的和。 思路:如果i是x的第一个不能整除的正整数,那么i - 1, i - 2,...1都能被x整…

剑指offer-33、丑数

题⽬描述 把只包含质因⼦ 2 、 3 和 5 的数称作丑数( Ugly Number )。例如 6 、 8 都是丑数,但 14 不是,因为它包含质因⼦ 7 。 习惯上我们把 1 当做是第⼀个丑数。求按从⼩到⼤的顺序的第 N 个丑数。 如果 n = 9 …

C#操作Excel核心要点:告别手动,拥抱自动化

作为.NET开发者,我们经常会遇到需要与Excel文件打交道的场景:生成报表、批量处理数据、进行复杂的数据分析等。手动操作不仅效率低下,而且容易出错。掌握C#操作Excel的核心技能,能让我们从重复劳动中解放出来。 本…

250925

目录JT-JY4T4S1-1JT-JY4T4S1-2FT-(JY4T1S1&JY4T2S1&JY4T3S1&CD3s&VOAC3s) JT-JY4T4S1-1 JT-JY4T4S1-2 FT-(JY4T1S1&JY4T2S1&JY4T3S1&CD3s&VOAC3s)

云平台qcow2镜像的制作

云平台qcow2镜像的制作 一、基础准备 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)安装依赖包 yum groupinstall -y "Virtualization*" yum install -y libguestfs-tools-c.x86_64下载驱动…