0

我们正在编写一个 .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 客户端方法中进行了清理。处置行为之一是停止在测试期间创建的工人。当下一个测试运行时,使用相同的工作流服务客户端创建新的工作人员,这就是问题出现的地方。

4

0 回答 0