J'essaie d'utiliser le bus de service Azure pour transmettre des messages entre plusieurs fonctions azure. Je crée un sujet et un abonnement dans le code. Mais ne savez pas comment ajouter une requête de filtre à partir du code. Je veux filtrer les messages par ID. par exemple SqlFilter($"'id' ='{id}'")
. Je ne veux pas créer un abonnement pour chaque message à cause de ce filtre.Abonnement Azure Service Bus Topic avec requête de filtre SQL dynamique
Est-il possible d'avoir un filtre différent pour un abonnement?
Ce problème peut être résolu en créant un abonnement pour chaque requête et en le supprimant par la suite. Mais je ne veux pas créer autant d'abonnements. Mon but est de simplement changer le filtre chaque fois que la fonction est appelée.
Exemple de code:
var connectionString = ConfigurationManager.AppSettings["ServiceBus_CONNECTION_STRING"];
var namespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString);
if (!await namespaceManager.TopicExistsAsync(topicName))
{
// Configure Topic Settings.
var topic = new TopicDescription(topicName)
{
MaxSizeInMegabytes = 1024,
DefaultMessageTimeToLive = TimeSpan.FromMinutes(5)
};
await namespaceManager.CreateTopicAsync(topic);
}
if (!await namespaceManager.SubscriptionExistsAsync(topicName, subscription))
{
await namespaceManager.CreateSubscriptionAsync(topicName, subscription);
}
var cts = new TaskCompletionSource<T>();
var subClient =
SubscriptionClient.CreateFromConnectionString(connectionString, topicName,
subscription);
var ruleDescription = new RuleDescription($"RequestIdRule{id}", new SqlFilter($"'id' ='{id}'"));
await subClient.AddRuleAsync(ruleDescription);
var options = new OnMessageOptions();
subClient.OnMessage(m =>
{
try
{
var body = m.GetBody<T>();
cts.SetResult(body);
}
catch (Exception ex)
{
m.Abandon();
}
},
options);
return await cts.Task;
}
catch (Exception ex)
{
throw;
}