0

私たちは .NET Cadence クライアントを書いている最中で、 MutableSideEffect()がどのように機能するはずなのかについて少し混乱しています。IDは本質的に変数名として渡され、開発者はワークフローで変更可能な値を更新できるべきだと考えてきました。ただし、これを試すと、2 回目のMutableSideEffect()呼び出しが次のパニックで失敗します。

panic: adding duplicate decision DecisionType: Marker, ID: MutableSideEffect_value-1, state=Created, isDone()=false, history=[Created]

これらの呼び出しを行うために、グリーティング ワークフローのサンプルを変更しました。

package main

import (
    "fmt"
    "math/rand"
    "time"

    "go.uber.org/cadence/activity"
    "go.uber.org/cadence/workflow"
    "go.uber.org/zap"
)

/**
 * This greetings sample workflow executes 3 activities in sequential. It gets greeting and name from 2 different activities,
 * and then pass greeting and name as input to a 3rd activity to generate final greetings.
 */

// ApplicationName is the task list for this sample
const ApplicationName = "greetingsGroup"

// This is registration process where you register all your workflows
// and activity function handlers.
func init() {
    workflow.Register(SampleGreetingsWorkflow)
    activity.Register(getGreetingActivity)
    activity.Register(getNameActivity)
    activity.Register(sayGreetingActivity)
}

// SampleGreetingsWorkflow Workflow Decider.
func SampleGreetingsWorkflow(ctx workflow.Context) error {
    // Get Greeting.
    ao := workflow.ActivityOptions{
        ScheduleToStartTimeout: time.Minute,
        StartToCloseTimeout:    time.Minute,
        HeartbeatTimeout:       time.Second * 20,
    }
    ctx = workflow.WithActivityOptions(ctx, ao)

    logger := workflow.GetLogger(ctx)
    var greetResult string
    err := workflow.ExecuteActivity(ctx, getGreetingActivity).Get(ctx, &greetResult)
    if err != nil {
        logger.Error("Get greeting failed.", zap.Error(err))
        return err
    }

    f := func(ctx workflow.Context) interface{} {
        return rand.Intn(100)
    }

    e := func(a, b interface{}) bool {
        if a == b {
            return true
        }

        return false
    }

    var result int
    sideEffectValue := workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-1", zap.Int("Value", result))

    //************** THIS CALL FAILS ************** 

    sideEffectValue = workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-2", zap.Int("Value", result))

    // Get Name.
    var nameResult string
    err = workflow.ExecuteActivity(ctx, getNameActivity).Get(ctx, &nameResult)
    if err != nil {
        logger.Error("Get name failed.", zap.Error(err))
        return err
    }

    // Say Greeting.
    var sayResult string
    err = workflow.ExecuteActivity(ctx, sayGreetingActivity, greetResult, nameResult).Get(ctx, &sayResult)
    if err != nil {
        logger.Error("Marshalling failed with error.", zap.Error(err))
        return err
    }

    logger.Info("Workflow completed.", zap.String("Result", sayResult))
    return nil
}

// Get Name Activity.
func getNameActivity() (string, error) {
    return "Cadence", nil
}

// Get Greeting Activity.
func getGreetingActivity() (string, error) {
    return "Hello", nil
}

// Say Greeting Activity.
func sayGreetingActivity(greeting string, name string) (string, error) {
    result := fmt.Sprintf("Greeting: %s %s!\n", greeting, name)
    return result, nil
}

私たちはこれについて正しく考えていますか?

4

1 に答える 1