Dlaczego RegisterMessageHandler nie działa dla określonej nazwy tematu?

9

Nie rozumiem, dlaczego następujący moduł obsługi ( processMessageAsync ), o którym mowa poniżej, nie jest uruchamiany dla określonej nazwy tematu, ale udaje się dla innych nazw tematów:

subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)

Oto moja klasa subskrybentów :

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
        }

Oto jak próbuję uruchomić subskrybenta :

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 

Poniższy kod publikuje komunikat, który mój subskrybent powinien otrzymać (ale tego nie robi):

[<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
    }

UWAGA:

Interesujące w powyższym kodzie jest to, że gdy mam funkcję platformy Azure z ServiceBusTrigger ustawionym na ten sam temat i nazwę subskrypcji, funkcja platformy Azure jest uruchamiana za każdym razem, gdy uruchamiam test.

  • Nie otrzymuję żadnych komunikatów o wyjątkach
  • exceptionReceivedHandler funkcja nie jest wyzwalany na mój przykład Subscriber
  • Nie widzę żadnych błędów użytkownika na moim pulpicie nawigacyjnym platformy Azure dla zasobu servicebus

Udaje się z inną nazwą tematu

Jeśli zmienię nazwę tematu na „kurier-żądanie”, wówczas subskrybent otrzymuje komunikaty:

[<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
    }

Oto subskrypcja z dostosowaniem nazwy tematu:

[<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

Oto dwa tematy w moim portalu Azure: wprowadź opis zdjęcia tutaj

Klikanie tematów w portalu ma różne wyniki:

Zauważyłem, że muszę dwukrotnie kliknąć „kurier zaakceptowany”, aby zobaczyć subskrypcje. Mogę jednak kliknąć raz „prośba kuriera” i od razu wyświetlić subskrypcje.

Scott Nimrod
źródło
1
I don't receive any exception messages, może dlatego, że połykasz wyjątki? Widzę with _blok po tryjednym
użytkownik1623521
Zauważyłem wyjątek po utworzeniu dodatkowej subskrypcji dla tematu akceptowanego przez kuriera, uruchomieniu subskrybenta o wartości subskrypcji odpowiadającej tej, którą właśnie zarejestrowałem w portalu, a następnie usunięciu niedawno utworzonej subskrypcji, gdy subskrybent nadal działa.
Scott Nimrod
Nie mogę odtworzyć problemu po mojej stronie, wygląda na to, że spotkałeś się z nietypowym zachowaniem w portalu magistrali usług. Może mógłbyś przesłać zgłoszenie do pomocy zespołowi SB.
Jay Gong
Wczoraj przesłałem bilet.
Scott Nimrod

Odpowiedzi:

0

Jeśli dobrze rozumiem, że próbowałeś usunąć problematyczny temat i odtworzyć go, to brzmi dla mnie jak czkawka na platformie Azure. Nie powinieneś otrzymywać opisanego powyżej zachowania, w którym należy dwukrotnie kliknąć. Czasami tworzyłem rzeczy na platformie Azure, gdzieś w dolnej części infrastruktury jest problem, a prośba o wsparcie jest jedynym sposobem na rozwiązanie tego problemu.

Jayme Edwards
źródło