我们正在编写.NET Cadence客户端,并且在单元测试工作流程时遇到问题。当我们启动工作程序,执行工作流程,停止工作程序,再次启动工作流程,然后尝试执行另一个工作流程时,第一个工作流程完成,但是第一个工作流程在client.ExecuteWorkflow()
调用期间挂起,最终失败START_TO_CLOSE
超时。我通过修改问候语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客户端的单元测试工作流程中注意到了此问题。当我们单独运行工作流测试时,它们全部通过,但是当我们一次运行多个(依次而不是并行)时,我们会看到上述行为。这是因为在测试完成(通过或失败)之后调用的.NET Cadence客户端dispose()
方法中进行的清理。处置行为之一是停止测试期间创建的工作人员。在下一次测试运行时,将使用相同的工作流服务客户端创建新工作线程,这就是问题所在。