当前位置: 首页 > news >正文

go: Deadline Pattern

项目结构:

/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : logger.go */ package common import ( "fmt" "log" "os" "time" ) // 自定义Logger结构体,配套Info/Error方法 type Logger struct { name string logger *log.Logger } // 格式化时间:2006-01-02 15:04:05,000 func formatNow() string { return time.Now().Format("2006-01-02 15:04:05,000") } // GetLogger 获取模块日志实例 func GetLogger(name string) *Logger { return &Logger{ name: name, logger: log.New(os.Stdout, "", 0), } } func (l *Logger) Info(msg string) { t := formatNow() line := fmt.Sprintf("%s | INFO | %s | %s", t, l.name, msg) l.logger.Println(line) } func (l *Logger) Error(msg string) { t := formatNow() line := fmt.Sprintf("%s | ERROR | %s | %s", t, l.name, msg) l.logger.Println(line) } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:41 # User : geovindu # Product : GoLand # Project : godesginpattern # File : exception.go */ package common import "errors" var ServiceTimeoutErr = errors.New("任务超时,已终止等待") var ServiceInvokeErr = errors.New("服务调用异常") /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:55 # User : geovindu # Product : GoLand # Project : godesginpattern # File : deadlinebll.go */ package bll import ( "fmt" "godesginpattern/deadline/common" "godesginpattern/deadline/config" "godesginpattern/deadline/core" "godesginpattern/deadline/domain" "math/rand" "time" ) func DeadlineMain() { rand.Seed(time.Now().UnixNano()) fmt.Println("===== 展示【Deadline Pattern(截止期限模式)】示例 =====") logger := common.GetLogger("DeadlineBll") logger.Info("=== 珠宝定制系统启动 ===") orderID := fmt.Sprintf("%s_%d", config.OrderIDPrefix, rand.Intn(9000)+1000) order := &domain.JewelryOrder{OrderID: orderID} logger.Info(fmt.Sprintf("订单创建:%+v", order)) manager := core.NewJewelryWorkflowManager() final := manager.Run(order) logger.Info("============================================================") logger.Info(fmt.Sprintf("最终订单状态:%+v", final)) logger.Info("=== 系统运行完成 ===") } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:42 # User : geovindu # Product : GoLand # Project : godesginpattern # File : deadline.go */ package common import ( "time" ) type DeadlineExecutor[T any] struct { Timeout time.Duration } func NewDeadlineExecutor[T any](timeoutSec int) *DeadlineExecutor[T] { return &DeadlineExecutor[T]{Timeout: time.Duration(timeoutSec) * time.Second} } func (d *DeadlineExecutor[T]) Execute(fn func() T) (T, error) { ch := make(chan T, 1) go func() { ch <- fn() }() select { case res := <-ch: return res, nil case <-time.After(d.Timeout): var zero T return zero, ServiceTimeoutErr } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:42 # User : geovindu # Product : GoLand # Project : godesginpattern # File : config.go */ package config const ( GemIdentifyTimeoutSeconds = 3 OrderIDPrefix = "JEWELRY_ORDER" ) /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:42 # User : geovindu # Product : GoLand # Project : godesginpattern # File : models.go */ package domain type GemIdentifyResult struct { GemType string Carat float64 Color string Clarity string IdentifyNo string } type JewelryOrder struct { OrderID string IdentifyResult *GemIdentifyResult MaterialApproved bool ProduceFinished bool QualityPassed bool Delivered bool }
/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:43 # User : geovindu # Product : GoLand # Project : godesginpattern # File : gem_identify.go */ package external import ( "fmt" "godesginpattern/deadline/common" "godesginpattern/deadline/domain" "math/rand" "time" ) type GemIdentifyService struct{} func NewGemIdentifyService() *GemIdentifyService { return &GemIdentifyService{} } func (g *GemIdentifyService) Identify() *domain.GemIdentifyResult { log := common.GetLogger("GemIdentifyService") log.Info("开始调用第三方宝石鉴定服务...") // 50%快速 1s,50%阻塞10s触发超时 delay := 1 if rand.Float64() < 0.5 { delay = 10 } time.Sleep(time.Duration(delay) * time.Second) identifyNo := "GEM_" + randStr(6) res := &domain.GemIdentifyResult{ GemType: "钻石", Carat: 1.0, Color: "D", Clarity: "VVS1", IdentifyNo: identifyNo, } log.Info(fmt.Sprintf("鉴定完成:%+v", res)) return res } func randStr(n int) string { letters := []rune("0123456789") b := make([]rune, n) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:43 # User : geovindu # Product : GoLand # Project : godesginpattern # File : material.go */ package internal type MaterialService struct{} func NewMaterialService() *MaterialService { return &MaterialService{} } func (m *MaterialService) Approve() bool { return true } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:45 # User : geovindu # Product : GoLand # Project : godesginpattern # File : produce.go */ package internal type ProduceService struct{} func NewProduceService() *ProduceService { return &ProduceService{} } func (p *ProduceService) Produce() bool { return true } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:45 # User : geovindu # Product : GoLand # Project : godesginpattern # File : quality.go */ package internal type QualityService struct{} func NewQualityService() *QualityService { return &QualityService{} } func (q *QualityService) Check() bool { return true } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:46 # User : geovindu # Product : GoLand # Project : godesginpattern # File : deliver.go */ package internal type DeliverService struct{} func NewDeliverService() *DeliverService { return &DeliverService{} } func (d *DeliverService) Deliver() bool { return true } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 22:08 # User : geovindu # Product : GoLand # Project : godesginpattern # File : facade.go */ package service import ( "godesginpattern/deadline/service/internal" ) // 对外导出服务实例,core只能导入service,不能碰internal 门面层(统一暴露内部服务) type ServiceFacade struct { Material *internal.MaterialService Produce *internal.ProduceService Quality *internal.QualityService Deliver *internal.DeliverService } func NewServiceFacade() *ServiceFacade { return &ServiceFacade{ Material: internal.NewMaterialService(), Produce: internal.NewProduceService(), Quality: internal.NewQualityService(), Deliver: internal.NewDeliverService(), } } /* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:46 # User : geovindu # Product : GoLand # Project : godesginpattern # File : workflow_manager.go */ package core import ( "godesginpattern/deadline/common" "godesginpattern/deadline/config" "godesginpattern/deadline/domain" "godesginpattern/deadline/service" "godesginpattern/deadline/service/external" ) type JewelryWorkflowManager struct { identify *external.GemIdentifyService facade *service.ServiceFacade // 使用门面层 logger *common.Logger } func NewJewelryWorkflowManager() *JewelryWorkflowManager { return &JewelryWorkflowManager{ identify: external.NewGemIdentifyService(), facade: service.NewServiceFacade(), logger: common.GetLogger("WorkflowManager"), } } func (j *JewelryWorkflowManager) Run(order *domain.JewelryOrder) *domain.JewelryOrder { j.logger.Info("开始执行订单全流程:" + order.OrderID) executor := common.NewDeadlineExecutor[*domain.GemIdentifyResult](config.GemIdentifyTimeoutSeconds) res, err := executor.Execute(j.identify.Identify) if err != nil { deadlineLog := common.GetLogger("DeadlinePattern") deadlineLog.Error("任务超时,已终止等待,超时=3s") j.logger.Error("鉴定超时,启动人工复核兜底流程") } else { order.IdentifyResult = res } mLog := common.GetLogger("MaterialService") mLog.Info("原料采购审核中...") order.MaterialApproved = j.facade.Material.Approve() pLog := common.GetLogger("ProduceService") pLog.Info("工厂加工生产完成") order.ProduceFinished = j.facade.Produce.Produce() qLog := common.GetLogger("QualityService") qLog.Info("成品质检合格") order.QualityPassed = j.facade.Quality.Check() dLog := common.GetLogger("DeliverService") dLog.Info("订单已交付") order.Delivered = j.facade.Deliver.Deliver() j.logger.Info("订单全流程执行完成:" + order.OrderID) return order } /* workflow_manager.go 放在Server包时用。 type JewelryWorkflowManager struct { identify *external.GemIdentifyService material *internal.MaterialService produce *internal.ProduceService quality *internal.QualityService deliver *internal.DeliverService logger *common.Logger // 现在 common.Logger 已定义,编译正常 } func NewJewelryWorkflowManager() *JewelryWorkflowManager { return &JewelryWorkflowManager{ identify: external.NewGemIdentifyService(), material: internal.NewMaterialService(), produce: internal.NewProduceService(), quality: internal.NewQualityService(), deliver: internal.NewDeliverService(), logger: common.GetLogger("WorkflowManager"), } } func (j *JewelryWorkflowManager) Run(order *domain.JewelryOrder) *domain.JewelryOrder { j.logger.Info("开始执行订单全流程:" + order.OrderID) executor := common.NewDeadlineExecutor[*domain.GemIdentifyResult](config.GemIdentifyTimeoutSeconds) res, err := executor.Execute(j.identify.Identify) if err != nil { // 独立DeadlinePattern日志输出超时ERROR deadlineLog := common.GetLogger("DeadlinePattern") deadlineLog.Error("任务超时,已终止等待,超时=3s") j.logger.Error("鉴定超时,启动人工复核兜底流程") } else { order.IdentifyResult = res } // 各内部服务单独打印日志 mLog := common.GetLogger("MaterialService") mLog.Info("原料采购审核中...") order.MaterialApproved = j.material.Approve() pLog := common.GetLogger("ProduceService") pLog.Info("工厂加工生产完成") order.ProduceFinished = j.produce.Produce() qLog := common.GetLogger("QualityService") qLog.Info("成品质检合格") order.QualityPassed = j.quality.Check() dLog := common.GetLogger("DeliverService") dLog.Info("订单已交付") order.Delivered = j.deliver.Deliver() j.logger.Info("订单全流程执行完成:" + order.OrderID) return order } */

调用:

/* # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Deadline Pattern 截止期限模式 # Author : geovindu,Geovin Du 涂聚文. # IDE : goLang 2024.3.6 go 26.2 # os : windows 10 # database : mysql 9.0 sql server 2019, postgreSQL 17.0 Oracle 21c Neo4j # Datetime : 2026/6/29 21:55 # User : geovindu # Product : GoLand # Project : godesginpattern # File : deadlinebll.go */ package bll import ( "fmt" "godesginpattern/deadline/common" "godesginpattern/deadline/config" "godesginpattern/deadline/core" "godesginpattern/deadline/domain" "math/rand" "time" ) func DeadlineMain() { rand.Seed(time.Now().UnixNano()) fmt.Println("===== 展示【Deadline Pattern(截止期限模式)】示例 =====") logger := common.GetLogger("DeadlineBll") logger.Info("=== 珠宝定制系统启动 ===") orderID := fmt.Sprintf("%s_%d", config.OrderIDPrefix, rand.Intn(9000)+1000) order := &domain.JewelryOrder{OrderID: orderID} logger.Info(fmt.Sprintf("订单创建:%+v", order)) manager := core.NewJewelryWorkflowManager() final := manager.Run(order) logger.Info("============================================================") logger.Info(fmt.Sprintf("最终订单状态:%+v", final)) logger.Info("=== 系统运行完成 ===") }

输出:

http://www.jsqmd.com/news/1092965/

相关文章:

  • HarmonyOS 实战|中式美食食材大全页:分类联动、网格稳定高度与食材检索入口设计
  • 清宫后多久出门不怕风?分阶段防风与科学修护指
  • 论文阅读笔记 | Thinking in Frames: How Visual Context and Test-Time Scaling Empower Video Reasoning
  • Upstage AI发现了生物医学大模型最隐蔽的致命缺陷
  • 万字干货|2026 Go 后端通关学习路线,从底层原理到微服务面试全覆盖(附 Code Review 规范 + 线上故障排查方案)
  • 泛微ECOLOGY9流程主明细行弹窗添加子明细的实现
  • 解除labelstdio数据标注一次上传图片数量限制的方法
  • TAS2564评估板实战:从数字功放原理到立体声系统集成
  • 一人创业时,内容、开发、客户跟进分别适合用哪些AI工具辅助
  • AI赋能UI自动化测试:从智能自愈到自主测试的演进之路
  • 用SpringBoot构建RESTfulAPI的最佳实践
  • 如何用N_m3u8DL-RE轻松下载加密流媒体视频:从新手到高手的完整指南
  • 翻译公司日语翻译Top8榜单发布:日语翻译合作稳定
  • minimax token plan 9折邀请码
  • TAS3202 DAP架构解析:从定点运算到音频处理实战
  • 终极方案:用xmly-downloader-qt5实现喜马拉雅VIP音频永久保存的完整指南
  • 6级英语资料|六级英语考试资料|大学英语6级备考资料
  • 鸿蒙六大防诈能力逐个拆——从电话到APP把诈骗全拦住
  • Simulink BLDC速度控制仿真精解——从官方例程到模型调优实战
  • WinUtil:Windows系统优化终极工具 - 一键完成软件安装、系统调优与故障修复
  • Linux 用户态内存分配:glibc malloc
  • echarts打印
  • 哪个 AI 可以生成 Word 文档:写作模型、Markdown 转换和导出工具对比
  • Python命令行参数解析argparse实战:从入门到精通
  • 没策略的画册,再好看也白做_长沙画册设计
  • 14-already flash encrypt or secure boot提示:ESP32S3误烧熔丝的补救方法
  • 猫抓浏览器扩展:全网视频音频资源一键抓取的终极指南
  • 2026年6月29日
  • volatile有什么用
  • 高颜值出差住地铁口可猫咪的酒店步行 3 分钟到地铁