当前位置: 首页 > 知识库问答 >
问题:

如何将结构传递给Uber Cadence活动并在工作流中返回修改后的结构

鲍建业
2023-03-14

我只是在尝试一些基本的Uber Cadence示例。我遇到了如下问题:我有一个接收结构作为参数并更改值并返回修改后的结构的活动。当执行workflow.It显示默认values.Code片段时,我无法获得修改后的值,我尝试了如下:

  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个答案

纪勇军
2023-03-14

Cadence和Temporal默认使用编码/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
}
 类似资料:
  • 问题内容: 我有一些通过JNI调用的C函数,这些函数带有指向结构的指针,还有一些其他函数将分配/释放指向相同类型结构的指针,以便处理包装程序更加容易。令人惊讶的是,JNI文档很少介绍如何处理C结构。 我的C头文件如下所示: 相应的JNI C包装文件包含: …最后是对应的Java类: 不幸的是,此代码在点击后立即使JVM崩溃。我对JNI有点陌生,不知道可能是什么问题。 编辑 :我应该注意,C代码非常

  • 我已使用 startActivityForResult 从父活动启动了子活动。在子活动中执行所需功能后,我正在使用setResult设置结果。但是我没有从孩子活动中获得父母活动的结果。 这是我的代码。 下面是我如何从父活动中调用子活动。 这是我如何设置子活动的结果。 这是我的onActivityResult 这里是当我检查resultCode==活动时。RESULT_OK给出false。我还检查了

  • 我想把<代码>工作流程。睡眠调用我的Cadence活动之一,以便能够正确测试它(并模拟function产生的错误结果)。 在实现之前,我注意到两件重要的事情: 和是单独的类型。 每个活动的第一个参数 - - 是可选的,可以省略 我的尝试: 1.首次尝试 错误: "error":"无法解码活动函数输入字节错误:无法解码参数:0,*internal.Context,json错误:json:无法将对象散

  • 我有一个工作良好的JSF片段。单击commandbutton时,它应该通过重定向到自身来重新加载页面。 我得到的错误是 javax.el.elException:不是有效的方法表达式:#{redirectTo}(位于com.sun.el.lang.expressionBuilder.CreateMethodExpression(ExpressionBuilder.java:311)(位于com.s

  • 我正在使用一个第三方库函数,它有大量的位置参数和命名参数。在我的代码中,从多个点使用相同的参数/值调用该函数。 为了便于维护,我不想在代码中多次硬编码几十个相同的参数。我希望有一种方法可以在数据结构中存储它们一次,所以我只需要传递数据结构。按照以下思路: 假设我调用的函数的签名如下: 假设在我的代码中,我想用 for arg1, for arg2 for arg4 (而且我没有使用arg3)。 我

  • 我正在尝试通过 Jenkins 构建 Windows 安装程序。 我有许多jenkins项目,它们构建单个模块,然后通过s3工件插件将这些工件保存在s3中。 我想并行运行这些项目,并将项目复制到最终的“构建安装程序”作业中,该作业采用所有这些并构建安装程序映像。我想出了如何与 jenkins 工作流并行运行作业,但我不知道在哪里查找如何提取作业结果详细信息,确保它们都是相同的变更集并将其传递给“构