아래 참조 된 다음 핸들러 ( 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의 두 가지 주제는 다음과 같습니다.
포털에서 주제를 클릭하면 결과가 다릅니다.
구독을 확인하려면 "택배 수락"을 두 번 클릭해야한다는 것을 알았습니다. 그러나 "택배 요청"을 한 번 클릭하면 즉시 구독 정보를 볼 수 있습니다.
택배로 허용되는 주제에 대한 추가 구독을 생성하고 포털에 방금 등록한 것과 일치하는 구독 값으로 구독자를 시작한 다음 구독자가 계속 실행되는 동안 최근에 생성 된 구독을 삭제 한 후 예외가 발생했습니다.
—
스콧 님로드
내 문제를 재현 할 수 없습니다. 서비스 버스 포털에서 비정상적인 동작을 만난 것 같습니다. SB 팀에 지원 티켓을 제출할 수도 있습니다.
—
Jay Gong
어제 티켓을 제출했습니다.
—
Scott Nimrod
I don't receive any exception messages
아마도 예외를 삼키고 있기 때문일까요? 내가 볼with _
후 블록을try
하나