Warum funktioniert RegisterMessageHandler nicht für einen bestimmten Themennamen?


9

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: Geben Sie hier die Bildbeschreibung ein

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.


1
I don't receive any exception messages, vielleicht weil du die Ausnahmen schluckst? Ich sehe einen with _Block nach einem tryEins
user1623521

Ich habe eine Ausnahme festgestellt, nachdem ich ein zusätzliches Abonnement für das vom Kurier akzeptierte Thema erstellt, den Abonnenten mit einem Abonnementwert gestartet habe, der dem gerade im Portal registrierten entspricht, und dann das kürzlich erstellte Abonnement gelöscht habe, während der Abonnent noch läuft.
Scott Nimrod

Ich kann Ihr Problem auf meiner Seite nicht reproduzieren. Anscheinend haben Sie das ungewöhnliche Verhalten auf dem Servicebusportal festgestellt. Vielleicht könnten Sie dem SB-Team ein Support-Ticket vorlegen.
Jay Gong

Ich habe gestern ein Ticket eingereicht.
Scott Nimrod

Antworten:


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.