当前位置: 首页 > 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.gsyq.cn/news/1604922.html

相关文章:

  • 万字干货|2026 Go 后端通关学习路线,从底层原理到微服务面试全覆盖(附 Code Review 规范 + 线上故障排查方案)
  • 论文阅读笔记 | Thinking in Frames: How Visual Context and Test-Time Scaling Empower Video Reasoning
  • 泛微ECOLOGY9流程主明细行弹窗添加子明细的实现
  • 解除labelstdio数据标注一次上传图片数量限制的方法
  • 如何用N_m3u8DL-RE轻松下载加密流媒体视频:从新手到高手的完整指南
  • TAS3202 DAP架构解析:从定点运算到音频处理实战
  • 终极方案:用xmly-downloader-qt5实现喜马拉雅VIP音频永久保存的完整指南
  • Linux 用户态内存分配:glibc malloc
  • WinUtil:Windows系统优化终极工具 - 一键完成软件安装、系统调优与故障修复
  • 14-already flash encrypt or secure boot提示:ESP32S3误烧熔丝的补救方法
  • 猫抓浏览器扩展:全网视频音频资源一键抓取的终极指南
  • 高颜值出差住地铁口可猫咪的酒店步行 3 分钟到地铁
  • volatile有什么用
  • 告别繁琐操作:原神脚本让你的提瓦特冒险更智能高效
  • PCB 新手 18 类常见错误汇总
  • EtherCAT重学之二: EtherCAT 系统硬件架构
  • 大湾区EMBA特色测评:科学选型理性指南
  • 【LeetCode】第1题 两数之和
  • CBDC安全架构:密码学签名与硬件防护核心技术解析
  • 【单片机毕业设计】基于 STM32 的多模式智能路灯控制系统设计, 基于单片机的光照自适应路灯亮度调节系统设计(014001)
  • 为什么顶尖AI团队拒绝“通用提示词”?——稀缺首发:金融/医疗/法律三大垂直领域217条经审计Prompt资产包(限时开放下载)
  • Java 多线程:继承 Thread 与实现 Runnable 两种创建方式完整对比
  • 自动定期备份服务器数据
  • python下载M3U8视频脚本
  • AI截图工具免费下载,基于DeepSeek的OCR截图软件支持Mac和Win
  • 【单片机毕业设计】基于 STM32 的超重声光报警电子秤设计与实现,基于 STM32 的阈值式重量监测报警系统设计(013701)
  • Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
  • ABB工业机器人编程基础(十三)功能程序(FUNC)
  • 第八、九次作业
  • 考四级的资料|过四级必备资料书|英语六级备考资料