Perché RegisterMessageHandler non funziona con un nome di argomento specifico?


9

Non capisco perché il seguente gestore ( processMessageAsync ) a cui si fa riferimento di seguito non venga attivato per un nome argomento specifico, ma riesca per altri nomi argomento:

subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)

Quanto segue è la mia classe di abbonato :

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
        }

Ecco come provo a eseguire l' abbonato :

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 

Il seguente codice pubblica un messaggio che il mio abbonato dovrebbe ricevere (ma non lo fa):

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

NOTA:

La cosa interessante del codice sopra riportato è che quando ho una funzione di Azure in esecuzione con un ServiceBusTrigger impostato sullo stesso argomento e nome della sottoscrizione, tale funzione di Azure viene attivata ogni volta che eseguo il test.

  • Non ricevo messaggi di eccezione
  • exceptionReceivedHandler non è mai stata attivata nella mia istanza del Sottoscrittore
  • Non osservo alcun errore utente sul mio dashboard di Azure per la risorsa del bus di servizio

Ha successo con un nome di argomento diverso

Se cambio il nome dell'argomento in "richiesto dal corriere", l'istanza dell'abbonato riceve i messaggi:

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

Ecco l'abbonamento con la regolazione del nome argomento:

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

Ecco i due argomenti nel mio portale di Azure: inserisci qui la descrizione dell'immagine

Facendo clic su Argomenti nel portale si ottengono risultati diversi:

Ho notato che devo fare clic su "corriere accettato" due volte solo per visualizzare i suoi abbonamenti. Tuttavia, posso fare clic una volta "richiesto dal corriere" e visualizzare immediatamente i relativi abbonamenti.


1
I don't receive any exception messages, forse perché stai inghiottendo le eccezioni? Vedo un with _blocco dopo tryuno
user1623521

Ho osservato un'eccezione dopo aver creato un abbonamento aggiuntivo per l'argomento accettato dal corriere, avviato l'abbonato con un valore di abbonamento corrispondente a quello appena registrato nel portale e quindi eliminato l'abbonamento creato di recente mentre l'abbonato è ancora in esecuzione.
Scott Nimrod,

Non riesco a riprodurre il tuo problema da parte mia, sembra che tu abbia incontrato il comportamento insolito sul portale del bus di servizio. Forse potresti inviare un ticket di supporto al team SB.
Jay Gong

Ho inviato un biglietto ieri.
Scott Nimrod

Risposte:


0

Se capisco correttamente che hai provato a eliminare l'argomento problematico e ricrearlo, mi sembra un singhiozzo in Azure. Non dovresti ottenere il comportamento descritto sopra in cui devi fare clic due volte. A volte ho creato cose in Azure, c'è un problema da qualche parte a valle nella loro infrastruttura e una richiesta di supporto è l'unico modo per risolverlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.