0

我正在使用 Azure 服务总线在我的两个 .Net 核心 Web API 应用程序之间进行消息传递。通过使用 topicClient,我可以将消息发送到 ABS。但是,在使用订阅客户端接收消息时,我遇到了这个问题。

ProcessMessagesAsync - 在我给出“Console.Read();”之前方法不会触发 . 我不能给出这个,因为我使用的是 Web API。

否则,我可以触发这个 ProcessMessagesAsync 方法- 它完美地阅读了我的消息。

提前致谢。

    public async Task GetMessageFromSubscription()
        {

        subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, TopicName, SubscriptionName);

                RegisterOnMessageHandlerAndReceiveMessages();
                //  Console.Read();  ------- Without this line 

                await subscriptionClient.CloseAsync();
           }

 public void RegisterOnMessageHandlerAndReceiveMessages()
        {
            var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler);
            subscriptionClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);
         }


        private async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
               var messageBody = Encoding.UTF8.GetString(message.Body);
                var serviceBusMessage = JsonConvert.DeserializeObject<WorkIntakeItem>(messageBody);
                await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

         }

4

1 回答 1

1

这是一个随着进程运行而运行的循环。当进程结束时,处理程序将被终止。

如果您有持续的消息流,则处理程序(又名消息泵)是一个合适的选择。如果您只需要接收一条消息并退出,那么可以使用 Message 的阻止选项MessageReceiver.ReceiveAsync。您可以控制应用程序何时关闭。

static IMessageReceiver messageReceiver;
RegisterOnMessageHandlerAndReceiveMessages();
Message message = await messageReceiver.ReceiveAsync();
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
await messageReceiver.CloseAsync();
await subscriptionClient.CloseAsync();

更多细节,你可以参考这篇文章

于 2020-04-17T08:40:59.933 回答