MutableSideEffect () паникует при установке второго значения - PullRequest
0 голосов
/ 19 июня 2019

Мы находимся в процессе написания клиента .NET Cadence и немного запутались в том, как MutableSideEffect () должен работать. Мы думали о том, что ID передается как имя переменной и что разработчики должны иметь возможность обновлять изменяемые значения в рабочем процессе. Когда мы пытаемся это сделать, второй 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
}

Правильно ли мы думаем об этом?

1 Ответ

0 голосов
/ 19 июня 2019

Это ошибка в клиентской библиотеке Go. Это происходит, когда MutableSideEffect с одним и тем же идентификатором используется несколько раз в течение одного решения.

Если вы навязываете отдельное решение, поставив workflow.Sleep(ctx, time.Second) непосредственно перед вторым MutableSideEffect вызовом, проблема исчезнет.

Я подал проблему , чтобы исправить это.

Большое спасибо за сообщение!

...