Как передать структуру в действие Uber Cadence и вернуть измененную структуру в рабочем процессе

Я просто пробую несколько базовых примеров Uber Cadence. Я столкнулся со следующей проблемой: у меня есть действие, которое получает структуру в качестве параметра и меняет значения и возвращает измененную структуру. Я не могу получить измененные значения при выполнении Фрагмент кода, который я пробовал, выглядит следующим образом:

  type Product struct {
    vendor      string // "Arrows"
    productCategory string // "Clothing"
    productName string // "Shirt"
    description string // "Shirt for Gents"
    size        int    // 42    
    cost        float32// 2.00
    color       string // "Red"
    auctionOption   string // "Buy it Now"
}

// populateProduct
func newProduct() *Product {  
    p := Product{vendor:  "Arrows"}
    p.productCategory = "Clothing"
    p.productName = "Shirt"
    p.description = "Shirt for Gents"
    p.size = 42 
    p.cost = 2.00
    p.color = "Red"
    p.auctionOption = "Buy it Now"
    return &p
}

// Activity
func NewProductActivity(ctx context.Context) (*Product, error) {
    logger := activity.GetLogger(ctx)
    logger.Info("NewProductActivity started.................")
    np := newProduct()
    return np, nil
    }

    // Workflow
    func MarketPlaceWorkflow(ctx workflow.Context, name string) (string, error) {
        ctx = workflow.WithActivityOptions(ctx, activityOptions)

        logger := workflow.GetLogger(ctx)
    logger.Info("MarketPlace workflow started!................")

    // Invoking NewProductActivity
    var npActivityResult Product
    err := workflow.ExecuteActivity(ctx, NewProductActivity).Get(ctx, &npActivityResult)
    if err != nil {
        logger.Error("MarketPlace workflow NewProductActivity failed!.............", zap.Error(err))
        return "", err
    }
        logger.Info("Vendor: ", zap.String("Vendor", npActivityResult.vendor)) // It is showing default values
   return "", nil
}

1 ответ

Cadence и Temporal по умолчанию используют пакет encoding/json для сериализации и десериализации входов и выходов действий. Этот пакет не сериализует частные поля. Итак, в вашем случае, поскольку все поля являются частными, они игнорируются при передаче из действия в рабочий процесс. Измените свой код на:

type Product struct {
    Vendor      string // "Arrows"
    ProductCategory string // "Clothing"
    ProductName string // "Shirt"
    Description string // "Shirt for Gents"
    Size        int    // 42    
    Cost        float32// 2.00
    Color       string // "Red"
    AuctionOption   string // "Buy it Now"
}

// populateProduct
func newProduct() *Product {  
    p := Product{Vendor:  "Arrows"}
    p.ProductCategory = "Clothing"
    p.ProductName = "Shirt"
    p.Description = "Shirt for Gents"
    p.Size = 42 
    p.Cost = 2.00
    p.Color = "Red"
    p.AuctionOption = "Buy it Now"
    return &p
}

// Activity
func NewProductActivity(ctx context.Context) (*Product, error) {
    logger := activity.GetLogger(ctx)
    logger.Info("NewProductActivity started.................")
    np := newProduct()
    return np, nil
}

// Workflow
func MarketPlaceWorkflow(ctx workflow.Context, name string) (string, error) {
    ctx = workflow.WithActivityOptions(ctx, activityOptions)

    logger := workflow.GetLogger(ctx)
    logger.Info("MarketPlace workflow started!................")

    // Invoking NewProductActivity
    var npActivityResult Product
    err := workflow.ExecuteActivity(ctx, NewProductActivity).Get(ctx, &npActivityResult)
    if err != nil {
        logger.Error("MarketPlace workflow NewProductActivity failed!.............", zap.Error(err))
        return "", err
    }
    logger.Info("Vendor: ", zap.String("Vendor", npActivityResult.Vendor))
    return "", nil
}
Другие вопросы по тегам