ฉันไม่เข้าใจว่าทำไมตัวจัดการต่อไปนี้ ( 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 ของฉัน:
การคลิกหัวข้อในพอร์ทัลมีผลลัพธ์ที่แตกต่าง:
ฉันสังเกตเห็นว่าฉันต้องคลิก "ยอมรับการจัดส่ง" สองครั้งเพื่อดูการสมัครรับข้อมูล อย่างไรก็ตามฉันสามารถคลิก "ผู้ขอใช้บริการจัดส่ง" หนึ่งครั้งและดูการสมัครรับข้อมูลทันที
I don't receive any exception messages
อาจเป็นเพราะคุณกำลังกลืนข้อยกเว้น? ฉันเห็นwith _
บล็อกtry
หนึ่งอัน