【问题标题】:How to pass a struct to an Uber Cadence Activity and return modified struct in workflow如何将结构传递给 Uber Cadence Activity 并在工作流中返回修改后的结构
【发布时间】:2020-06-16 01:08:35
【问题描述】:

我只是在尝试一些基本的 Uber Cadence 示例。我遇到的问题如下: 我有一个活动,它接收一个结构作为参数并更改值并返回修改后的结构。执行工作流时我无法获取修改后的值。它显示默认值。代码 sn-p 我尝试如下:

  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
}

【问题讨论】:

    标签: struct parameter-passing cadence-workflow temporal-workflow


    【解决方案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
    }
    

    【讨论】:

    • 我确实检查了 encoding/json 包并完成了您提到的更改。有用。我非常感谢您的宝贵时间并感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2017-07-18
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多