मुझे समझ में नहीं आ रहा है कि नीचे दिए गए हैंडलर ( 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 फ़ंक्शन ट्रिगर हो जाता है।
- मुझे कोई अपवाद संदेश नहीं मिला
- अपवाद सब्सक्राइबरहैंडलर फ़ंक्शन मेरे सब्सक्राइबर उदाहरण पर कभी चालू नहीं होता है
- मैं सेवा Az संसाधन के लिए अपने Azure डैशबोर्ड पर किसी भी उपयोगकर्ता की त्रुटियों का अवलोकन नहीं करता
विभिन्न विषय नाम के साथ सफल होता है
यदि मैं विषय का नाम "कूरियर-रिक्वेस्ट" में बदल देता हूं तो ग्राहक का उदाहरण संदेश प्राप्त करता है:
[<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
यहाँ मेरे एज़्योर पोर्टल में दो विषय दिए गए हैं:
पोर्टल में विषय पर क्लिक करने के अलग परिणाम हैं:
मैंने देखा कि मुझे सदस्यता लेने के लिए दो बार "कूरियर-स्वीकृत" पर क्लिक करना है। हालांकि, मैं एक बार "कूरियर-अनुरोध" पर क्लिक कर सकता हूं और तुरंत इसकी सदस्यता देख सकता हूं।
I don't receive any exception messages
, शायद इसलिए कि आप अपवादों को निगल रहे हैं? मैं एक को देखनेwith _
के बाद एक ब्लॉकtry
एक