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:
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.
sumber
I don't receive any exception messages
, mungkin karena Anda menelan pengecualian? Saya melihatwith _
blok setelahtry
satuJawaban:
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.
sumber