ทำไม RegisterMessageHandler ไม่ทำงานกับชื่อหัวข้อเฉพาะ


9

ฉันไม่เข้าใจว่าทำไมตัวจัดการต่อไปนี้ ( processMessageAsync ) ที่อ้างอิงด้านล่างไม่ถูกเรียกใช้สำหรับชื่อหัวข้อที่ระบุ แต่สำเร็จสำหรับชื่อหัวข้ออื่น:

subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)

ต่อไปนี้เป็นคลาสสมาชิกของฉัน:

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
        }

นี่คือวิธีที่ฉันพยายามเรียกใช้สมาชิก :

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 

รหัสต่อไปนี้เผยแพร่ข้อความที่สมาชิกของฉันควรได้รับ (แต่ไม่ได้):

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

บันทึก:

สิ่งที่น่าสนใจเกี่ยวกับรหัสด้านบนคือเมื่อฉันมีฟังก์ชัน Azure ที่ทำงานด้วย ServiceBusTrigger ที่ตั้งค่าเป็นหัวข้อและชื่อการสมัครสมาชิกเดียวกันฟังก์ชัน Azure นั้นจะถูกเรียกใช้ทุกครั้งที่ฉันทำการทดสอบ

  • ฉันไม่ได้รับข้อความยกเว้น
  • ฟังก์ชันexceptionReceivedHandlerไม่เคยถูกเรียกใช้บนอินสแตนซ์สมาชิกของฉัน
  • ฉันไม่สังเกตเห็นข้อผิดพลาดของผู้ใช้บนแผงควบคุม Azure ของฉันสำหรับทรัพยากร servicebus

ประสบความสำเร็จด้วยชื่อหัวข้อที่แตกต่าง

หากฉันเปลี่ยนชื่อหัวข้อเป็น "ร้องขอโดยผู้จัดส่ง" อินสแตนซ์สมาชิกจะได้รับข้อความ:

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

นี่คือการสมัครสมาชิกที่มีการปรับชื่อหัวข้อ:

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

นี่คือสองหัวข้อใน Azure Portal ของฉัน: ป้อนคำอธิบายรูปภาพที่นี่

การคลิกหัวข้อในพอร์ทัลมีผลลัพธ์ที่แตกต่าง:

ฉันสังเกตเห็นว่าฉันต้องคลิก "ยอมรับการจัดส่ง" สองครั้งเพื่อดูการสมัครรับข้อมูล อย่างไรก็ตามฉันสามารถคลิก "ผู้ขอใช้บริการจัดส่ง" หนึ่งครั้งและดูการสมัครรับข้อมูลทันที


1
I don't receive any exception messagesอาจเป็นเพราะคุณกำลังกลืนข้อยกเว้น? ฉันเห็นwith _บล็อกtryหนึ่งอัน
user1623521

ฉันสังเกตข้อยกเว้นหลังจากฉันสร้างการสมัครสมาชิกเพิ่มเติมสำหรับหัวข้อที่ยอมรับโดยผู้จัดส่งเปิดตัวสมาชิกที่มีค่าสมัครตรงกับที่ฉันเพิ่งลงทะเบียนในพอร์ทัลจากนั้นลบการสมัครสมาชิกที่เพิ่งสร้างในขณะที่สมาชิกยังคงทำงานอยู่
Scott Nimrod

ฉันไม่สามารถทำซ้ำปัญหาของคุณในด้านของฉันดูเหมือนว่าคุณพบพฤติกรรมที่ผิดปกติในพอร์ทัลบริการรถบัส บางทีคุณสามารถส่งตั๋วสนับสนุนไปยังทีม SB
เจย์กง

ฉันส่งตั๋วเมื่อวานนี้
Scott Nimrod

คำตอบ:


0

หากฉันเข้าใจอย่างถูกต้องว่าคุณพยายามลบหัวข้อที่มีปัญหาและสร้างมันขึ้นมาใหม่มันฟังดูคล้ายกับอาการสะอึกใน Azure คุณไม่ควรรับพฤติกรรมตามที่อธิบายไว้ข้างต้นในกรณีที่จำเป็นต้องคลิกสองครั้ง บางครั้งฉันได้สร้างสิ่งต่าง ๆ ใน Azure มีปัญหาบางอย่างที่ดาวน์สตรีมในโครงสร้างพื้นฐานและการร้องขอการสนับสนุนเป็นวิธีเดียวที่จะได้รับการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.