Azure functions Azure服务总线主题的EventGridTrigger

Azure functions Azure服务总线主题的EventGridTrigger,azure-functions,azure-data-lake,azure-servicebus-topics,azure-eventgrid,Azure Functions,Azure Data Lake,Azure Servicebus Topics,Azure Eventgrid,我基于EventGrid触发器创建了一个Azure函数。每当新消息到达服务总线主题时,该触发器就会触发。下面是生成的函数模板 using Newtonsoft.Json; using Newtonsoft.Json.Linq; public static void Run(JObject eventGridEvent, TraceWriter log) { log.Info(eventGridEvent.ToString(Formatting.Indented)); } 我对Azur

我基于EventGrid触发器创建了一个Azure函数。每当新消息到达服务总线主题时,该触发器就会触发。下面是生成的函数模板

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static void Run(JObject eventGridEvent, TraceWriter log)
{
    log.Info(eventGridEvent.ToString(Formatting.Indented));
}
我对Azure功能的要求是处理数据并将其存储在ADL中。现在,我如何从JObject类型解析/反序列化数据。在将数据持久化到data lake存储之前,我需要规范化此函数中的数据。 是否需要覆盖该函数

请提供一些详细信息/参考以满足此要求

服务总线(高级)针对两种情况发送事件:

  • ActiveMessagesWithNoListenersAvailable
  • deadlettermessagesavaailable
  • 当存在与特定实体关联的消息且不存在活动侦听器时,将发出第一个事件。该实体将在有效负载中指示,以及访问该实体所需的其他信息(例如名称空间或要从中接收的订阅主题)。架构在中定义

    第二个事件模式类似于第一个事件模式,并针对死信队列发出

    现在,我如何从JObject类型解析/反序列化数据。在将数据持久化到data lake存储之前,我需要规范化此函数中的数据。是否需要覆盖该函数

    eventGridEvent
    JSON本身不会向您提供Azure服务总线消息。
    您首先需要知道原始消息是如何序列化的,即发送方使用了什么。反序列化需要进入函数中,然后是编写对象数据湖的代码。

    除了Sean的答案之外,Azure服务总线与AEG的集成还可以为ASB实体构建一些看门狗功能。请注意,此集成与存储blob帐户的集成不同,后者在每次创建/删除blob时都会发布事件。 换句话说,ASB不会为每个到达ASB实体的消息发布一个事件,这些事件会像实体看门狗一样发布

    这种实体看门狗使用以下逻辑:

  • 当实体中没有消息时,不会发布任何事件
  • 当第一条消息到达实体并且实体上有360多秒没有活动侦听器时,事件将立即发布
  • 当侦听器仍处于非活动状态且实体中至少有一条消息时,每120秒发布一次事件
  • 事件在360秒侦听器空闲(非活动)时间后发布,但实体中仍至少有一条消息。例如,如果实体中有5条消息,订阅者将使用REST Api只提取一条消息,那么下一个事件将在360秒后发布。换句话说,看门狗实体允许侦听器在空闲时间内保持360秒 基于上述“看门狗实体”行为,此功能看起来更适合于缓慢的流量消息传递,例如唤醒和监视ASB实体上的侦听器

    请注意,在订阅级别使用短重试时间策略可以避免侦听器的360秒空闲时间,因此可以在5分钟重试时间内再次调用订阅服务器3次

    出于测试目的,以下是ASB事件订阅服务器的EventGridTrigger函数的代码片段

    #r "..\\bin\\Microsoft.Azure.ServiceBus.dll"
    #r "Newtonsoft.Json"
    
    using System;
    using System.Threading.Tasks;
    using System.Text;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    using Microsoft.Azure.ServiceBus.Primitives;
    
    
    
    // sasToken cache
    static SasTokenHelper helper = new SasTokenHelper(Environment.GetEnvironmentVariable("AzureServiceBusConnectionString"));
    
    public static async Task Run(JObject eventGridEvent, ILogger log)
    {
        log.LogInformation(eventGridEvent.ToString());
    
        // from the eventgrid payload
        var requestUri = $"{eventGridEvent["data"]?["requestUri"]?.Value<string>()}?api-version=2015-01";
    
        using (var client = new HttpClient())
        {
    
            client.DefaultRequestHeaders.Add("Authorization", helper.GetSasToken());
    
            do
            {
                // read & delete the message 
                var response = await client.DeleteAsync(requestUri);
    
                // check for message
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    log.LogWarning($">>> No message <<<");
                    break;
                }
    
                // message body
                string jsontext = await response.Content.ReadAsStringAsync();
    
                // show the message
                log.LogInformation($"\nHeaders:\n\t{string.Join("\n\t", response.Headers.Select(i => $"{i.Key}={i.Value.First()}"))}\nBody:\n\t{jsontext}");
            } while (true);
    
        }
    
        await Task.CompletedTask;
    }
    
    
    
    
    // helpers
    class SasTokenHelper
    {
        DateTime expiringSaS;
        uint sasTTLInMinutes = 10;
        string sasToken = string.Empty;
        (string hostname, string keyname, string key) config;
    
        public SasTokenHelper(string connectionString)
        {
            config = GetPartsFromConnectionString(connectionString);
            GetSasToken();
        }
    
        public string GetSasToken()
        {
            lock (sasToken)
            {
                if (expiringSaS < DateTime.UtcNow.AddMinutes(-1))
                {
                    this.sasToken = GetSASToken(config.hostname, config.key, config.keyname, sasTTLInMinutes);
                    expiringSaS = DateTime.UtcNow.AddMinutes(sasTTLInMinutes);
                }
                return sasToken;
            }
        }
    
        internal (string hostname, string keyname, string key) GetPartsFromConnectionString(string connectionString)
        {
            var parts = connectionString.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split(new[] { '=' }, 2)).ToDictionary(x => x[0].Trim(), x => x[1].Trim());
            return (parts["Endpoint"] ?? "", parts["SharedAccessKeyName"] ?? "", parts["SharedAccessKey"] ?? "");
        }
    
        internal string GetSASToken(string resourceUri, string key, string keyName = null, uint minutes = 10)
        {
            var tp = SharedAccessSignatureTokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key, TimeSpan.FromMinutes(minutes));
            return tp.GetTokenAsync(resourceUri, TimeSpan.FromSeconds(60)).Result.TokenValue;
        }
    }
    
    \r.\\bin\\Microsoft.Azure.ServiceBus.dll”
    #r“Newtonsoft.Json”
    使用制度;
    使用System.Threading.Tasks;
    使用系统文本;
    使用System.Linq;
    Net系统;
    使用System.Net.Http;
    使用System.Web;
    使用Newtonsoft.Json;
    使用Newtonsoft.Json.Linq;
    使用Microsoft.Azure.ServiceBus.Primitives;
    //sasToken缓存
    静态SasTokenHelper=新的SasTokenHelper(Environment.GetEnvironmentVariable(“AzureServiceBusConnectionString”);
    公共静态异步任务运行(JObject eventGridEvent,ILogger日志)
    {
    log.LogInformation(eventGridEvent.ToString());
    //从eventgrid有效负载
    var requestUri=$“{eventGridEvent[“data”]?[“requestUri”]?.Value()}?api版本=2015-01”;
    使用(var client=new HttpClient())
    {
    client.DefaultRequestHeaders.Add(“Authorization”,helper.GetSasToken());
    做
    {
    //阅读并删除邮件(&D)
    var response=await client.deleteAync(requestUri);
    //检查消息
    if(response.StatusCode!=HttpStatusCode.OK)
    {
    log.LogWarning($“>>>无消息