xxl-job / xxl-job-executor-go

xxl-job 执行器(golang 客户端)
MIT License
431 stars 105 forks source link

不应该使用注册列表中的task作为运行列表的task #5

Closed yuenjee closed 3 years ago

yuenjee commented 3 years ago

问题描述: 当前实现机制,有一个新的任务请求过来,根据ExecutorHandler从注册列表获取task的指针,然后填充task的运行时参数,接着把task放入运行列表,并其一个协程运行task。存在的问题是,如果有两个或者多个相同的task,它们都是相同的ExecutorHandler(可以理解为task类型),在运行列表存的都是同一个task对象,那么task记录的是最后一个请求的参数。这样导致多任务运行结果错误。比如先运行同ExecutorHandler的A任务,然后运行同ExecutorHandler的B任务,现在要取消A任务,结果把B任务结束了。

解决办法: 从注册task中获取task后,复制一份task,作为运行的task对象。

yuenjee commented 3 years ago

建议代码修改如下: cxt := context.Background() *task := &((e.regList.Get(param.ExecutorHandler)))** if param.ExecutorTimeout > 0 {

rushuinet commented 3 years ago

覆盖之前调度 会取消之前的任务,单机串行,丢弃后续调度 都进行阻塞,任务不会调度成功,也就是说,同一个任务在一个节点上永远都是串行的,后面考虑ExecutorHandler和ExecutorParams做任务唯一标识,这样同一ExecutorHandler可以根据不同参数做成多个任务,目前看是非必要的。。可以征求大家的意见