持久函数:如何将参数传递给 Orchestrator?
Durable Functions: How to pass a parameter to the Orchestrator?
我是 Azure Durable 函数的新手,一直在遵循 'Azure Serverless Computing Cookbook' 书中的示例代码,但我被卡住了,因为我的 Orchestrator 中的 .GetInput 函数是 return null。我的 Blob 触发器在调用我的 Orchestrator 时将文件名作为参数传递。我认为它调用了错误的重载函数,但不确定如何调用正确的函数。
await starter.StartNewAsync("CSVImport_Orchestrator", name);
[FunctionName("CSVImport_Orchestrator")]
public static async Task<List<string>> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var outputs = new List<string>();
string CSVFileName = context.GetInput<string>(); //<<== returns null???
{
List<Employee> employees = await context.CallActivityAsync<List<Employee>>("ReadCSV_AT", CSVFileName);
}
return outputs;
}
[FunctionName("CSVImportBlobTrigger")]
public static async void Run([BlobTrigger("import-obiee-report/{name}", Connection = "StorageConnection")]Stream myBlob, string name, [DurableClient]IDurableOrchestrationClient starter, ILogger log)
{
string instanceId = await starter.StartNewAsync("CSVImport_Orchestrator", name);
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
预先感谢您的帮助。
您正在调用 non-generic overload of StartAsync(string, string)
where the second, string
argument represents the InstanceId and not the input argument. There's also a generic overload,其中第二个参数表示数据。您正在传递 string
,因此重载决议会看到两个潜在的候选人。然后它更喜欢非通用的,因为它是 精确 匹配,因此“丢失”了您的数据。
如果您确实需要string
输入数据,您需要指定通用参数显式强制编译器 select 正确的重载:
await starter.StartAsync<string>("CSVImport_Orchestrator", name);
现在,文档还指出输入应该是一个 JSON-可序列化的 对象。从技术上讲,string
是,但我不确定它如何与编排器的序列化器一起播放。您可以改为传递包含您的数据的 class。这有一个好处,即通用参数将被正确地 inferred:
public class Data {
public string Name { get; set; }
}
// calling
await starter.StartAsync("CSVImport_Orchestrator", new Data { Name = name });
// using
var csvFileName = context.GetInput<Data>()?.Name;
我是 Azure Durable 函数的新手,一直在遵循 'Azure Serverless Computing Cookbook' 书中的示例代码,但我被卡住了,因为我的 Orchestrator 中的 .GetInput 函数是 return null。我的 Blob 触发器在调用我的 Orchestrator 时将文件名作为参数传递。我认为它调用了错误的重载函数,但不确定如何调用正确的函数。
await starter.StartNewAsync("CSVImport_Orchestrator", name);
[FunctionName("CSVImport_Orchestrator")]
public static async Task<List<string>> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var outputs = new List<string>();
string CSVFileName = context.GetInput<string>(); //<<== returns null???
{
List<Employee> employees = await context.CallActivityAsync<List<Employee>>("ReadCSV_AT", CSVFileName);
}
return outputs;
}
[FunctionName("CSVImportBlobTrigger")]
public static async void Run([BlobTrigger("import-obiee-report/{name}", Connection = "StorageConnection")]Stream myBlob, string name, [DurableClient]IDurableOrchestrationClient starter, ILogger log)
{
string instanceId = await starter.StartNewAsync("CSVImport_Orchestrator", name);
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
预先感谢您的帮助。
您正在调用 non-generic overload of StartAsync(string, string)
where the second, string
argument represents the InstanceId and not the input argument. There's also a generic overload,其中第二个参数表示数据。您正在传递 string
,因此重载决议会看到两个潜在的候选人。然后它更喜欢非通用的,因为它是 精确 匹配,因此“丢失”了您的数据。
如果您确实需要string
输入数据,您需要指定通用参数显式强制编译器 select 正确的重载:
await starter.StartAsync<string>("CSVImport_Orchestrator", name);
现在,文档还指出输入应该是一个 JSON-可序列化的 对象。从技术上讲,string
是,但我不确定它如何与编排器的序列化器一起播放。您可以改为传递包含您的数据的 class。这有一个好处,即通用参数将被正确地 inferred:
public class Data {
public string Name { get; set; }
}
// calling
await starter.StartAsync("CSVImport_Orchestrator", new Data { Name = name });
// using
var csvFileName = context.GetInput<Data>()?.Name;