Azure functions Azure服务总线主题的EventGridTrigger
我基于EventGrid触发器创建了一个Azure函数。每当新消息到达服务总线主题时,该触发器就会触发。下面是生成的函数模板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
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
eventGridEvent
JSON本身不会向您提供Azure服务总线消息。
您首先需要知道原始消息是如何序列化的,即发送方使用了什么。反序列化需要进入函数中,然后是编写对象数据湖的代码。除了Sean的答案之外,Azure服务总线与AEG的集成还可以为ASB实体构建一些看门狗功能。请注意,此集成与存储blob帐户的集成不同,后者在每次创建/删除blob时都会发布事件。 换句话说,ASB不会为每个到达ASB实体的消息发布一个事件,这些事件会像实体看门狗一样发布 这种实体看门狗使用以下逻辑:
#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($“>>>无消息