Ich verstehe nicht, warum der folgende Handler ( processMessageAsync ), auf den unten verwiesen wird, nicht für einen bestimmten Themennamen ausgelöst wird, sondern für andere Themennamen erfolgreich ist:
subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)
Folgendes ist meine Abonnentenklasse :
open System
open System.Linq
open System.Threading
open System.Text
open System.Threading.Tasks
open Microsoft.Azure.ServiceBus
type Subscriber(connectionString:string, topic:string, subscription:string) =
let mutable subscriptionClient : SubscriptionClient = null
let exceptionReceivedHandler (args:ExceptionReceivedEventArgs) =
printfn "Got an exception: %A" args.Exception
Task.CompletedTask
let processMessageAsync (message:Message) (_:CancellationToken) =
try
let _ = Encoding.UTF8.GetString(message.Body)
subscriptionClient.CompleteAsync(message.SystemProperties.LockToken) |> Async.AwaitTask |> Async.RunSynchronously
Task.CompletedTask
with
_ -> Task.CompletedTask
member x.Listen() =
async {
subscriptionClient <- new SubscriptionClient(connectionString, topic, subscription)
subscriptionClient.OperationTimeout <- TimeSpan.FromMinutes(3.0)
let! rulesFound = subscriptionClient.GetRulesAsync() |> Async.AwaitTask
let hasDefaultRule = rulesFound.Any(fun r -> r.Name = RuleDescription.DefaultRuleName)
if hasDefaultRule then
do! subscriptionClient.RemoveRuleAsync(RuleDescription.DefaultRuleName) |> Async.AwaitTask
let msgOptions = MessageHandlerOptions(fun args -> exceptionReceivedHandler(args))
msgOptions.AutoComplete <- false
msgOptions.MaxAutoRenewDuration <- TimeSpan.FromMinutes(1.0)
msgOptions.MaxConcurrentCalls <- 1
subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)
}
member x.CloseAsync() =
async {
do! subscriptionClient.CloseAsync() |> Async.AwaitTask
}
So versuche ich, den Abonnenten auszuführen :
open System
open Subscription.Console
let connectionString = <connection_string>
[<EntryPoint>]
let main argv =
printfn "Welcome to Subscription.Console"
let topic,subscription = "Topic.courier-accepted","Subscription.all-messages"
let subscriber = Subscriber(connectionString, topic, subscription)
async { do! subscriber.Listen()
} |> Async.RunSynchronously
Console.ReadKey() |> ignore
async { do! subscriber.CloseAsync()
} |> Async.RunSynchronously
0 // return an integer exit code
Der folgende Code veröffentlicht eine Nachricht, die mein Abonnent erhalten soll (aber nicht):
[<Fact>]
let ``Publish courier-accepted to servicebus``() =
async {
// Setup
let client = TopicClient(sbConnectionstring, "Topic.courier-accepted")
let! requestId = requestId()
let updated = requestId |> modifyRequestId someCourierResponse
let json = JsonConvert.SerializeObject(updated)
let message = Message(Encoding.UTF8.GetBytes(json))
message.Label <- sprintf "request-id(%s)" (requestId.ToString())
// Test
do! client.SendAsync(message) |> Async.AwaitTask
// Teardown
do! client.CloseAsync() |> Async.AwaitTask
}
HINWEIS:
Das Interessante am obigen Code ist, dass die Azure-Funktion bei jedem Ausführen des Tests ausgelöst wird, wenn eine Azure-Funktion mit einem ServiceBusTrigger ausgeführt wird, der auf dasselbe Thema und denselben Abonnementnamen eingestellt ist.
- Ich erhalte keine Ausnahmemeldungen
- Die Funktion exceptionReceivedHandler wird auf meiner Abonnenteninstanz niemals ausgelöst
- In meinem Azure-Dashboard für die Servicebus-Ressource werden keine Benutzerfehler festgestellt
Erfolg mit unterschiedlichem Themennamen
Wenn ich den Themennamen in "Kurier angefordert" ändere, empfängt die Abonnenteninstanz Nachrichten:
[<Fact>]
let ``Publish courier-requested to servicebus topic``() =
// Setup
let client = TopicClient(sbConnectionstring, "Topic.courier-requested")
let message = Message(Encoding.UTF8.GetBytes(JsonFor.courierRequest))
message.Label <- sprintf "courier-id(%s)" "b965f552-31a4-4644-a9c6-d86dd45314c4"
// Test
async {
do! client.SendAsync(message) |> Async.AwaitTask
do! client.CloseAsync() |> Async.AwaitTask
}
Hier ist das Abonnement mit der Anpassung des Themennamens:
[<EntryPoint>]
let main argv =
printfn "Welcome to Subscription.Console"
let topic,subscription = "Topic.courier-requested","Subscription.all-messages"
let subscriber = Subscriber(connectionString, topic, subscription)
async { do! subscriber.Listen()
} |> Async.RunSynchronously
Console.ReadKey() |> ignore
async { do! subscriber.CloseAsync()
} |> Async.RunSynchronously
0 // return an integer exit code
Hier sind die beiden Themen in meinem Azure-Portal:
Das Klicken auf Themen im Portal hat unterschiedliche Ergebnisse:
Mir ist aufgefallen, dass ich zweimal auf "Kurier akzeptiert" klicken muss, um die Abonnements anzuzeigen. Ich kann jedoch einmal auf "Kurier angefordert" klicken und sofort die Abonnements anzeigen.
quelle
I don't receive any exception messages
, vielleicht weil du die Ausnahmen schluckst? Ich sehe einenwith _
Block nach einemtry
EinsAntworten:
Wenn ich richtig verstehe, dass Sie versucht haben, das problematische Thema zu löschen und neu zu erstellen, klingt das für mich wie ein Schluckauf in Azure. Sie sollten nicht das oben beschriebene Verhalten erhalten, bei dem zweimal geklickt werden muss. Manchmal habe ich Dinge in Azure erstellt, irgendwo in der Infrastruktur gibt es ein Problem, und eine Supportanfrage ist der einzige Weg, um es zu lösen.
quelle