Mengapa RegisterMessageHandler tidak berfungsi untuk nama topik tertentu?

9

Saya tidak mengerti mengapa penangan berikut ( processMessageAsync ) yang dirujuk di bawah ini tidak dipicu untuk nama topik tertentu tetapi berhasil untuk nama topik lainnya:

subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)

Berikut ini adalah kelas Pelanggan saya :

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
        }

Inilah cara saya mencoba menjalankan pelanggan :

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 

Kode berikut menerbitkan pesan yang harus diterima oleh pelanggan saya (tetapi tidak):

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

CATATAN:

Yang menarik dari kode di atas, adalah ketika saya memiliki Fungsi Azure berjalan dengan ServiceBusTrigger diatur ke topik dan nama langganan yang sama, Fungsi Azure dipicu setiap kali saya menjalankan tes.

  • Saya tidak menerima pesan pengecualian
  • Fungsi exceptionReceivedHandler tidak pernah dipicu pada contoh Pelanggan saya
  • Saya tidak melihat kesalahan pengguna pada dasbor Azure saya untuk sumber daya servicebus

Berhasil dengan nama topik yang berbeda

Jika saya mengubah nama topik menjadi "permintaan kurir" maka mesin virtual pelanggan menerima pesan:

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

Inilah langganan yang memiliki penyesuaian nama topik:

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

Berikut adalah dua topik di Portal Azure saya: masukkan deskripsi gambar di sini

Mengklik Topik di Portal memiliki Hasil berbeda:

Saya perhatikan bahwa saya harus mengklik "kurir-diterima" dua kali hanya untuk melihat langganan itu. Namun, saya dapat mengklik "permintaan kurir" sekali dan segera melihat langganannya.

Scott Nimrod
sumber
1
I don't receive any exception messages, mungkin karena Anda menelan pengecualian? Saya melihat with _blok setelah trysatu
user1623521
Saya memang mengamati pengecualian setelah saya membuat langganan tambahan untuk topik yang diterima kurir, meluncurkan pelanggan dengan nilai langganan yang cocok dengan yang baru saja saya daftarkan di portal, dan kemudian menghapus langganan yang baru saja dibuat saat pelanggan masih berjalan.
Scott Nimrod
Saya tidak dapat mereproduksi masalah Anda di pihak saya, sepertinya Anda bertemu dengan perilaku yang tidak normal di portal bus layanan. Mungkin Anda bisa mengirimkan tiket dukungan ke tim SB.
Jay Gong
Saya mengirimkan tiket kemarin.
Scott Nimrod

Jawaban:

0

Jika saya mengerti benar bahwa Anda mencoba menghapus topik yang bermasalah dan membuatnya kembali, itu kedengarannya seperti cegukan di Azure. Anda seharusnya tidak mendapatkan perilaku yang dijelaskan di atas di mana seseorang harus diklik dua kali. Terkadang saya membuat sesuatu di Azure, ada masalah di suatu tempat di hilir dalam infrastruktur mereka, dan permintaan dukungan adalah satu-satunya cara untuk menyelesaikannya.

Jayme Edwards
sumber