当具有服务总线队列的辅助角色完成其处理时,您如何通知?

时间:2017-03-14 21:41:56

标签: c# azure azure-worker-roles servicebus

我正在尝试使用带有Service Bus队列的Azure WorkerRoles创建一个微服务并让它工作,但我不知道从哪里开始。

目前,我能够连接到WorkerRole并使用我想要OCR的图像的URI发送Brokered消息,并且我能够在图像上运行OCR,但是如何返回到客户端OCR已完成并且提取的文本是异步的吗?

这是我对Client.OnMessage的实现

Client.OnMessage((receivedMessage) =>
{
    try
    {
        MyServiceBusMessage messageBody = receivedMessage.GetBody<MyServiceBusMessage>();

        // Process the message
        Trace.WriteLine("Processing Service Bus message: " + receivedMessage.SequenceNumber.ToString());
        Trace.WriteLine("Service Bus message ID: " + messageBody.ID);
        Trace.WriteLine("Service Bus message Type: " + messageBody.Type);
        Trace.WriteLine("Service Bus message Image Name: " + messageBody.ImageUri);

        Uri imageURi = messageBody.ImageUri;
        Guid imageGuid = messageBody.ID;

        receivedMessage.Complete();

        string text = DoOCR(imageGuid, imageURi);
    }
    catch(Exception ex)
    {
        receivedMessage.DeadLetter("Exception Occured", ex.Message);
        // Handle any message processing specific exceptions here
    }
});

但是现在我不知道从哪里开始,我在网上找不到任何有用的东西,所以我想知道是否有人有任何关于下一步的想法或提示。

目前我正在使用控制台应用程序将消息发送到队列,如下所示:

QueueClient client = QueueClient.CreateFromConnectionString(constr, queueName);
using (var bMessage = new BrokeredMessage(message))
{
    client.Send(bMessage);
}

我可以将消息发送回客户端,让它知道OCR已完成提取的文本吗?如果是这样,我将如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您描述的场景听起来像是典型的Request/Reply模式。 您可以拥有控制台应用程序将侦听的另一个队列,以及工作者角色在完成时发送消息,包括状态和原始映像ID。

您还可以查看框架,以便更轻松地实现您的目标。看看NServiceBus或MassTransit。两者都支持不同的传输,Azure Service Bus就是其中之一。

附注:我注意到你在OCR工作之前完成了你的消息。您可能想要更改它并在OCR调用完成后完成消息。目前,如果DoOCR()抛出,您的邮件将永远不会被重试,因为它将被标记为已完成。