Pourquoi RegisterMessageHandler ne fonctionne-t-il pas pour un nom de rubrique spécifique?


9

Je ne comprends pas pourquoi le gestionnaire suivant ( processMessageAsync ) référencé ci-dessous n'est pas déclenché pour un nom de rubrique spécifique mais réussit pour d'autres noms de rubrique:

subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)

Ce qui suit est ma classe d' abonné :

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
        }

Voici comment j'essaie d'exécuter l' abonné :

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 

Le code suivant publie un message que mon abonné doit recevoir (mais ne le fait pas):

[<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
    }

REMARQUE:

Ce qui est intéressant avec le code ci-dessus, c'est que lorsque j'ai une fonction Azure exécutée avec un ServiceBusTrigger défini sur le même sujet et le même nom d'abonnement, cette fonction Azure est déclenchée chaque fois que j'exécute le test.

  • Je ne reçois aucun message d'exception
  • La fonction exceptionReceivedHandler n'est jamais déclenchée sur mon instance d'abonné
  • Je n'observe aucune erreur utilisateur sur mon tableau de bord Azure pour la ressource servicebus

Réussit avec un nom de sujet différent

Si je change le nom du sujet en "demandé par messagerie", l'instance d'abonné reçoit des messages:

[<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
    }

Voici l'abonnement qui a l'ajustement du nom du sujet:

[<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

Voici les deux rubriques de mon portail Azure: entrez la description de l'image ici

Cliquer sur des sujets dans Portal a des résultats différents:

J'ai remarqué que je dois cliquer deux fois sur "acceptée par messagerie" pour afficher ses abonnements. Cependant, je peux cliquer une fois sur "demande de messagerie" et consulter immédiatement ses abonnements.


1
I don't receive any exception messages, peut-être parce que vous avalez les exceptions? Je vois un with _bloc après un tryune
user1623521

J'ai observé une exception après avoir créé un abonnement supplémentaire pour le sujet accepté par messagerie, lancé l'abonné avec une valeur d'abonnement correspondant à celle que je viens d'enregistrer sur le portail, puis supprimant l'abonnement récemment créé pendant que l'abonné est toujours en cours d'exécution.
Scott Nimrod

Je ne peux pas reproduire votre problème de mon côté, il semble que vous ayez rencontré le comportement anormal sur le portail du service bus. Vous pourriez peut-être soumettre un ticket d'assistance à l'équipe SB.
Jay Gong

J'ai soumis un ticket hier.
Scott Nimrod

Réponses:


0

Si je comprends bien que vous avez essayé de supprimer le sujet problématique et de le recréer, cela me semble être un hoquet dans Azure. Vous ne devriez pas obtenir le comportement décrit ci-dessus où il faut cliquer deux fois. Parfois, j'ai créé des choses dans Azure, il y a un problème quelque part en aval dans leur infrastructure, et une demande de support est le seul moyen de le résoudre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.