Azure持久编排器+子编排器任务从未解决



我正在尝试构建一个简单的编排器函数+附加调用子编排器。问题是在主编排器和调用等待ctx.CallSubOrchestratorAsync("sub-orchestration", someInput)-任务从未解决/完成…如果我从更改子编排器中的代码,等待Send_SomeData();Send_SomeData () .Wait ();那就行,但那不是我想要的。据我所知,在编排函数中支持async/await

谢谢!

代码如下:

主协调器

[FunctionName("main-orchestration")]
public static async Task MainOrchestrationAsync(
[OrchestrationTrigger] IDurableOrchestrationContext ctx, 
ILogger log)
{
var someInput = "my msg";
await ctx.CallSubOrchestratorAsync("sub-orchestration", someInput);
log.LogWarning("finish");
}

子协调器

[FunctionName("sub-orchestration")]
public static async Task SubOrchestrationAsync(
[OrchestrationTrigger] IDurableOrchestrationContext ctx, 
ILogger log)
{
log.LogWarning("Sub Start");
await Send_SomeData(some_url, some_message);
log.LogWarning("Sub End");
}

Send_SomeData

public static async Task<string> ConnectAsync(string url, string message)
{
using var request = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = HttpMethod.Post, 
Content = new FormUrlEncodedContent(new[]
{
...message...
})
};
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}

我决定从头开始创建一个示例,以免错过一些东西,并获得可以复制/粘贴用于调试的东西。下面是另一个例子。<<strong>主要结束/strong>日志消息从未出现,所以Task from。CallSubOrchestratorAsync从来没有解决。

我错过了什么?再次感谢!

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace _Await_Issue
{
public static class Function1
{
[FunctionName("Main")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
log.LogWarning("Main Start");
try
{
await context.CallSubOrchestratorAsync("Sub", null);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}

log.LogWarning("Main End");
}
[FunctionName("Sub")]
public static async Task RunSubOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
log.LogWarning("Sub Start");
var data = await GetDataAsync("https://www.google.com");
log.LogWarning("Sub End");
}
[FunctionName("Start")]
public static async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")]
HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
// Function input comes from the request content.
string instanceId = await starter.StartNewAsync("Main", null);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
public static async Task<string> GetDataAsync(string url)
{
var httpClient = new HttpClient();
using var request = new HttpRequestMessage
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
var response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
}

我在这里找到了光))回答我自己的问题,因为这可能会帮助别人。

AsPeter BonsSend_SomeData方法受到怀疑))

这个问题一般是在"确定性Apis"正如Azure团队在文档中所说的那样确定性api解释

在我的情况下,Send_SomeData内部使用HttpClient与外部端点通信。不建议这样做,因为它可能会导致意外行为,就像我使用await…

如果有这样的代码部分(例如Send_SomeData在我的情况下)把它放在Activity和调用上下文callactivityasync() -(注意,活动函数有有限的时间执行)

最新更新