특정 주제 이름에 대해 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
    }

노트:

위의 코드에서 흥미로운 점은 ServiceBusTrigger를 동일한 주제 및 구독 이름으로 설정하여 실행중인 Azure Function이있는 경우 테스트를 실행할 때마다 해당 Azure Function이 트리거된다는 것입니다.

  • 예외 메시지가 표시되지 않습니다
  • 구독자 인스턴스에서 exceptionReceivedHandler 함수가 트리거되지 않습니다.
  • servicebus 리소스에 대한 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 Portal의 두 가지 주제는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

포털에서 주제를 클릭하면 결과가 다릅니다.

구독을 확인하려면 "택배 수락"을 두 번 클릭해야한다는 것을 알았습니다. 그러나 "택배 요청"을 한 번 클릭하면 즉시 구독 정보를 볼 수 있습니다.


1
I don't receive any exception messages아마도 예외를 삼키고 있기 때문일까요? 내가 볼 with _후 블록을 try하나
user1623521

택배로 허용되는 주제에 대한 추가 구독을 생성하고 포털에 방금 등록한 것과 일치하는 구독 값으로 구독자를 시작한 다음 구독자가 계속 실행되는 동안 최근에 생성 된 구독을 삭제 한 후 예외가 발생했습니다.
스콧 님로드

내 문제를 재현 할 수 없습니다. 서비스 버스 포털에서 비정상적인 동작을 만난 것 같습니다. SB 팀에 지원 티켓을 제출할 수도 있습니다.
Jay Gong

어제 티켓을 제출했습니다.
Scott Nimrod

답변:


0

문제가있는 주제를 삭제하고 다시 작성하려고 시도했다는 것을 올바르게 이해하면 Azure의 딸꾹질처럼 들립니다. 위에서 설명한 동작을 두 번 클릭해야하는 동작을 수행해서는 안됩니다. 때로는 Azure에서 항목을 만들었으며 인프라의 다운 스트림에 문제가 있으며 지원 요청이 문제를 해결할 수있는 유일한 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.