Чому 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 для ресурсу службової шини

Успіх із різною назвою теми

Якщо я зміню назву теми на "просив кур'єр", то примірник абонента отримує повідомлення:

[<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: введіть тут опис зображення

Клацання теми на порталі має різні результати:

Я помітив, що мені потрібно двічі клацнути "прийнято кур'єром", щоб переглянути його підписки. Однак я можу один раз натиснути "запитується кур'єром" і негайно переглянути його підписки.


1
I don't receive any exception messages, може, тому, що ви ковтаєте винятки? Я бачу with _блок після tryодного
user1623521

Я спостерігав виняток після того, як створив додаткову підписку на прийняту кур'єром тему, запустив абонента зі значенням підписки, що відповідає тому, що я тільки що зареєстрував на порталі, а потім видалив нещодавно створену підписку, поки абонент ще працює.
Скотт Німрод

Я не можу відтворити вашу проблему на моєму боці, схоже, ви зустріли ненормальну поведінку на порталі службової шини. Можливо, ви могли б подати квиток на підтримку команді СБ.
Джей Гонг

Я вчора подав квиток.
Скотт Німрод

Відповіді:


0

Якщо я правильно розумію, що ви спробували видалити проблемну тему і відтворити її, це звучить для мене як гикавка в Azure. Ви не повинні отримувати описану вище поведінку, коли потрібно натиснути двічі. Іноді я створюю речі в Azure, в їхній інфраструктурі десь є проблема, і запит на підтримку - єдиний спосіб вирішити її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.