gocadence-workflowuber-cadence

Unable to run Cadence Workflow from GoLang


I am pretty new to cadence and was trying to implement hello world but getting below error

2023-10-05T10:30:50.695+0530    INFO    internal/internal_worker.go:834 Started Workflow Worker {"Domain": "test-domain", "TaskList": "cadence-samples-worker", "WorkerID": "74592@BLRETV-C02GL33D.local@cadence-samples-worker@256dcb1f-1769-4183-9604-174160f79e7a"}
2023-10-05T10:30:50.724+0530    INFO    internal/internal_worker.go:859 Started Activity Worker {"Domain": "test-domain", "TaskList": "cadence-samples-worker", "WorkerID": "74592@BLRETV-C02GL33D.local@cadence-samples-worker@256dcb1f-1769-4183-9604-174160f79e7a"}
2023-10-05T10:30:50.724+0530    INFO    cadence-test/worker.go:49       Started Worker. {"worker": "cadence-samples-worker"}
2023-10-05T10:30:50.724+0530    ERROR   cadence-test/trigger.go:32      Failed to create workflow       {"error": "BadRequestError{Message: missing TTL}"}

Below is my code in Go

func startWorkflow() {
    // This workflow ID can be user business logic identifier as well.
    workflowID := "cron_" + uuid.New().String()
    startTime := int32(60)
    domainName := "test-domain"

    logger, workflowClient := BuildLogger(), BuildCadenceClient()

    startRequest := shared.StartWorkflowExecutionRequest{
        WorkflowId: &workflowID,
        Domain:     &domainName,
        TaskList: &shared.TaskList{
            Name: &domainName,
        },
        ExecutionStartToCloseTimeoutSeconds: &startTime,
        TaskStartToCloseTimeoutSeconds:      &startTime,
        //DecisionTaskStartToCloseTimeout: time.Minute,

    }

    we, err := workflowClient.StartWorkflowExecution(context.Background(), &startRequest)
    if err != nil {
        logger.Error("Failed to create workflow", zap.Error(err))
        panic("Failed to create workflow.")
    } else {
        logger.Info("Started Workflow", zap.String("WorkflowID", *we.RunId), zap.String("RunID", *we.RunId))
    }
}

These are the dependencies in my go.mod

module cadence-test

go 1.21

require (
    github.com/google/uuid v1.3.0
    github.com/uber-go/tally v3.3.15+incompatible
    github.com/uber/cadence-idl v0.0.0-20230905165949-03586319b849
    go.uber.org/cadence v1.0.2
    go.uber.org/yarpc v1.70.4
    go.uber.org/zap v1.13.0
)

require (
    github.com/BurntSushi/toml v0.4.1 // indirect
    github.com/apache/thrift v0.16.0 // indirect
    github.com/beorn7/perks v1.0.1 // indirect
    github.com/cespare/xxhash/v2 v2.1.1 // indirect
    github.com/cristalhq/jwt/v3 v3.1.0 // indirect
    github.com/davecgh/go-spew v1.1.1 // indirect
    github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect
    github.com/go-ole/go-ole v1.2.6 // indirect
    github.com/gogo/googleapis v1.3.2 // indirect
    github.com/gogo/protobuf v1.3.2 // indirect
    github.com/gogo/status v1.1.0 // indirect
    github.com/golang/mock v1.6.0 // indirect
    github.com/golang/protobuf v1.5.2 // indirect
    github.com/google/go-cmp v0.5.8 // indirect
    github.com/kr/pretty v0.3.0 // indirect
    github.com/marusama/semaphore/v2 v2.5.0 // indirect
    github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
    github.com/opentracing/opentracing-go v1.2.0 // indirect
    github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 // indirect
    github.com/pmezard/go-difflib v1.0.0 // indirect
    github.com/prometheus/client_golang v1.11.1 // indirect
    github.com/prometheus/client_model v0.2.0 // indirect
    github.com/prometheus/common v0.26.0 // indirect
    github.com/prometheus/procfs v0.6.0 // indirect
    github.com/robfig/cron v1.2.0 // indirect
    github.com/shirou/gopsutil v3.21.11+incompatible // indirect
    github.com/stretchr/objx v0.5.0 // indirect
    github.com/stretchr/testify v1.8.1 // indirect
    github.com/tklauser/go-sysconf v0.3.11 // indirect
    github.com/tklauser/numcpus v0.6.0 // indirect
    github.com/uber-go/mapdecode v1.0.0 // indirect
    github.com/uber/tchannel-go v1.33.0 // indirect
    github.com/yusufpapurcu/wmi v1.2.3 // indirect
    go.uber.org/atomic v1.10.0 // indirect
    go.uber.org/dig v1.10.0 // indirect
    go.uber.org/fx v1.13.1 // indirect
    go.uber.org/multierr v1.6.0 // indirect
    go.uber.org/net/metrics v1.3.0 // indirect
    go.uber.org/thriftrw v1.29.2 // indirect
    golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e // indirect
    golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
    golang.org/x/mod v0.8.0 // indirect
    golang.org/x/net v0.14.0 // indirect
    golang.org/x/sys v0.11.0 // indirect
    golang.org/x/text v0.12.0 // indirect
    golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect
    golang.org/x/tools v0.6.0 // indirect
    google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad // indirect
    google.golang.org/grpc v1.47.0 // indirect
    google.golang.org/protobuf v1.28.0 // indirect
    gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
    gopkg.in/yaml.v2 v2.4.0 // indirect
    gopkg.in/yaml.v3 v3.0.1 // indirect
    honnef.co/go/tools v0.3.2 // indirect
)

Can someone help with this?


Solution

  • The issue comes from this line we, err := workflowClient.StartWorkflowExecution(context.Background(), &startRequest)

    This is actually not a Cadence issue but rather a yarpc issue. yarpc requires a context with timeout so if you change to use context.WithTimeout, you should fix your first problem.

    Another issue I notice is that in the request, you may miss the RequestID field. It must be a UUID so simply passing a string would not work. However, if you uses the Cadence CLI to directly invoke the workflow, you don't need to specify them. The CLI simplifies some input parameters and this inconsistency is expected.