本文介紹了管道設計模式在業務流程編排中的應用。
流水線模式是指流水線模式,也稱為流水線模式。 傳入的資料被設計為通過一系列預定義的階段進行處理,每個階段的輸出是下一階段的輸入。
在此示例中,通過定義 pipelineproduct、pipelinejob 和 pipelinenode,完成整條流水線的組裝,並將“原材料”加工成“商品”。 其中,流水線產品負責承載各階段的產品資訊;流水線任務負責產品在不同階段的處理;流水線節點約束流水線產品與任務的關係,通過訊號量定義任務的執行模式。
工具依賴關係如下。
cn.hutool hutool-all 最新版本
package com.example.demo.pipeline.model;** 流水線產品介面 * 引數訊號量 * 作者 * 日期 2023 05 15 11:49 * 公共介面 PipelineProduct {}
package com.example.demo.pipeline.model;** 流水線任務介面 * param 流水線產品 * 作者 * 日期 2023 05 15 11:52 * @functionalinterfacepublic 介面 流水線作業 * p 執行(p product);}
package com.jd.baoxian.mall.market.service.pipeline.model;import j**a.util.function.predicate;** 流水線節點定義 * 引數訊號量 * 引數流水線產品 * 作者 * 日期 2023 05 15 11:54 * 公共介面 pipelinenode>package comexample.demo.api;import com.example.demo.model.request.demoreq;import com.example.demo.model.response.demoresp;import com.example.demo.pipeline.factory.pipelineformanagersubmit;import org.springframework.stereotype.service;import j**ax.annotation.resource;** demo-api * 作者 * 日期 2023 08 06 16:27 * @servicepublic 類 demoManagerAPI * public demoresp managersubmit(demoreq requestdata) }package comexample.demo.model.request;** Demo 輸入引數 * 作者 * 日期 2023 08 06 16:33 * public class demoreq {}package com.example.demo.model.response;import lombok.data;** 演示引數 * 作者 * 日期 2023 08 06 16:33 * @datapublic 類 demoresp * public static demoresp buildres(string message) }假設審核提交的過程需要包括:引數驗證、鎖定、解鎖和事務提交。
package com.example.demo.pipeline.factory.job;import cn.hutool.json.jsonutil;import com.example.demo.model.request.demoreq;import com.example.demo.pipeline.factory.demopipelineproduct;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.service;** 鎖實現層 * 作者 * 日期 2023 05 17 17:00 * @service@slf4jpublic 類 checkrequestlockjob extends abstractdemojob ] lock,執行緒號:{}", jsonutil.tojsonstr(userrequestdata), tradeid); return demopipelineproduct.demosignalenum.normal; }package com.example.demo.pipeline.factory.job;import cn.hutool.json.jsonutil;import com.example.demo.model.request.demoreq;import com.example.demo.pipeline.factory.demopipelineproduct;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.service;** Unlock-Implementation-Layer * 作者 * 日期 2023 05 17 17:00 * @service@slf4jpublic 類 checkRequestUnlockJob extends abstractdemojob ] unlocked,執行緒號:{}", jsonutil.tojsonstr(userrequestdata), tradeid); return demopipelineproduct.demosignalenum.normal; }package com.example.demo.pipeline.factory.job;import cn.hutool.json.jsonutil;import com.example.demo.model.request.demoreq;import com.example.demo.pipeline.factory.demopipelineproduct;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.component;** Audit-Parameter Validation-Implementation 類 * 作者 * 日期 2023 05 15 19:50 * @slf4j@componentpublic 類 managerCheckParamJob extends abstractdemojob ]輸入引數校驗,執行緒號:{}", jsonutil.tojsonstr(userrequestdata), tradeid);非空驗證 有效驗證 驗證通過,返回 demopipelineproductdemosignalenum.normal; }package com.example.demo.pipeline.factory.job;import cn.hutool.json.jsonutil;import com.example.demo.model.request.demoreq;import com.example.demo.model.response.demoresp;import com.example.demo.pipeline.factory.demopipelineproduct;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.service;** 審核 - 資訊提交 - 業務實施 * 作者 * 日期 2023 05 12 14:36 * @service@slf4jpublic 類 ManagerSubmitJob 擴充套件 AbstractDemojob ]資訊提交,執行緒號:{}", jsonutil.tojsonstr(userrequestdata), tradeid); productdata.setuserresponsedata(demoresp.buildres("成功"));catch (exception ex) ", jsonutil.tojsonstr(userrequestdata), ex); throw ex; }return demopipelineproduct.demosignalenum.normal; }對於輸入和返回引數的轉換,構造了流水線任務執行序列和執行訊號量。
package com.example.demo.pipeline.factory;import com.example.demo.model.request.demoreq;import com.example.demo.model.response.demoresp;import com.example.demo.pipeline.factory.job.checkrequestlockjob;import com.example.demo.pipeline.factory.job.checkrequestunlockjob;import com.example.demo.pipeline.factory.job.managercheckparamjob;import com.example.demo.pipeline.factory.job.managersubmitjob;import lombok.requiredargsconstructor;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.service;import j**ax.annotation.postconstruct;import j**a.util.objects;import j**a.util.uuid;** 流水線工廠入口 - 審核流水線 * 作者 * 日期 2023 05 15 19:52 * @slf4j@service@requiredargsconstructorpublic 類 PipelineForManagerSubmit ** 組裝工藝鏈 * private void AssemblyManagerSubmit() ** 審核 - 提交處理 * param requestdata 輸入引數 * return * public demoresp managersubmitcheck(demoreq requestdata) return finalproductgetproductdata().getuserresponsedata();** 複習 - 初始化請求的流水線資料 * param requestdata 輸入引數 * 返回初始流水線資料 * private demopipeline產品經理 submitCheckInitial(Demoreq requestdata) }本文重點介紹流水線模式的抽象和應用,以上示例僅供個人理解。 在實踐中,這種情況比用冗餘規則處理各種業務場景要好,也便於規則編排。
需要改進的要點:每個任務實際上都隱含著執行的順序,可以進一步實現
對於“流水線組裝”的最後一步,可以通過配置描述來進一步抽象,這樣就可以對每個“流水線任務”的描述進行控制,規則項可以“可插拔”。
作者:京東保險 侯亞東 **轉載請註明**。