Как передать структуру в действие 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
}