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

Azure Durable Orchestrator子Orchestrator任务从未解决

洪俊能
2023-03-14

我正在尝试使用子编排器构建一个简单的编排器func附加调用。问题出现在主编排器中,并调用以等待ctx。CallSubOrchestratorAsync(“sub orchestration”,someInput)-如果我将sub Orchistrator中的代码从await Send_SomeData()更改,则任务永远不会解析/完成;发送_SomeData()。等待();那就行了,但这不是我想要的。据我所知,编排功能支持异步/等待

谢谢!

代码如下:

主编曲

[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");
}

发送_一些数据

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();
}

更新:我决定从头开始创建一个示例,以避免遗漏某些内容,并获得可以复制/粘贴以进行调试的内容。下面是另一个例子。日志消息的主端从未出现,因此.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();
        }
    }
}

共有1个答案

齐栋
2023-03-14

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

正如彼得·邦斯(Peter Bons)所指出的那样Send_SomeData方法受到怀疑))

一般来说,问题出在“确定性 Api”中,因为 Azure 团队在文档确定性 API 说明中调用

在我的例子中,Send_SomeData inside使用HttpClient与外部endpoint通信。不建议这样做,因为这可能会导致意外的行为,就像我使用await的情况一样...

如果有这样的代码部分(例如,在我的例子中是Send_SomeData),则将其放在活动中,并使用上下文调用它。CallActivityAsync()-(请注意,Activity funcs的执行时间有限)

 类似资料:
  • Orchestrator 是 MySQL 复制拓扑管理和可视化工具,支持: 检测和审查复制集群 安全拓扑重构:转移服务于另外一台计算机的系统拓扑S 整洁的拓扑可视化 复制问题可视化 通过简单的拖拽修改拓扑 维护模式声明和执行 审计操作 重构拓扑只需要简单的拖拽。Orchestrator 会保证安全,并且禁止非法复制拓扑。

  • 我正在努力将Activiti BPMN与我的JavaWebApp集成。我已经成功地定义了流程,并根据我的要求执行了它,尽管我陷入了一个问题,需要我从当前执行的任务中找到所有未来可能发生的任务。 假设在我的XML中,我有一个工作流,其中有4个任务,如任务a,然后是一个专用网关,然后还有3个任务。我当前执行的任务是任务A,现在我想知道未来任务的可能性(即网关后的3个任务)。无论如何这可能吗? 我被困在

  • 我正在将一些用于iOS和OSX的Ant构建转换为Gradle。创建了以下内容: 这可能很简单,但我做错了什么?如何从自定义类中调用exec任务?

  • 我需要自定义我的任务,以便它: 像往常一样处理所有类; 只包含特定的资源,并将它们放入jar中的自定义文件夹中。 我已经做了自定义罐任务,这是我想要的: 但我仍然需要用一个新的罐子替换内置的罐子。 将其替换为 ...产量 简单地配置任务不起作用,因为它已经在JavaPlugin中配置好了: 所以,我需要的是从的配置中重写(覆盖)默认的

  • 我正在尝试在server 2012任务计划程序中计划bcp作业。当我双击批处理文件时,它工作正常。它包括以下行: 该文件是从命令行创建的。调度程序具有: < li >操作:启动一个程序 < li >脚本:< code > D:\ DATA \ my batch . bat < li >开始于:< code>D:\Data 我正在为其他计划任务使用相同的帐户,它们运行良好。