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 फ़ंक्शन ट्रिगर हो जाता है।

  • मुझे कोई अपवाद संदेश नहीं मिला
  • अपवाद सब्सक्राइबरहैंडलर फ़ंक्शन मेरे सब्सक्राइबर उदाहरण पर कभी चालू नहीं होता है
  • मैं सेवा 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

यहाँ मेरे एज़्योर पोर्टल में दो विषय दिए गए हैं: यहां छवि विवरण दर्ज करें

पोर्टल में विषय पर क्लिक करने के अलग परिणाम हैं:

मैंने देखा कि मुझे सदस्यता लेने के लिए दो बार "कूरियर-स्वीकृत" पर क्लिक करना है। हालांकि, मैं एक बार "कूरियर-अनुरोध" पर क्लिक कर सकता हूं और तुरंत इसकी सदस्यता देख सकता हूं।


1
I don't receive any exception messages, शायद इसलिए कि आप अपवादों को निगल रहे हैं? मैं एक को देखने with _के बाद एक ब्लॉक tryएक
user1623521

मैंने कूरियर-स्वीकृत विषय के लिए एक अतिरिक्त सदस्यता बनाने के बाद एक अपवाद का अवलोकन किया, ग्राहक को एक सदस्यता मूल्य के साथ लॉन्च किया, जिसे मैंने अभी पोर्टल में पंजीकृत किया था, और फिर हाल ही में बनाई गई सदस्यता को हटाते हुए ग्राहक को चला रहा था।
स्कॉट निमरोड

मैं आपकी ओर से अपने मुद्दे को पुन: पेश नहीं कर सकता, ऐसा लगता है कि आप सेवा बस पोर्टल पर अप्राकृतिक व्यवहार से मिले थे। हो सकता है कि आप एसबी टीम को सपोर्ट टिकट दे सकें।
जे गोंग

मैंने कल एक टिकट जमा किया।
स्कॉट निमरोड

जवाबों:


0

अगर मैं सही ढंग से समझता हूं कि आपने समस्याग्रस्त विषय को हटाने और इसे फिर से बनाने की कोशिश की, तो यह मुझे एज़्योर में हिचकी की तरह लगता है। आपको ऊपर वर्णित व्यवहार नहीं मिलना चाहिए जहां एक को दो बार क्लिक करने की आवश्यकता होती है। कभी-कभी मैंने एज़्योर में चीजें बनाई हैं, उनके बुनियादी ढांचे में कहीं न कहीं समस्या है, और इसे हल करने के लिए एक समर्थन अनुरोध एकमात्र तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.