我们正在编写一个 .NET Cadence 客户端,在单元测试工作流时遇到了问题。当我们启动一个工作流程,执行一个工作流程,停止工作流程,再次启动它,然后尝试执行另一个工作流程时,第一个工作流程完成,但第一个工作流程之后的任何工作流程在调用期间挂起,最终因超时client.ExecuteWorkflow()
而失败。START_TO_CLOSE
我通过修改 greetings cadence-samples工作流程来复制这种行为。请参阅中的循环func main()
:
package main
import (
"context"
"time"
"go.uber.org/cadence/client"
"go.uber.org/cadence/worker"
"go.uber.org/zap"
"github.com/pborman/uuid"
"github.com/samarabbas/cadence-samples/cmd/samples/common"
)
// This needs to be done as part of a bootstrap step when the process starts.
// The workers are supposed to be long running.
func startWorkers(h *common.SampleHelper) worker.Worker {
// Configure worker options.
workerOptions := worker.Options{
MetricsScope: h.Scope,
Logger: h.Logger,
}
return h.StartWorkers(h.Config.DomainName, ApplicationName, workerOptions)
}
func startWorkflow(h *common.SampleHelper) client.WorkflowRun {
workflowOptions := client.StartWorkflowOptions{
ID: "greetings_" + uuid.New(),
TaskList: ApplicationName,
ExecutionStartToCloseTimeout: time.Minute,
DecisionTaskStartToCloseTimeout: time.Minute,
}
return h.StartWorkflow(workflowOptions, SampleGreetingsWorkflow)
}
func main() {
// setup the SampleHelper
var h common.SampleHelper
h.SetupServiceConfig()
// Loop:
// - start a worker
// - start a workflow
// - block and wait for workflow result
// - stop the worker
for i := 0; i < 3; i++ {
// start the worker
// execute the workflow
workflowWorker := startWorkers(&h)
workflowRun := startWorkflow(&h)
// create context
// get workflow result
var result string
ctx, cancel := context.WithCancel(context.Background())
err := workflowRun.Get(ctx, &result)
if err != nil {
panic(err)
}
// log the result
h.Logger.Info("Workflow Completed", zap.String("Result", result))
// stop the worker
// cancel the context
workflowWorker.Stop()
cancel()
}
}
这不是阻塞问题,可能不会在生产中出现。
背景:
我们(Jeff Lill和我)在 .NET Cadence 客户端的单元测试工作流程中注意到了这个问题。当我们单独运行我们的工作流测试时,它们都通过了,但是当我们一次运行多个(顺序地,而不是并行地)时,我们会看到上述行为。dispose()
这是因为在测试完成(通过或失败)后调用的 .NET Cadence 客户端方法中进行了清理。处置行为之一是停止在测试期间创建的工人。当下一个测试运行时,使用相同的工作流服务客户端创建新的工作人员,这就是问题出现的地方。