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

上海网站排名优化价格番禺市桥网站建设公司

上海网站排名优化价格,番禺市桥网站建设公司,网站h1标签怎么做,wordpress本地化采用方法某个项目里有一段老代码写的不是很好,想着能否通过自己掌握的知识,将其改善一下。感兴趣的小伙伴可以通过了解背景和需求,自己试想下该如何实现,如果有更好的方案也欢迎留言讨论。 1. 背景及需求 (1) 背景 假设我们的下游提供了…

某个项目里有一段老代码写的不是很好,想着能否通过自己掌握的知识,将其改善一下。感兴趣的小伙伴可以通过了解背景和需求,自己试想下该如何实现,如果有更好的方案也欢迎留言讨论。

1. 背景及需求

(1) 背景

假设我们的下游提供了一个定时任务接口CronJob(cron string, fun func()),它的入参有两个,分别是定时任务执行的频率,以及具体执行哪个函数。我们要借助该定时任务接口实现一个功能:对数据库中同一张表的所有数据的两个不同的字段完成赋值。为了给每个字段赋值,会分别设置两个定时任务,一个是正常的任务处理,5分钟执行一次,负责捞取最近30分钟的数据并完成赋值。另一个是补偿的任务处理,1小时执行一次,负责捞取最近24小时的数据并完成赋值。

(2) 需求

代码的实现要满足以下要求:

  • 因为都是捞取同一张表的数据并完成赋值,所以该部分代码应该复用同一份代码,防止出错;
  • 后续可能有新增字段需要类似的赋值逻辑,所以代码应该有良好的可扩展性;
  • 由于只有字段赋值逻辑不同,所以每次新增字段赋值需求时,代码的改动应该尽可能小。

2. 需求分析及实现

(1) 定时任务代码

由于我们依赖下游的定时任务接口,所以首先给出模拟的定时任务接口。

// CronJob 模拟定时任务,参数分别为调度时间和调度内容
func CronJob(cron string, fun func()) {fmt.Println("调度时间: ", cron)fmt.Println("定时任务执行开始。。。")fun()fmt.Println("定时任务执行结束。。。\n\n")
}

(2) 定义接口

我们需要实现的是对字段的赋值方法,由于同一字段的赋值,分为了正常的任务处理和补偿的任务处理两个,所以我们可以定义两个接口方法CommonFix

// ProcessJob 处理任务接口,定义了两个方法
type ProcessJob interface {Common(name string) func() // 正常的任务处理Fix(name string) func()    // 补偿的任务处理
}

(3) 接口的实现类

定义了接口后,接口的实现类应该分别实现上述两个方法,完成两个字段的赋值逻辑。而从数据库捞取数据的部分显然是通用的,该部分可以独立成为一个函数,该函数可以捞取数据,并将数据的主键id传参给实现类的两个方法,完成该条数据的赋值。

1) 通用部分

正常和补偿任务处理中通用的部分:

// Common 正常的任务处理中通用的部分
func Common(name string, fun func(params string)) func() {id := "$模拟id$"return func() {fmt.Println("任务名称为:", name)fmt.Println("正常任务处理的前置操作。。。")fun(id)fmt.Println("正常任务处理的后置操作。。。")}
}// Fix 补偿的任务处理中通用的部分
func Fix(name string, fun func(params string)) func() {id := "$模拟id$"return func() {fmt.Println("任务名称为:", name)fmt.Println("补偿任务处理的前置操作。。。")fun(id)fmt.Println("补偿任务处理的后置操作。。。")}
}

注意下通用方法的入参,这里分别用来接收实现类方法传入的参数,以及字段赋值逻辑的函数。

2) 第一个接口实现类

第一个处理任务,为第一个字段赋值:

// ProcessJob1 第一个处理任务,为第一个字段赋值
type ProcessJob1 struct{}// Common 第一个处理任务的正常任务处理
func (pj ProcessJob1) Common(name string) func() {return Common(name, func(id string) {fmt.Printf("常规任务处理中,为id为 %v 的第一个字段进行赋值", id)})
}// Fix 第一个处理任务的补偿任务处理
func (pj ProcessJob1) Fix(name string) func() {return Fix(name, func(id string) {fmt.Printf("补偿任务处理中,为id为 %v 的第一个字段进行赋值", id)})
}

这里需要注意下,由于定时任务接口只接受类型为func()的函数,所以接口实现类的CommonFix方法的返回值都是func()类型。而字段赋值逻辑函数的入参为从通用函数那传入的参数,即数据的主键id。

3) 第二个接口实现类

第二个处理任务,为第二个字段赋值:

// ProcessJob2 第二个处理任务,为第二个字段赋值
type ProcessJob2 struct{}// Common 第二个处理任务的正常任务处理
func (pj ProcessJob2) Common(name string) func() {return Common(name, func(id string) {fmt.Printf("常规任务处理中,为id为 %v 的第二个字段进行赋值", id)})
}// Fix 第二个处理任务的补偿任务处理
func (pj ProcessJob2) Fix(name string) func() {return Fix(name, func(id string) {fmt.Printf("补偿任务处理中,为id为 %v 的第二个字段进行赋值", id)})
}

(4) 实现类再封装

由于ProcessJob1和ProcessJob2都可以看做是ProcessJob类型,所以可以为实现类再封装一层,以便统一进行处理。通过分析需求可以知道,实现类的属性可以有任务名称、正常任务处理的调度时间、补偿任务处理的调度时间等组成,所以可以定义以下类型:

// JobConf 定时任务配置
type JobConf struct {Name       string     // 定时任务的名称CommonCron string     // 正常任务处理的调度时间FixCron    string     // 补偿任务处理的调度时间ProcessJob ProcessJob // 处理任务对象
}

(5) 添加/获取任务配置

定义了统一的类型之后,就可以创建一个该类型的列表,如果有新增的字段赋值需求,那么就可以很方便的进行扩展了,只需要在列表中新增一个任务配置即可。

// GetJobConfMap 获取所有的任务配置信息
func GetJobConfMap() map[string]JobConf {// 定义一个任务配置的列表,如有新增的任务,直接append一个新任务即可jobConfList := make([]JobConf, 0)jobConfList = append(jobConfList, JobConf{Name:       "job1",CommonCron: "1 * * * * *",FixCron:    "11 * * * * *",ProcessJob: ProcessJob1{},})jobConfList = append(jobConfList, JobConf{Name:       "job2",CommonCron: "2 * * * * *",FixCron:    "22 * * * * *",ProcessJob: ProcessJob2{},})// 获取任务名到任务配置的mapjobConfMap := make(map[string]JobConf)for _, jobConf := range jobConfList {jobConfMap[jobConf.Name] = jobConf}return jobConfMap
}

(6) 主函数

最后就是根据每个任务的配置,启动对应的定时任务了。

func main() {// 获取所有的任务配置信息jobConfMap := GetJobConfMap()// 为每个任务独立设置调度时间,以及处理内容for jobName, jobConf := range jobConfMap {processJob := jobConf.ProcessJobCronJob(jobConf.CommonCron, processJob.Common(jobName))CronJob(jobConf.FixCron, processJob.Fix(jobName))}
}

3. 完整代码

package mainimport ("fmt"
)// CronJob 模拟定时任务,参数分别为调度时间和调度内容
func CronJob(cron string, fun func()) {fmt.Println("调度时间: ", cron)fmt.Println("定时任务执行开始。。。")fun()fmt.Println("定时任务执行结束。。。\n\n")
}// ProcessJob 处理任务接口,定义了两个方法
type ProcessJob interface {Common(name string) func() // 正常的任务处理Fix(name string) func()    // 补偿的任务处理
}// Common 正常的任务处理中通用的部分
func Common(name string, fun func(params string)) func() {id := "$模拟id$"return func() {fmt.Println("任务名称为:", name)fmt.Println("正常任务处理的前置操作。。。")fun(id)fmt.Println("正常任务处理的后置操作。。。")}
}// Fix 补偿的任务处理中通用的部分
func Fix(name string, fun func(params string)) func() {id := "$模拟id$"return func() {fmt.Println("任务名称为:", name)fmt.Println("补偿任务处理的前置操作。。。")fun(id)fmt.Println("补偿任务处理的后置操作。。。")}
}// JobConf 定时任务配置
type JobConf struct {Name       string     // 定时任务的名称CommonCron string     // 正常任务处理的调度时间FixCron    string     // 补偿任务处理的调度时间ProcessJob ProcessJob // 处理任务对象
}// ProcessJob1 第一个处理任务,为第一个字段赋值
type ProcessJob1 struct{}// Common 第一个处理任务的正常任务处理
func (pj ProcessJob1) Common(name string) func() {return Common(name, func(id string) {fmt.Printf("常规任务处理中,为id为 %v 的第一个字段进行赋值", id)})
}// Fix 第一个处理任务的补偿任务处理
func (pj ProcessJob1) Fix(name string) func() {return Fix(name, func(id string) {fmt.Printf("补偿任务处理中,为id为 %v 的第一个字段进行赋值", id)})
}// ProcessJob2 第二个处理任务,为第二个字段赋值
type ProcessJob2 struct{}// Common 第二个处理任务的正常任务处理
func (pj ProcessJob2) Common(name string) func() {return Common(name, func(id string) {fmt.Printf("常规任务处理中,为id为 %v 的第二个字段进行赋值", id)})
}// Fix 第二个处理任务的补偿任务处理
func (pj ProcessJob2) Fix(name string) func() {return Fix(name, func(id string) {fmt.Printf("补偿任务处理中,为id为 %v 的第二个字段进行赋值", id)})
}// GetJobConfMap 获取所有的任务配置信息
func GetJobConfMap() map[string]JobConf {// 定义一个任务配置的列表,如有新增的任务,直接append一个新任务即可jobConfList := make([]JobConf, 0)jobConfList = append(jobConfList, JobConf{Name:       "job1",CommonCron: "1 * * * * *",FixCron:    "11 * * * * *",ProcessJob: ProcessJob1{},})jobConfList = append(jobConfList, JobConf{Name:       "job2",CommonCron: "2 * * * * *",FixCron:    "22 * * * * *",ProcessJob: ProcessJob2{},})// 获取任务名到任务配置的mapjobConfMap := make(map[string]JobConf)for _, jobConf := range jobConfList {jobConfMap[jobConf.Name] = jobConf}return jobConfMap
}func main() {// 获取所有的任务配置信息jobConfMap := GetJobConfMap()// 为每个任务独立设置调度时间,以及处理内容for jobName, jobConf := range jobConfMap {processJob := jobConf.ProcessJobCronJob(jobConf.CommonCron, processJob.Common(jobName))CronJob(jobConf.FixCron, processJob.Fix(jobName))}
}
http://www.yayakq.cn/news/402097/

相关文章:

  • 网站前台页面的设计与实现笨鸟网站开发
  • 网站设计专题页wap 企业网站
  • 淄博网站运营公司三好街做网站公司
  • 建设人才库网站中国建设报电子版在线阅读
  • 网站建设与运营推广的回报材料移动网站虚拟主机
  • 做竞猜网站犯法吗任县网站建设多少钱
  • 网站开发需要用哪些东西近期新闻消息
  • 杭州建站模板建公司网站一般多少钱
  • 医院网站需要前置审批网站制作 台州
  • 网站服务是什么高级采矿平台建立在小行星带
  • 秦皇岛网站制作定制网站做软件有哪些内容
  • 为古汉字老人做网站珠宝 东莞网站建设
  • 福田网站建设seo信科微信网站制作软件有哪些
  • 如何做网站开屏php的网站模板下载
  • 网站网站怎么定位线上培训机构排名前十
  • 北京展示型网站哪里有网站建设手机
  • 做的公司网站怎么没了网站可以做信息抓取吗
  • 三只松鼠品牌案例分析温州 网站优化
  • 电子商务网站建设主题化工网站关键词优化
  • 外贸公司域名哪个网站申请比较好网站安全建设
  • it初学者做网站北京海淀建设中路哪打疫苗
  • 海南省建设培训网站报名管理类网站开发价格
  • 会展网站的建设情况网站做微信支付接口
  • 模板建站是什么wordpress f4v
  • 哪些网站做婚纱摄影网页设计排版布局
  • 华为云建站和阿里云建站区别做家教在哪个网站
  • 集团网站建设新闻赣县企业网站建设
  • 织梦网站首页目录在哪里合肥飞墨设计
  • 移动端手机网站模板下载做图的软件网站
  • 网站修改关键字知名互联网公司有哪些