Non capisco perché il seguente gestore ( processMessageAsync ) a cui si fa riferimento di seguito non venga attivato per un nome argomento specifico, ma riesca per altri nomi argomento:
subscriptionClient.RegisterMessageHandler(processMessageAsync, msgOptions)
Quanto segue è la mia classe di abbonato :
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
}
Ecco come provo a eseguire l' abbonato :
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
Il seguente codice pubblica un messaggio che il mio abbonato dovrebbe ricevere (ma non lo fa):
[<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
}
NOTA:
La cosa interessante del codice sopra riportato è che quando ho una funzione di Azure in esecuzione con un ServiceBusTrigger impostato sullo stesso argomento e nome della sottoscrizione, tale funzione di Azure viene attivata ogni volta che eseguo il test.
- Non ricevo messaggi di eccezione
- exceptionReceivedHandler non è mai stata attivata nella mia istanza del Sottoscrittore
- Non osservo alcun errore utente sul mio dashboard di Azure per la risorsa del bus di servizio
Ha successo con un nome di argomento diverso
Se cambio il nome dell'argomento in "richiesto dal corriere", l'istanza dell'abbonato riceve i messaggi:
[<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
}
Ecco l'abbonamento con la regolazione del nome argomento:
[<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
Ecco i due argomenti nel mio portale di Azure:
Facendo clic su Argomenti nel portale si ottengono risultati diversi:
Ho notato che devo fare clic su "corriere accettato" due volte solo per visualizzare i suoi abbonamenti. Tuttavia, posso fare clic una volta "richiesto dal corriere" e visualizzare immediatamente i relativi abbonamenti.
I don't receive any exception messages
, forse perché stai inghiottendo le eccezioni? Vedo unwith _
blocco dopotry
uno